From: Tiwei Bie <tiwei....@intel.com>

This patch introduces an internal representation of the PCI device
which will be used to store the internal information that don't have
to be exposed, e.g. the VFIO region sizes/offsets.

In this patch, the internal structure is simply a wrapper of the
rte_pci_device structure. More fields will be added in the coming
patches.

Suggested-by: David Marchand <david.march...@redhat.com>
Signed-off-by: Tiwei Bie <tiwei....@intel.com>
Signed-off-by: Chenbo Xia <chenbo....@intel.com>
---
 drivers/bus/pci/bsd/pci.c    | 14 +++++++++-----
 drivers/bus/pci/linux/pci.c  | 27 ++++++++++++++++-----------
 drivers/bus/pci/pci_common.c |  2 +-
 drivers/bus/pci/private.h    | 12 ++++++++++++
 4 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
index 4b8a208781..20ce979f60 100644
--- a/drivers/bus/pci/bsd/pci.c
+++ b/drivers/bus/pci/bsd/pci.c
@@ -212,16 +212,20 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, 
int res_idx,
 static int
 pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
 {
+       struct rte_pci_device_internal *pdev;
        struct rte_pci_device *dev;
        struct pci_bar_io bar;
        unsigned i, max;
 
-       dev = malloc(sizeof(*dev));
-       if (dev == NULL) {
+       pdev = malloc(sizeof(*pdev));
+       if (pdev == NULL) {
+               RTE_LOG(ERR, EAL, "Cannot allocate memory for internal pci 
device\n");
                return -1;
        }
 
-       memset(dev, 0, sizeof(*dev));
+       memset(pdev, 0, sizeof(*pdev));
+
+       dev = &pdev->device;
        dev->device.bus = &rte_pci_bus.bus;
 
        dev->addr.domain = conf->pc_sel.pc_domain;
@@ -307,7 +311,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                                memmove(dev2->mem_resource,
                                        dev->mem_resource,
                                        sizeof(dev->mem_resource));
-                               free(dev);
+                               free(pdev);
                        }
                        return 0;
                }
@@ -317,7 +321,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        return 0;
 
 skipdev:
-       free(dev);
+       free(pdev);
        return 0;
 }
 
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 0dc99e9cb2..6dbba10657 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -218,22 +218,27 @@ pci_scan_one(const char *dirname, const struct 
rte_pci_addr *addr)
 {
        char filename[PATH_MAX];
        unsigned long tmp;
+       struct rte_pci_device_internal *pdev;
        struct rte_pci_device *dev;
        char driver[PATH_MAX];
        int ret;
 
-       dev = malloc(sizeof(*dev));
-       if (dev == NULL)
+       pdev = malloc(sizeof(*pdev));
+       if (pdev == NULL) {
+               RTE_LOG(ERR, EAL, "Cannot allocate memory for internal pci 
device\n");
                return -1;
+       }
+
+       memset(pdev, 0, sizeof(*pdev));
 
-       memset(dev, 0, sizeof(*dev));
+       dev = &pdev->device;
        dev->device.bus = &rte_pci_bus.bus;
        dev->addr = *addr;
 
        /* get vendor id */
        snprintf(filename, sizeof(filename), "%s/vendor", dirname);
        if (eal_parse_sysfs_value(filename, &tmp) < 0) {
-               free(dev);
+               free(pdev);
                return -1;
        }
        dev->id.vendor_id = (uint16_t)tmp;
@@ -241,7 +246,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        /* get device id */
        snprintf(filename, sizeof(filename), "%s/device", dirname);
        if (eal_parse_sysfs_value(filename, &tmp) < 0) {
-               free(dev);
+               free(pdev);
                return -1;
        }
        dev->id.device_id = (uint16_t)tmp;
@@ -250,7 +255,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        snprintf(filename, sizeof(filename), "%s/subsystem_vendor",
                 dirname);
        if (eal_parse_sysfs_value(filename, &tmp) < 0) {
-               free(dev);
+               free(pdev);
                return -1;
        }
        dev->id.subsystem_vendor_id = (uint16_t)tmp;
@@ -259,7 +264,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        snprintf(filename, sizeof(filename), "%s/subsystem_device",
                 dirname);
        if (eal_parse_sysfs_value(filename, &tmp) < 0) {
-               free(dev);
+               free(pdev);
                return -1;
        }
        dev->id.subsystem_device_id = (uint16_t)tmp;
@@ -268,7 +273,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        snprintf(filename, sizeof(filename), "%s/class",
                 dirname);
        if (eal_parse_sysfs_value(filename, &tmp) < 0) {
-               free(dev);
+               free(pdev);
                return -1;
        }
        /* the least 24 bits are valid: class, subclass, program interface */
@@ -308,7 +313,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        snprintf(filename, sizeof(filename), "%s/resource", dirname);
        if (pci_parse_sysfs_resource(filename, dev) < 0) {
                RTE_LOG(ERR, EAL, "%s(): cannot parse resource\n", __func__);
-               free(dev);
+               free(pdev);
                return -1;
        }
 
@@ -317,7 +322,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
        ret = pci_get_kernel_driver_by_path(filename, driver, sizeof(driver));
        if (ret < 0) {
                RTE_LOG(ERR, EAL, "Fail to get kernel driver\n");
-               free(dev);
+               free(pdev);
                return -1;
        }
 
@@ -386,7 +391,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
                                                pci_name_set(dev2);
                                        }
                                }
-                               free(dev);
+                               free(pdev);
                        }
                        return 0;
                }
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index ee7f966358..1c368c254c 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -571,7 +571,7 @@ pci_unplug(struct rte_device *dev)
        if (ret == 0) {
                rte_pci_remove_device(pdev);
                rte_devargs_remove(dev->devargs);
-               free(pdev);
+               free(RTE_PCI_DEVICE_INTERNAL(pdev));
        }
        return ret;
 }
diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h
index 4cd9d14ec7..49a29d45cf 100644
--- a/drivers/bus/pci/private.h
+++ b/drivers/bus/pci/private.h
@@ -12,11 +12,23 @@
 #include <rte_os_shim.h>
 #include <rte_pci.h>
 
+/*
+ * Convert struct rte_pci_device to struct rte_pci_device_internal
+ */
+#define RTE_PCI_DEVICE_INTERNAL(ptr) \
+       container_of(ptr, struct rte_pci_device_internal, device)
+#define RTE_PCI_DEVICE_INTERNAL_CONST(ptr) \
+       container_of(ptr, const struct rte_pci_device_internal, device)
+
 extern struct rte_pci_bus rte_pci_bus;
 
 struct rte_pci_driver;
 struct rte_pci_device;
 
+struct rte_pci_device_internal {
+       struct rte_pci_device device;
+};
+
 /**
  * Scan the content of the PCI bus, and the devices in the devices
  * list
-- 
2.17.1

Reply via email to