Generalize the pci_vfio_get_group_no to not be PCI-specific. Move the general
implementation to the eal_vfio.c as vfio_get_group_no and leave the original
pci_vfio_get_group_no being a wrapper around this to preserve compilation
issues. The pci_vfio_get_group_no function will be removed later.

Signed-off-by: Jan Viktorin <viktorin at rehivetech.com>
---
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 38 +-------------------------
 lib/librte_eal/linuxapp/eal/eal_vfio.c     | 43 ++++++++++++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/eal_vfio.h     |  7 +++++
 3 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c 
b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
index 528479a..c2ff465 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
@@ -401,43 +401,7 @@ pci_vfio_get_group_fd(int iommu_group_no)
 static int
 pci_vfio_get_group_no(const char *pci_addr, int *iommu_group_no)
 {
-       char linkname[PATH_MAX];
-       char filename[PATH_MAX];
-       char *tok[16], *group_tok, *end;
-       int ret;
-
-       memset(linkname, 0, sizeof(linkname));
-       memset(filename, 0, sizeof(filename));
-
-       /* try to find out IOMMU group for this device */
-       snprintf(linkname, sizeof(linkname),
-                        "%s/%s/iommu_group", pci_get_sysfs_path(), pci_addr);
-
-       ret = readlink(linkname, filename, sizeof(filename));
-
-       /* if the link doesn't exist, no VFIO for us */
-       if (ret < 0)
-               return 0;
-
-       ret = rte_strsplit(filename, sizeof(filename),
-                       tok, RTE_DIM(tok), '/');
-
-       if (ret <= 0) {
-               RTE_LOG(ERR, EAL, "  %s cannot get IOMMU group\n", pci_addr);
-               return -1;
-       }
-
-       /* IOMMU group is always the last token */
-       errno = 0;
-       group_tok = tok[ret - 1];
-       end = group_tok;
-       *iommu_group_no = strtol(group_tok, &end, 10);
-       if ((end != group_tok && *end != '\0') || errno != 0) {
-               RTE_LOG(ERR, EAL, "  %s error parsing IOMMU number!\n", 
pci_addr);
-               return -1;
-       }
-
-       return 1;
+       return vfio_get_group_no(pci_get_sysfs_path(), pci_addr, 
iommu_group_no);
 }

 static void
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c 
b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index 5660ddd..2bf810e 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -165,6 +165,49 @@ vfio_get_container_fd(void)
 }

 int
+vfio_get_group_no(const char *sysfs_base,
+               const char *dev_addr, int *iommu_group_no)
+{
+       char linkname[PATH_MAX];
+       char filename[PATH_MAX];
+       char *tok[16], *group_tok, *end;
+       int ret;
+
+       memset(linkname, 0, sizeof(linkname));
+       memset(filename, 0, sizeof(filename));
+
+       /* try to find out IOMMU group for this device */
+       snprintf(linkname, sizeof(linkname),
+                        "%s/%s/iommu_group", sysfs_base, dev_addr);
+
+       ret = readlink(linkname, filename, sizeof(filename));
+
+       /* if the link doesn't exist, no VFIO for us */
+       if (ret < 0)
+               return 0;
+
+       ret = rte_strsplit(filename, sizeof(filename),
+                       tok, RTE_DIM(tok), '/');
+
+       if (ret <= 0) {
+               RTE_LOG(ERR, EAL, "  %s cannot get IOMMU group\n", dev_addr);
+               return -1;
+       }
+
+       /* IOMMU group is always the last token */
+       errno = 0;
+       group_tok = tok[ret - 1];
+       end = group_tok;
+       *iommu_group_no = strtol(group_tok, &end, 10);
+       if ((end != group_tok && *end != '\0') || errno != 0) {
+               RTE_LOG(ERR, EAL, "  %s error parsing IOMMU number!\n", 
dev_addr);
+               return -1;
+       }
+
+       return 1;
+}
+
+int
 vfio_type1_dma_map(int vfio_container_fd)
 {
        const struct rte_memseg *ms = rte_eal_get_physmem_layout();
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.h 
b/lib/librte_eal/linuxapp/eal/eal_vfio.h
index 0fb05a4..619cd6b 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.h
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.h
@@ -119,6 +119,13 @@ vfio_has_supported_extensions(int vfio_container_fd);
 int
 vfio_get_container_fd(void);

+/* parse IOMMU group number for a device
+ * returns 1 on success, -1 for errors, 0 for non-existent group
+ */
+int
+vfio_get_group_no(const char *sysfs_base,
+               const char *dev_addr, int *iommu_group_no);
+
 #define SOCKET_REQ_CONTAINER 0x100
 #define SOCKET_REQ_GROUP 0x200
 #define SOCKET_OK 0x0
-- 
2.8.0

Reply via email to