mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
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:
parent
134c3ddb43
commit
1597e155b2
@ -3076,6 +3076,7 @@ virGetUserName;
|
||||
virGetUserRuntimeDirectory;
|
||||
virGetUserShell;
|
||||
virHexToBin;
|
||||
virHostHasIOMMU;
|
||||
virIndexToDiskName;
|
||||
virIsDevMapperDevice;
|
||||
virIsSUID;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user