qemu: hostdev: Move parts of qemuHostdevHostSupportsPassthroughVFIO() into separate function

Signed-off-by: Filip Alac <filipalac@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Filip Alac 2018-06-01 10:15:58 +02:00 committed by Michal Privoznik
parent 134c3ddb43
commit 1597e155b2
4 changed files with 33 additions and 24 deletions

View File

@ -3076,6 +3076,7 @@ virGetUserName;
virGetUserRuntimeDirectory;
virGetUserShell;
virHexToBin;
virHostHasIOMMU;
virIndexToDiskName;
virIsDevMapperDevice;
virIsSUID;

View File

@ -23,7 +23,6 @@
#include <config.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
@ -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;
}

View File

@ -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;
}

View File

@ -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)