diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 059229ff70..9b9970163f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3076,6 +3076,7 @@ virGetUserName; virGetUserRuntimeDirectory; virGetUserShell; virHexToBin; +virHostHasIOMMU; virIndexToDiskName; virIsDevMapperDevice; virIsSUID; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 955b5df1a3..1e040f98b7 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -23,7 +23,6 @@ #include -#include #include #include #include @@ -124,33 +123,15 @@ qemuHostdevUpdateActiveDomainDevices(virQEMUDriverPtr driver, bool qemuHostdevHostSupportsPassthroughVFIO(void) { - DIR *iommuDir = NULL; - struct dirent *iommuGroup = NULL; - bool ret = false; - int direrr; - - /* condition 1 - /sys/kernel/iommu_groups/ contains entries */ - if (virDirOpenQuiet(&iommuDir, "/sys/kernel/iommu_groups/") < 0) - goto cleanup; - - while ((direrr = virDirRead(iommuDir, &iommuGroup, NULL)) > 0) { - /* assume we found a group */ - break; - } - - if (direrr < 0 || !iommuGroup) - goto cleanup; - /* okay, iommu is on and recognizes groups */ + /* condition 1 - host has IOMMU */ + if (!virHostHasIOMMU()) + return false; /* condition 2 - /dev/vfio/vfio exists */ if (!virFileExists("/dev/vfio/vfio")) - goto cleanup; + return false; - ret = true; - - cleanup: - VIR_DIR_CLOSE(iommuDir); - return ret; + return true; } diff --git a/src/util/virutil.c b/src/util/virutil.c index bb4474acd5..a908422feb 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -2090,3 +2090,28 @@ virMemoryMaxValue(bool capped) else return LLONG_MAX; } + + +bool +virHostHasIOMMU(void) +{ + DIR *iommuDir = NULL; + struct dirent *iommuGroup = NULL; + bool ret = false; + int direrr; + + if (virDirOpenQuiet(&iommuDir, "/sys/kernel/iommu_groups/") < 0) + goto cleanup; + + while ((direrr = virDirRead(iommuDir, &iommuGroup, NULL)) > 0) + break; + + if (direrr < 0 || !iommuGroup) + goto cleanup; + + ret = true; + + cleanup: + VIR_DIR_CLOSE(iommuDir); + return ret; +} diff --git a/src/util/virutil.h b/src/util/virutil.h index be0f6b0ea8..1ba9635bd9 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -216,6 +216,8 @@ unsigned long long virMemoryLimitTruncate(unsigned long long value); bool virMemoryLimitIsSet(unsigned long long value); unsigned long long virMemoryMaxValue(bool ulong) ATTRIBUTE_NOINLINE; +bool virHostHasIOMMU(void); + /** * VIR_ASSIGN_IS_OVERFLOW: * @rvalue: value that is checked (evaluated twice)