This serves a similar purpose to virPCIDeviceAddressIOMMUGroupIterate, but uses the iommu group number to find matches instead of a device within the group. We refactor the code to use this new function and also export it for use in subsequent patches.
Signed-off-by: Michael Roth <mdr...@linux.vnet.ibm.com> --- src/util/virpci.c | 42 ++++++++++++++++++++++++++++++------------ src/util/virpci.h | 3 +++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/util/virpci.c b/src/util/virpci.c index 2c1b758..b842f44 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -49,6 +49,7 @@ VIR_LOG_INIT("util.pci"); #define PCI_SYSFS "/sys/bus/pci/" +#define IOMMU_GROUP_SYSFS "/sys/kernel/iommu_groups/" #define PCI_ID_LEN 10 /* "XXXX XXXX" */ #define PCI_ADDR_LEN 13 /* "XXXX:XX:XX.X" */ @@ -2178,16 +2179,13 @@ int virPCIDeviceFileIterate(virPCIDevicePtr dev, return ret; } - -/* virPCIDeviceAddressIOMMUGroupIterate: - * Call @actor for all devices in the same iommu_group as orig - * (including orig itself) Even if there is no iommu_group for the - * device, call @actor once for orig. +/* virPCIIOMMUGroupIterate: + * Call @actor for all devices in a particular iommu_group. */ int -virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, - virPCIDeviceAddressActor actor, - void *opaque) +virPCIIOMMUGroupIterate(int iommu_group, + virPCIDeviceAddressActor actor, + void *opaque) { char *groupPath = NULL; DIR *groupDir = NULL; @@ -2196,13 +2194,11 @@ virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, int direrr; if (virAsprintf(&groupPath, - PCI_SYSFS "devices/%04x:%02x:%02x.%x/iommu_group/devices", - orig->domain, orig->bus, orig->slot, orig->function) < 0) + IOMMU_GROUP_SYSFS "%d/devices", + iommu_group) < 0) goto cleanup; if (virDirOpenQuiet(&groupDir, groupPath) < 0) { - /* just process the original device, nothing more */ - ret = (actor)(orig, opaque); goto cleanup; } @@ -2230,6 +2226,28 @@ virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, return ret; } +/* virPCIDeviceAddressIOMMUGroupIterate: + * Call @actor for all devices in the same iommu_group as orig + * (including orig itself) Even if there is no iommu_group for the + * device, call @actor once for orig. + */ +int +virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, + virPCIDeviceAddressActor actor, + void *opaque) +{ + int ret = -1; + + ret = virPCIIOMMUGroupIterate(virPCIDeviceAddressGetIOMMUGroupNum(orig), + actor, opaque); + if (ret < 0) { + /* just process the original device, nothing more */ + ret = (actor)(orig, opaque); + } + + return ret; +} + static int virPCIDeviceGetIOMMUGroupAddOne(virPCIDeviceAddressPtr newDevAddr, void *opaque) diff --git a/src/util/virpci.h b/src/util/virpci.h index 570684e..5ec1306 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -176,6 +176,9 @@ typedef int (*virPCIDeviceAddressActor)(virPCIDeviceAddressPtr addr, int virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, virPCIDeviceAddressActor actor, void *opaque); +int virPCIIOMMUGroupIterate(int iommu_group, + virPCIDeviceAddressActor actor, + void *opaque); virPCIDeviceListPtr virPCIDeviceGetIOMMUGroupList(virPCIDevicePtr dev); int virPCIDeviceAddressGetIOMMUGroupAddresses(virPCIDeviceAddressPtr devAddr, virPCIDeviceAddressPtr **iommuGroupDevices, -- 2.7.4