[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 1/8] 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        | 34 ++++++++++++++++++++++++++++++++++
 src/util/virpci.h        |  2 ++
 3 files changed, 37 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 33ec379..2a2c40e 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 73f36d0..673568f 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -1726,6 +1726,40 @@ 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", basename(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 db0be35..3911b72 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);
-- 
1.7.11.7


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]