vfio: generalize process synchronization
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal_pci.c
index 5041228..d0a6481 100644 (file)
@@ -190,12 +190,13 @@ pci_find_max_end_va(void)
        return RTE_PTR_ADD(last->addr, last->len);
 }
 
-/* parse the "resource" sysfs file */
-static int
-pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev)
+/* parse one line of the "resource" sysfs file (note that the 'line'
+ * string is modified)
+ */
+int
+pci_parse_one_sysfs_resource(char *line, size_t len, uint64_t *phys_addr,
+       uint64_t *end_addr, uint64_t *flags)
 {
-       FILE *f;
-       char buf[BUFSIZ];
        union pci_resource_info {
                struct {
                        char *phys_addr;
@@ -204,6 +205,31 @@ pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev)
                };
                char *ptrs[PCI_RESOURCE_FMT_NVAL];
        } res_info;
+
+       if (rte_strsplit(line, len, res_info.ptrs, 3, ' ') != 3) {
+               RTE_LOG(ERR, EAL,
+                       "%s(): bad resource format\n", __func__);
+               return -1;
+       }
+       errno = 0;
+       *phys_addr = strtoull(res_info.phys_addr, NULL, 16);
+       *end_addr = strtoull(res_info.end_addr, NULL, 16);
+       *flags = strtoull(res_info.flags, NULL, 16);
+       if (errno != 0) {
+               RTE_LOG(ERR, EAL,
+                       "%s(): bad resource format\n", __func__);
+               return -1;
+       }
+
+       return 0;
+}
+
+/* parse the "resource" sysfs file */
+static int
+pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev)
+{
+       FILE *f;
+       char buf[BUFSIZ];
        int i;
        uint64_t phys_addr, end_addr, flags;
 
@@ -220,21 +246,9 @@ pci_parse_sysfs_resource(const char *filename, struct rte_pci_device *dev)
                                "%s(): cannot read resource\n", __func__);
                        goto error;
                }
-
-               if (rte_strsplit(buf, sizeof(buf), res_info.ptrs, 3, ' ') != 3) {
-                       RTE_LOG(ERR, EAL,
-                               "%s(): bad resource format\n", __func__);
-                       goto error;
-               }
-               errno = 0;
-               phys_addr = strtoull(res_info.phys_addr, NULL, 16);
-               end_addr = strtoull(res_info.end_addr, NULL, 16);
-               flags = strtoull(res_info.flags, NULL, 16);
-               if (errno != 0) {
-                       RTE_LOG(ERR, EAL,
-                               "%s(): bad resource format\n", __func__);
+               if (pci_parse_one_sysfs_resource(buf, sizeof(buf), &phys_addr,
+                               &end_addr, &flags) < 0)
                        goto error;
-               }
 
                if (flags & IORESOURCE_MEM) {
                        dev->mem_resource[i].phys_addr = phys_addr;
@@ -306,6 +320,16 @@ pci_scan_one(const char *dirname, uint16_t domain, uint8_t bus,
        }
        dev->id.subsystem_device_id = (uint16_t)tmp;
 
+       /* get class_id */
+       snprintf(filename, sizeof(filename), "%s/class",
+                dirname);
+       if (eal_parse_sysfs_value(filename, &tmp) < 0) {
+               free(dev);
+               return -1;
+       }
+       /* the least 24 bits are valid: class, subclass, program interface */
+       dev->id.class_id = (uint32_t)tmp & RTE_CLASS_ANY_ID;
+
        /* get max_vfs */
        dev->max_vfs = 0;
        snprintf(filename, sizeof(filename), "%s/max_vfs", dirname);
@@ -742,7 +766,7 @@ rte_eal_pci_init(void)
                 * VFIO container.
                 */
                if (internal_config.process_type == RTE_PROC_PRIMARY &&
-                               pci_vfio_mp_sync_setup() < 0)
+                               vfio_mp_sync_setup() < 0)
                        return -1;
        }
 #endif