[libvirt] [PATCH 1/4] pci: Add two new pci utils pciDeviceGetVirtualFunctionInfo and pciConfigAddressToSysfsFile

Roopa Prabhu roprabhu at cisco.com
Mon Mar 5 03:15:26 UTC 2012


From: Roopa Prabhu <roprabhu at cisco.com>

pciDeviceGetVirtualFunctionInfo returns pf netdevice name and virtual
function index for a given vf. This is just a wrapper around existing functions
to return vf's pf and vf_index with one api call

pciConfigAddressToSysfsfile returns the sysfile pci device link
from a 'struct pci_config_address'

Signed-off-by: Roopa Prabhu <roprabhu at cisco.com>
---
 src/util/pci.c |   55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/util/pci.h |    7 +++++++
 2 files changed, 62 insertions(+), 0 deletions(-)


diff --git a/src/util/pci.c b/src/util/pci.c
index c660e8d..d8c136e 100644
--- a/src/util/pci.c
+++ b/src/util/pci.c
@@ -2081,6 +2081,20 @@ pciSysfsFile(char *pciDeviceName, char **pci_sysfs_device_link)
     return 0;
 }
 
+int
+pciConfigAddressToSysfsFile(struct pci_config_address *dev,
+                            char **pci_sysfs_device_link)
+{
+    if (virAsprintf(pci_sysfs_device_link,
+                    PCI_SYSFS "devices/%04x:%02x:%02x.%x", dev->domain,
+                    dev->bus, dev->slot, dev->function) < 0) {
+        virReportOOMError();
+        return -1;
+    }
+
+    return 0;
+}
+
 /*
  * Returns the network device name of a pci device
  */
@@ -2123,6 +2137,38 @@ out:
 
      return ret;
 }
+
+int
+pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
+                                char **pfname, int *vf_index)
+{
+    struct pci_config_address *pf_config_address = NULL;
+    char *pf_sysfs_device_path = NULL;
+    int ret = -1;
+
+    if (pciGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0)
+        return ret;
+
+    if (pciConfigAddressToSysfsFile(pf_config_address,
+                                    &pf_sysfs_device_path) < 0) {
+
+        VIR_FREE(pf_config_address);
+        return ret;
+    }
+
+    if (pciGetVirtualFunctionIndex(pf_sysfs_device_path, vf_sysfs_device_path,
+        vf_index) < 0)
+        goto cleanup;
+
+    ret = pciDeviceNetName(pf_sysfs_device_path, pfname);
+
+cleanup:
+    VIR_FREE(pf_config_address);
+    VIR_FREE(pf_sysfs_device_path);
+
+    return ret;
+}
+
 #else
 int
 pciGetPhysicalFunction(const char *vf_sysfs_path ATTRIBUTE_UNUSED,
@@ -2170,4 +2216,13 @@ pciDeviceNetName(char *device_link_sysfs_path ATTRIBUTE_UNUSED,
                    "supported on non-linux platforms"));
     return -1;
 }
+
+int
+pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
+                                char **pfname, int *vf_index)
+{
+    pciReportError(VIR_ERR_INTERNAL_ERROR, _("pciDeviceGetVirtualFunctionInfo "
+                   "is not supported on non-linux platforms"));
+    return -1;
+}
 #endif /* __linux__ */
diff --git a/src/util/pci.h b/src/util/pci.h
index 25b5b66..b71bb12 100644
--- a/src/util/pci.h
+++ b/src/util/pci.h
@@ -111,6 +111,9 @@ int pciGetVirtualFunctionIndex(const char *pf_sysfs_device_link,
                                const char *vf_sysfs_device_link,
                                int *vf_index);
 
+int pciConfigAddressToSysfsFile(struct pci_config_address *dev,
+                                char **pci_sysfs_device_link);
+
 int pciDeviceNetName(char *device_link_sysfs_path, char **netname);
 
 int pciSysfsFile(char *pciDeviceName, char **pci_sysfs_device_link)
@@ -122,4 +125,8 @@ int pciGetDeviceAddrString(unsigned domain,
                            unsigned function,
                            char **pciConfigAddr)
     ATTRIBUTE_NONNULL(5) ATTRIBUTE_RETURN_CHECK;
+
+int pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
+                                    char **pfname, int *vf_index);
+
 #endif /* __VIR_PCI_H__ */




More information about the libvir-list mailing list