From b210208f97a7af627570a656e0c334c2cf57b770 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Thu, 25 Apr 2013 06:34:43 -0400 Subject: [PATCH] util: new function virPCIDeviceGetVFIOGroupDev Given a virPCIDevice, this function returns the path for the device that controls the vfio group the device belongs to, e.g. "/dev/vfio/15". --- src/libvirt_private.syms | 1 + src/util/virpci.c | 35 +++++++++++++++++++++++++++++++++++ src/util/virpci.h | 2 ++ 3 files changed, 38 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 33ec37973d..2a2c40eb3a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1609,6 +1609,7 @@ virPCIDeviceGetReprobe; virPCIDeviceGetStubDriver; virPCIDeviceGetUnbindFromStub; virPCIDeviceGetUsedBy; +virPCIDeviceGetVFIOGroupDev; virPCIDeviceIsAssignable; virPCIDeviceListAdd; virPCIDeviceListCount; diff --git a/src/util/virpci.c b/src/util/virpci.c index 805406b564..97bba74a38 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -1727,6 +1727,41 @@ cleanup: return ret; } +/* virPCIDeviceGetVFIOGroupDev - return the name of the device used to + * control this PCI device's group (e.g. "/dev/vfio/15") + */ +char * +virPCIDeviceGetVFIOGroupDev(virPCIDevicePtr dev) +{ + char *devPath = NULL; + char *groupPath = NULL; + char *groupDev = NULL; + + if (virPCIFile(&devPath, dev->name, "iommu_group") < 0) + goto cleanup; + if (virFileIsLink(devPath) != 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid device %s iommu_group file %s is not a symlink"), + dev->name, devPath); + goto cleanup; + } + if (virFileResolveLink(devPath, &groupPath) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unable to resolve device %s iommu_group symlink %s"), + dev->name, devPath); + goto cleanup; + } + if (virAsprintf(&groupDev, "/dev/vfio/%s", + last_component(groupPath)) < 0) { + virReportOOMError(); + goto cleanup; + } +cleanup: + VIR_FREE(devPath); + VIR_FREE(groupPath); + return groupDev; +} + static int virPCIDeviceDownstreamLacksACS(virPCIDevicePtr dev) { diff --git a/src/util/virpci.h b/src/util/virpci.h index db0be35990..3911b72359 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -111,6 +111,8 @@ typedef int (*virPCIDeviceFileActor)(virPCIDevicePtr dev, int virPCIDeviceFileIterate(virPCIDevicePtr dev, virPCIDeviceFileActor actor, void *opaque); +char * +virPCIDeviceGetVFIOGroupDev(virPCIDevicePtr dev); int virPCIDeviceIsAssignable(virPCIDevicePtr dev, int strict_acs_check); -- GitLab