Move device list from bus-specific structures to the common rte_bus
structure and remove unnecessary wrapper functions. This eliminates
code duplication across bus drivers.

Remove device_list from bus-specific structures and their wrapper
functions (e.g., rte_pci_add_device), using EAL helpers
(rte_bus_add_device, rte_bus_remove_device, rte_bus_insert_device)
directly instead. Remove custom iteration macros (FOREACH_DEVICE_ON_*)
and use standard TAILQ_FOREACH with rte_device* and RTE_BUS_DEVICE
macro.

Signed-off-by: David Marchand <[email protected]>
---
 drivers/bus/auxiliary/auxiliary_common.c     | 47 ++++------------
 drivers/bus/auxiliary/bus_auxiliary_driver.h |  1 -
 drivers/bus/auxiliary/linux/auxiliary.c      |  7 +--
 drivers/bus/auxiliary/private.h              | 20 -------
 drivers/bus/cdx/bus_cdx_driver.h             |  1 -
 drivers/bus/cdx/cdx.c                        | 44 ++++-----------
 drivers/bus/cdx/private.h                    |  1 -
 drivers/bus/dpaa/bus_dpaa_driver.h           |  1 -
 drivers/bus/dpaa/dpaa_bus.c                  | 51 +++++++----------
 drivers/bus/fslmc/bus_fslmc_driver.h         |  1 -
 drivers/bus/fslmc/fslmc_bus.c                | 52 ++++++++---------
 drivers/bus/fslmc/fslmc_vfio.c               | 45 +++++++--------
 drivers/bus/fslmc/portal/dpaa2_hw_dprc.c     |  4 +-
 drivers/bus/fslmc/private.h                  |  2 -
 drivers/bus/ifpga/bus_ifpga_driver.h         |  1 -
 drivers/bus/ifpga/ifpga_bus.c                | 28 ++++------
 drivers/bus/pci/bsd/pci.c                    | 12 ++--
 drivers/bus/pci/bus_pci_driver.h             |  1 -
 drivers/bus/pci/linux/pci.c                  | 12 ++--
 drivers/bus/pci/pci_common.c                 | 55 +++++-------------
 drivers/bus/pci/private.h                    | 30 ----------
 drivers/bus/pci/windows/pci.c                | 12 ++--
 drivers/bus/platform/bus_platform_driver.h   |  1 -
 drivers/bus/platform/platform.c              | 32 +++++------
 drivers/bus/platform/private.h               |  5 --
 drivers/bus/uacce/bus_uacce_driver.h         |  1 -
 drivers/bus/uacce/uacce.c                    | 34 +++++------
 drivers/bus/vdev/bus_vdev_driver.h           |  1 -
 drivers/bus/vdev/vdev.c                      | 45 +++++++--------
 drivers/bus/vmbus/bus_vmbus_driver.h         |  1 -
 drivers/bus/vmbus/linux/vmbus_bus.c          |  7 +--
 drivers/bus/vmbus/private.h                  | 10 ----
 drivers/bus/vmbus/vmbus_common.c             | 41 +++-----------
 drivers/dma/idxd/idxd_bus.c                  | 21 ++-----
 lib/eal/common/eal_common_bus.c              | 27 +++++++++
 lib/eal/include/bus_driver.h                 | 59 ++++++++++++++++++++
 36 files changed, 286 insertions(+), 427 deletions(-)

diff --git a/drivers/bus/auxiliary/auxiliary_common.c 
b/drivers/bus/auxiliary/auxiliary_common.c
index 7e2d832dda..a1a3a747a5 100644
--- a/drivers/bus/auxiliary/auxiliary_common.c
+++ b/drivers/bus/auxiliary/auxiliary_common.c
@@ -198,7 +198,7 @@ auxiliary_probe(void)
        size_t probed = 0, failed = 0;
        int ret = 0;
 
-       FOREACH_DEVICE_ON_AUXILIARY_BUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &auxiliary_bus.bus) {
                probed++;
 
                ret = auxiliary_probe_all_drivers(dev);
@@ -251,45 +251,21 @@ rte_auxiliary_unregister(struct rte_auxiliary_driver 
*driver)
        rte_bus_remove_driver(&auxiliary_bus.bus, &driver->driver);
 }
 
-/* Add a device to auxiliary bus */
-void
-auxiliary_add_device(struct rte_auxiliary_device *aux_dev)
-{
-       TAILQ_INSERT_TAIL(&auxiliary_bus.device_list, aux_dev, next);
-}
-
-/* Insert a device into a predefined position in auxiliary bus */
-void
-auxiliary_insert_device(struct rte_auxiliary_device *exist_aux_dev,
-                       struct rte_auxiliary_device *new_aux_dev)
-{
-       TAILQ_INSERT_BEFORE(exist_aux_dev, new_aux_dev, next);
-}
-
-/* Remove a device from auxiliary bus */
-static void
-rte_auxiliary_remove_device(struct rte_auxiliary_device *auxiliary_dev)
-{
-       TAILQ_REMOVE(&auxiliary_bus.device_list, auxiliary_dev, next);
-}
-
 static struct rte_device *
 auxiliary_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                      const void *data)
 {
-       const struct rte_auxiliary_device *pstart;
-       struct rte_auxiliary_device *adev;
+       struct rte_device *dev;
 
        if (start != NULL) {
-               pstart = RTE_BUS_DEVICE(start, *pstart);
-               adev = TAILQ_NEXT(pstart, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               adev = TAILQ_FIRST(&auxiliary_bus.device_list);
+               dev = TAILQ_FIRST(&auxiliary_bus.bus.device_list);
        }
-       while (adev != NULL) {
-               if (cmp(&adev->device, data) == 0)
-                       return &adev->device;
-               adev = TAILQ_NEXT(adev, next);
+       while (dev != NULL) {
+               if (cmp(dev, data) == 0)
+                       return dev;
+               dev = TAILQ_NEXT(dev, next);
        }
        return NULL;
 }
@@ -310,7 +286,7 @@ auxiliary_unplug(struct rte_device *dev)
 
        ret = rte_auxiliary_driver_remove_dev(adev);
        if (ret == 0) {
-               rte_auxiliary_remove_device(adev);
+               rte_bus_remove_device(&auxiliary_bus.bus, &adev->device);
                rte_devargs_remove(dev->devargs);
                rte_intr_instance_free(adev->intr_handle);
                free(adev);
@@ -321,10 +297,10 @@ auxiliary_unplug(struct rte_device *dev)
 static int
 auxiliary_cleanup(void)
 {
-       struct rte_auxiliary_device *dev, *tmp_dev;
+       struct rte_auxiliary_device *dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &auxiliary_bus.device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &auxiliary_bus.bus) {
                int ret;
 
                if (!rte_dev_is_probed(&dev->device))
@@ -391,7 +367,6 @@ struct rte_auxiliary_bus auxiliary_bus = {
                .get_iommu_class = auxiliary_get_iommu_class,
                .dev_iterate = auxiliary_dev_iterate,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(auxiliary_bus.device_list),
 };
 
 RTE_REGISTER_BUS(auxiliary, auxiliary_bus.bus);
diff --git a/drivers/bus/auxiliary/bus_auxiliary_driver.h 
b/drivers/bus/auxiliary/bus_auxiliary_driver.h
index 59c46e08a0..165145b15e 100644
--- a/drivers/bus/auxiliary/bus_auxiliary_driver.h
+++ b/drivers/bus/auxiliary/bus_auxiliary_driver.h
@@ -110,7 +110,6 @@ typedef int (rte_auxiliary_dma_unmap_t)(struct 
rte_auxiliary_device *dev,
  * A structure describing an auxiliary device.
  */
 struct rte_auxiliary_device {
-       RTE_TAILQ_ENTRY(rte_auxiliary_device) next; /**< Next probed device. */
        struct rte_device device;                 /**< Inherit core device */
        char name[RTE_DEV_NAME_MAX_LEN + 1];      /**< ASCII device name */
        struct rte_intr_handle *intr_handle;       /**< Interrupt handle */
diff --git a/drivers/bus/auxiliary/linux/auxiliary.c 
b/drivers/bus/auxiliary/linux/auxiliary.c
index 7c430629d0..c65bbc8fcc 100644
--- a/drivers/bus/auxiliary/linux/auxiliary.c
+++ b/drivers/bus/auxiliary/linux/auxiliary.c
@@ -35,7 +35,6 @@ auxiliary_scan_one(const char *dirname, const char *name)
                return -1;
        }
        dev->device.name = dev->name;
-       dev->device.bus = &auxiliary_bus.bus;
 
        /* Get NUMA node, default to 0 if not present */
        snprintf(filename, sizeof(filename), "%s/%s/numa_node",
@@ -49,12 +48,12 @@ auxiliary_scan_one(const char *dirname, const char *name)
        auxiliary_on_scan(dev);
 
        /* Device is valid, add in list (sorted) */
-       TAILQ_FOREACH(dev2, &auxiliary_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev2, &auxiliary_bus.bus) {
                ret = strcmp(dev->name, dev2->name);
                if (ret > 0)
                        continue;
                if (ret < 0) {
-                       auxiliary_insert_device(dev2, dev);
+                       rte_bus_insert_device(&auxiliary_bus.bus, 
&dev2->device, &dev->device);
                } else { /* already registered */
                        if (rte_dev_is_probed(&dev2->device) &&
                            dev2->device.devargs != dev->device.devargs) {
@@ -66,7 +65,7 @@ auxiliary_scan_one(const char *dirname, const char *name)
                }
                return 0;
        }
-       auxiliary_add_device(dev);
+       rte_bus_add_device(&auxiliary_bus.bus, &dev->device);
        return 0;
 }
 
diff --git a/drivers/bus/auxiliary/private.h b/drivers/bus/auxiliary/private.h
index 66ba97b946..0b3d73a08d 100644
--- a/drivers/bus/auxiliary/private.h
+++ b/drivers/bus/auxiliary/private.h
@@ -24,15 +24,10 @@ extern int auxiliary_bus_logtype;
  */
 struct rte_auxiliary_bus {
        struct rte_bus bus;                  /* Inherit the generic class */
-       TAILQ_HEAD(, rte_auxiliary_device) device_list;  /* List of devices */
 };
 
 extern struct rte_auxiliary_bus auxiliary_bus;
 
-/* Auxiliary bus iterators */
-#define FOREACH_DEVICE_ON_AUXILIARY_BUS(p) \
-       TAILQ_FOREACH(p, &(auxiliary_bus.device_list), next)
-
 /*
  * Test whether the auxiliary device exist.
  */
@@ -49,21 +44,6 @@ int auxiliary_scan(void);
  */
 void auxiliary_on_scan(struct rte_auxiliary_device *aux_dev);
 
-/*
- * Add an auxiliary device to the auxiliary bus (append to auxiliary device
- * list). This function also updates the bus references of the auxiliary
- * device and the generic device object embedded within.
- */
-void auxiliary_add_device(struct rte_auxiliary_device *aux_dev);
-
-/*
- * Insert an auxiliary device in the auxiliary bus at a particular location
- * in the device list. It also updates the auxiliary bus reference of the
- * new devices to be inserted.
- */
-void auxiliary_insert_device(struct rte_auxiliary_device *exist_aux_dev,
-                            struct rte_auxiliary_device *new_aux_dev);
-
 /*
  * Match the auxiliary driver and device by driver function.
  */
diff --git a/drivers/bus/cdx/bus_cdx_driver.h b/drivers/bus/cdx/bus_cdx_driver.h
index 823a5b1be3..cee6c4a8d6 100644
--- a/drivers/bus/cdx/bus_cdx_driver.h
+++ b/drivers/bus/cdx/bus_cdx_driver.h
@@ -53,7 +53,6 @@ struct rte_cdx_id {
  * A structure describing a CDX device.
  */
 struct rte_cdx_device {
-       RTE_TAILQ_ENTRY(rte_cdx_device) next;   /**< Next probed CDX device. */
        struct rte_device device;               /**< Inherit core device */
        struct rte_cdx_driver *driver;          /**< CDX driver used in probing 
*/
        char name[RTE_DEV_NAME_MAX_LEN];        /**< Device name */
diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c
index 5973f75be2..bc221a4d00 100644
--- a/drivers/bus/cdx/cdx.c
+++ b/drivers/bus/cdx/cdx.c
@@ -84,10 +84,6 @@
 
 #define CDX_DEV_PREFIX "cdx-"
 
-/* CDX Bus iterators */
-#define FOREACH_DEVICE_ON_CDXBUS(p)    \
-               RTE_TAILQ_FOREACH(p, &rte_cdx_bus.device_list, next)
-
 struct rte_cdx_bus rte_cdx_bus;
 
 enum cdx_params {
@@ -99,13 +95,6 @@ static const char * const cdx_params_keys[] = {
        NULL,
 };
 
-/* Add a device to CDX bus */
-static void
-cdx_add_device(struct rte_cdx_device *cdx_dev)
-{
-       TAILQ_INSERT_TAIL(&rte_cdx_bus.device_list, cdx_dev, next);
-}
-
 static int
 cdx_get_kernel_driver_by_path(const char *filename, char *driver_name,
                size_t len)
@@ -167,7 +156,6 @@ cdx_scan_one(const char *dirname, const char *dev_name)
        if (!dev)
                return -ENOMEM;
 
-       dev->device.bus = &rte_cdx_bus.bus;
        memcpy(dev->name, dev_name, RTE_DEV_NAME_MAX_LEN);
        dev->device.name = dev->name;
 
@@ -215,7 +203,7 @@ cdx_scan_one(const char *dirname, const char *dev_name)
        }
        dev->id.device_id = (uint16_t)tmp;
 
-       cdx_add_device(dev);
+       rte_bus_add_device(&rte_cdx_bus.bus, &dev->device);
 
        return 0;
 
@@ -416,7 +404,7 @@ cdx_probe(void)
        size_t probed = 0, failed = 0;
        int ret = 0;
 
-       FOREACH_DEVICE_ON_CDXBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_cdx_bus.bus) {
                probed++;
 
                ret = cdx_probe_all_drivers(dev);
@@ -465,30 +453,21 @@ static struct rte_device *
 cdx_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                const void *data)
 {
-       const struct rte_cdx_device *cdx_start;
-       struct rte_cdx_device *cdx_dev;
+       struct rte_device *dev;
 
        if (start != NULL) {
-               cdx_start = RTE_BUS_DEVICE(start, *cdx_start);
-               cdx_dev = TAILQ_NEXT(cdx_start, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               cdx_dev = TAILQ_FIRST(&rte_cdx_bus.device_list);
+               dev = TAILQ_FIRST(&rte_cdx_bus.bus.device_list);
        }
-       while (cdx_dev != NULL) {
-               if (cmp(&cdx_dev->device, data) == 0)
-                       return &cdx_dev->device;
-               cdx_dev = TAILQ_NEXT(cdx_dev, next);
+       while (dev != NULL) {
+               if (cmp(dev, data) == 0)
+                       return dev;
+               dev = TAILQ_NEXT(dev, next);
        }
        return NULL;
 }
 
-/* Remove a device from CDX bus */
-static void
-cdx_remove_device(struct rte_cdx_device *cdx_dev)
-{
-       TAILQ_REMOVE(&rte_cdx_bus.device_list, cdx_dev, next);
-}
-
 /*
  * If vendor/device ID match, call the remove() function of the
  * driver.
@@ -534,7 +513,7 @@ cdx_unplug(struct rte_device *dev)
 
        ret = cdx_detach_dev(cdx_dev);
        if (ret == 0) {
-               cdx_remove_device(cdx_dev);
+               rte_bus_remove_device(&rte_cdx_bus.bus, &cdx_dev->device);
                rte_devargs_remove(dev->devargs);
                free(cdx_dev);
        }
@@ -562,7 +541,7 @@ cdx_dma_unmap(struct rte_device *dev, void *addr, uint64_t 
iova, size_t len)
 static enum rte_iova_mode
 cdx_get_iommu_class(void)
 {
-       if (TAILQ_EMPTY(&rte_cdx_bus.device_list))
+       if (TAILQ_EMPTY(&rte_cdx_bus.bus.device_list))
                return RTE_IOVA_DC;
 
        return RTE_IOVA_VA;
@@ -624,7 +603,6 @@ struct rte_cdx_bus rte_cdx_bus = {
                .get_iommu_class = cdx_get_iommu_class,
                .dev_iterate = cdx_dev_iterate,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(rte_cdx_bus.device_list),
 };
 
 RTE_REGISTER_BUS(cdx, rte_cdx_bus.bus);
diff --git a/drivers/bus/cdx/private.h b/drivers/bus/cdx/private.h
index 3807a17bfb..f69673aaab 100644
--- a/drivers/bus/cdx/private.h
+++ b/drivers/bus/cdx/private.h
@@ -12,7 +12,6 @@
  */
 struct rte_cdx_bus {
        struct rte_bus bus;                             /**< Inherit the 
generic class */
-       RTE_TAILQ_HEAD(, rte_cdx_device) device_list;   /**< List of CDX 
devices */
 };
 
 /**
diff --git a/drivers/bus/dpaa/bus_dpaa_driver.h 
b/drivers/bus/dpaa/bus_dpaa_driver.h
index 1575ed19e7..7e5e9b2126 100644
--- a/drivers/bus/dpaa/bus_dpaa_driver.h
+++ b/drivers/bus/dpaa/bus_dpaa_driver.h
@@ -79,7 +79,6 @@ struct dpaa_device_id {
 };
 
 struct rte_dpaa_device {
-       TAILQ_ENTRY(rte_dpaa_device) next;
        struct rte_device device;
        union {
                struct rte_eth_dev *eth_dev;
diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index f9f902cbd6..8305f8cb23 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -59,7 +59,6 @@
 
 struct rte_dpaa_bus {
        struct rte_bus bus;
-       TAILQ_HEAD(, rte_dpaa_device) device_list;
        int device_count;
        int detected;
        uint32_t svr_ver;
@@ -164,19 +163,18 @@ dpaa_add_to_device_list(struct rte_dpaa_device *newdev)
 {
        int comp, inserted = 0;
        struct rte_dpaa_device *dev = NULL;
-       struct rte_dpaa_device *tdev = NULL;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tdev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_dpaa_bus.bus) {
                comp = compare_dpaa_devices(newdev, dev);
                if (comp < 0) {
-                       TAILQ_INSERT_BEFORE(dev, newdev, next);
+                       rte_bus_insert_device(&rte_dpaa_bus.bus, &dev->device, 
&newdev->device);
                        inserted = 1;
                        break;
                }
        }
 
        if (!inserted)
-               TAILQ_INSERT_TAIL(&rte_dpaa_bus.device_list, newdev, next);
+               rte_bus_add_device(&rte_dpaa_bus.bus, &newdev->device);
 }
 
 /*
@@ -217,7 +215,6 @@ dpaa_create_device_list(void)
                        goto cleanup;
                }
 
-               dev->device.bus = &rte_dpaa_bus.bus;
                dev->device.numa_node = SOCKET_ID_ANY;
 
                /* Allocate interrupt handle instance */
@@ -347,10 +344,9 @@ static void
 dpaa_clean_device_list(void)
 {
        struct rte_dpaa_device *dev = NULL;
-       struct rte_dpaa_device *tdev = NULL;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tdev) {
-               TAILQ_REMOVE(&rte_dpaa_bus.device_list, dev, next);
+       RTE_BUS_FOREACH_DEV(dev, &rte_dpaa_bus.bus) {
+               rte_bus_remove_device(&rte_dpaa_bus.bus, &dev->device);
                rte_intr_instance_free(dev->intr_handle);
                free(dev);
                dev = NULL;
@@ -775,7 +771,7 @@ rte_dpaa_bus_probe(void)
        process_once = 1;
 
        /* If no device present on DPAA bus nothing needs to be done */
-       if (TAILQ_EMPTY(&rte_dpaa_bus.device_list))
+       if (TAILQ_EMPTY(&rte_dpaa_bus.bus.device_list))
                return 0;
 
        /* Register DPAA mempool ops only if any DPAA device has
@@ -783,7 +779,7 @@ rte_dpaa_bus_probe(void)
         */
        rte_mbuf_set_platform_mempool_ops(DPAA_MEMPOOL_OPS_NAME);
 
-       TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_dpaa_bus.bus) {
                if (dev->device_type == FSL_DPAA_ETH) {
                        ret = rte_dpaa_setup_intr(dev->intr_handle);
                        if (ret)
@@ -795,7 +791,7 @@ rte_dpaa_bus_probe(void)
        dpaax_iova_table_populate();
 
        /* For each registered driver, and device, call the driver->probe */
-       TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_dpaa_bus.bus) {
                RTE_BUS_FOREACH_DRV(drv, &rte_dpaa_bus.bus) {
                        ret = rte_dpaa_device_match(drv, dev);
                        if (ret)
@@ -826,24 +822,22 @@ static struct rte_device *
 rte_dpaa_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                     const void *data)
 {
-       struct rte_dpaa_device *dev;
-       const struct rte_dpaa_device *dstart;
+       struct rte_device *dev;
 
        /* find_device is called with 'data' as an opaque object - just call
         * cmp with this and each device object on bus.
         */
 
        if (start != NULL) {
-               dstart = RTE_BUS_DEVICE(start, *dstart);
-               dev = TAILQ_NEXT(dstart, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               dev = TAILQ_FIRST(&rte_dpaa_bus.device_list);
+               dev = TAILQ_FIRST(&rte_dpaa_bus.bus.device_list);
        }
 
        while (dev != NULL) {
-               if (cmp(&dev->device, data) == 0) {
-                       DPAA_BUS_DEBUG("Found dev=(%s)", dev->device.name);
-                       return &dev->device;
+               if (cmp(dev, data) == 0) {
+                       DPAA_BUS_DEBUG("Found dev=(%s)", dev->name);
+                       return dev;
                }
                dev = TAILQ_NEXT(dev, next);
        }
@@ -883,9 +877,8 @@ static void *
 dpaa_bus_dev_iterate(const void *start, const char *str,
                     const struct rte_dev_iterator *it __rte_unused)
 {
-       const struct rte_dpaa_device *dstart;
-       struct rte_dpaa_device *dev;
        char *dup, *dev_name = NULL;
+       struct rte_device *dev;
 
        if (str == NULL) {
                DPAA_BUS_DEBUG("No device string");
@@ -907,16 +900,15 @@ dpaa_bus_dev_iterate(const void *start, const char *str,
        dev_name = dup + strlen("name=");
 
        if (start != NULL) {
-               dstart = RTE_BUS_DEVICE(start, *dstart);
-               dev = TAILQ_NEXT(dstart, next);
+               dev = TAILQ_NEXT((const struct rte_device *)start, next);
        } else {
-               dev = TAILQ_FIRST(&rte_dpaa_bus.device_list);
+               dev = TAILQ_FIRST(&rte_dpaa_bus.bus.device_list);
        }
 
        while (dev != NULL) {
-               if (strcmp(dev->device.name, dev_name) == 0) {
+               if (strcmp(dev->name, dev_name) == 0) {
                        free(dup);
-                       return &dev->device;
+                       return dev;
                }
                dev = TAILQ_NEXT(dev, next);
        }
@@ -928,10 +920,10 @@ dpaa_bus_dev_iterate(const void *start, const char *str,
 static int
 dpaa_bus_cleanup(void)
 {
-       struct rte_dpaa_device *dev, *tmp_dev;
+       struct rte_dpaa_device *dev;
 
        BUS_INIT_FUNC_TRACE();
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_dpaa_bus.bus) {
                struct rte_dpaa_driver *drv = dev->driver;
                int ret = 0;
 
@@ -988,7 +980,6 @@ static struct rte_dpaa_bus rte_dpaa_bus = {
                .cleanup = dpaa_bus_cleanup,
        },
        .max_push_rxq_num = DPAA_DEFAULT_PUSH_MODE_QUEUE,
-       .device_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.device_list),
        .device_count = 0,
 };
 
diff --git a/drivers/bus/fslmc/bus_fslmc_driver.h 
b/drivers/bus/fslmc/bus_fslmc_driver.h
index c82b182720..ab8bc1c41d 100644
--- a/drivers/bus/fslmc/bus_fslmc_driver.h
+++ b/drivers/bus/fslmc/bus_fslmc_driver.h
@@ -93,7 +93,6 @@ enum rte_dpaa2_dev_type {
  * A structure describing a DPAA2 device.
  */
 struct rte_dpaa2_device {
-       TAILQ_ENTRY(rte_dpaa2_device) next; /**< Next probed DPAA2 device. */
        struct rte_device device;           /**< Inherit core device */
        enum rte_dpaa2_dev_type dev_type;   /**< Device Type */
        uint16_t object_id;                 /**< DPAA2 Object ID */
diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index 36ec018785..3e7f03375a 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -46,10 +46,9 @@ static void
 cleanup_fslmc_device_list(void)
 {
        struct rte_dpaa2_device *dev;
-       struct rte_dpaa2_device *t_dev;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, t_dev) {
-               TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
+               rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                rte_intr_instance_free(dev->intr_handle);
                free(dev);
                dev = NULL;
@@ -84,19 +83,18 @@ insert_in_device_list(struct rte_dpaa2_device *newdev)
 {
        int comp, inserted = 0;
        struct rte_dpaa2_device *dev = NULL;
-       struct rte_dpaa2_device *tdev = NULL;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, tdev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                comp = compare_dpaa2_devname(newdev, dev);
                if (comp < 0) {
-                       TAILQ_INSERT_BEFORE(dev, newdev, next);
+                       rte_bus_insert_device(&rte_fslmc_bus.bus, &dev->device, 
&newdev->device);
                        inserted = 1;
                        break;
                }
        }
 
        if (!inserted)
-               TAILQ_INSERT_TAIL(&rte_fslmc_bus.device_list, newdev, next);
+               rte_bus_add_device(&rte_fslmc_bus.bus, &newdev->device);
 }
 
 static void
@@ -107,7 +105,7 @@ dump_device_list(void)
        /* Only if the log level has been set to Debugging, print list */
        if (rte_log_can_log(dpaa2_logtype_bus, RTE_LOG_DEBUG)) {
                DPAA2_BUS_LOG(DEBUG, "List of devices scanned on bus:");
-               TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                        DPAA2_BUS_LOG(DEBUG, "\t\t%s", dev->device.name);
                }
        }
@@ -142,7 +140,6 @@ scan_one_fslmc_device(char *dev_name)
                return -ENOMEM;
        }
 
-       dev->device.bus = &rte_fslmc_bus.bus;
        dev->device.numa_node = SOCKET_ID_ANY;
 
        /* Allocate interrupt instance */
@@ -319,7 +316,7 @@ rte_fslmc_scan(void)
                struct rte_dpaa2_device *dev;
 
                DPAA2_BUS_DEBUG("Fslmc bus already scanned. Not rescanning");
-               TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                        dev->device.devargs = 
rte_bus_find_devargs(&rte_fslmc_bus.bus,
                                dev->device.name);
                }
@@ -420,7 +417,7 @@ rte_fslmc_probe(void)
                .align = alignof(dpaa2_seqn_t),
        };
 
-       if (TAILQ_EMPTY(&rte_fslmc_bus.device_list))
+       if (TAILQ_EMPTY(&rte_fslmc_bus.bus.device_list))
                return 0;
 
        dpaa2_seqn_dynfield_offset =
@@ -456,7 +453,7 @@ rte_fslmc_probe(void)
                return 0;
        }
 
-       TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                RTE_BUS_FOREACH_DRV(drv, &rte_fslmc_bus.bus) {
                        ret = rte_fslmc_match(drv, dev);
                        if (ret)
@@ -486,8 +483,7 @@ static struct rte_device *
 rte_fslmc_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                      const void *data)
 {
-       const struct rte_dpaa2_device *dstart;
-       struct rte_dpaa2_device *dev;
+       struct rte_device *dev;
 
        DPAA2_BUS_DEBUG("Finding a device named %s", (const char *)data);
 
@@ -497,16 +493,15 @@ rte_fslmc_find_device(const struct rte_device *start, 
rte_dev_cmp_t cmp,
         */
 
        if (start != NULL) {
-               dstart = RTE_BUS_DEVICE(start, *dstart);
-               dev = TAILQ_NEXT(dstart, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               dev = TAILQ_FIRST(&rte_fslmc_bus.device_list);
+               dev = TAILQ_FIRST(&rte_fslmc_bus.bus.device_list);
        }
        while (dev != NULL) {
-               if (cmp(&dev->device, data) == 0) {
+               if (cmp(dev, data) == 0) {
                        DPAA2_BUS_DEBUG("Found device (%s)",
-                                       dev->device.name);
-                       return &dev->device;
+                                       dev->name);
+                       return dev;
                }
                dev = TAILQ_NEXT(dev, next);
        }
@@ -543,7 +538,7 @@ fslmc_all_device_support_iova(void)
        struct rte_dpaa2_device *dev;
        struct rte_dpaa2_driver *drv;
 
-       TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                RTE_BUS_FOREACH_DRV(drv, &rte_fslmc_bus.bus) {
                        ret = rte_fslmc_match(drv, dev);
                        if (ret)
@@ -565,7 +560,7 @@ rte_dpaa2_get_iommu_class(void)
        if (rte_eal_iova_mode() == RTE_IOVA_PA)
                return RTE_IOVA_PA;
 
-       if (TAILQ_EMPTY(&rte_fslmc_bus.device_list))
+       if (TAILQ_EMPTY(&rte_fslmc_bus.bus.device_list))
                return RTE_IOVA_DC;
 
        /* check if all devices on the bus support Virtual addressing or not */
@@ -632,9 +627,8 @@ static void *
 fslmc_bus_dev_iterate(const void *start, const char *str,
                      const struct rte_dev_iterator *it __rte_unused)
 {
-       const struct rte_dpaa2_device *dstart;
-       struct rte_dpaa2_device *dev;
        char *dup, *dev_name = NULL;
+       struct rte_device *dev;
 
        if (str == NULL) {
                DPAA2_BUS_DEBUG("No device string");
@@ -656,16 +650,15 @@ fslmc_bus_dev_iterate(const void *start, const char *str,
        dev_name = dup + strlen("name=");
 
        if (start != NULL) {
-               dstart = RTE_BUS_DEVICE(start, *dstart);
-               dev = TAILQ_NEXT(dstart, next);
+               dev = TAILQ_NEXT(RTE_CAST_PTR(struct rte_device *, start), 
next);
        } else {
-               dev = TAILQ_FIRST(&rte_fslmc_bus.device_list);
+               dev = TAILQ_FIRST(&rte_fslmc_bus.bus.device_list);
        }
 
        while (dev != NULL) {
-               if (strcmp(dev->device.name, dev_name) == 0) {
+               if (strcmp(dev->name, dev_name) == 0) {
                        free(dup);
-                       return &dev->device;
+                       return dev;
                }
                dev = TAILQ_NEXT(dev, next);
        }
@@ -687,7 +680,6 @@ struct rte_fslmc_bus rte_fslmc_bus = {
                .unplug = fslmc_bus_unplug,
                .dev_iterate = fslmc_bus_dev_iterate,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(rte_fslmc_bus.device_list),
        .device_count = {0},
 };
 
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 7daa18d850..e38f3e9fe7 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -1539,7 +1539,7 @@ fslmc_process_mcp(struct rte_dpaa2_device *dev)
 int
 fslmc_vfio_close_group(void)
 {
-       struct rte_dpaa2_device *dev, *dev_temp;
+       struct rte_dpaa2_device *dev;
        int vfio_group_fd;
        const char *group_name = fslmc_vfio_get_group_name();
 
@@ -1552,12 +1552,12 @@ fslmc_vfio_close_group(void)
                return -EIO;
        }
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) 
{
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                if (dev->device.devargs &&
                    dev->device.devargs->policy == RTE_DEV_BLOCKED) {
                        DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping",
                                      dev->device.name);
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                                continue;
                }
                switch (dev->dev_type) {
@@ -1593,12 +1593,11 @@ fslmc_vfio_process_group(void)
 {
        int ret;
        int found_mportal = 0;
-       struct rte_dpaa2_device *dev, *dev_temp;
+       struct rte_dpaa2_device *dev;
        bool is_dpmcp_in_blocklist = false, is_dpio_in_blocklist = false;
        int dpmcp_count = 0, dpio_count = 0, current_device;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next,
-               dev_temp) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                if (dev->dev_type == DPAA2_MPORTAL) {
                        dpmcp_count++;
                        if (dev->device.devargs &&
@@ -1615,16 +1614,15 @@ fslmc_vfio_process_group(void)
 
        /* Search the MCP as that should be initialized first. */
        current_device = 0;
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next,
-               dev_temp) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                if (dev->dev_type == DPAA2_MPORTAL) {
                        current_device++;
                        if (dev->device.devargs &&
                            dev->device.devargs->policy == RTE_DEV_BLOCKED) {
                                DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping",
                                              dev->device.name);
-                               TAILQ_REMOVE(&rte_fslmc_bus.device_list,
-                                               dev, next);
+                               rte_bus_remove_device(&rte_fslmc_bus.bus,
+                                               &dev->device);
                                continue;
                        }
 
@@ -1632,8 +1630,8 @@ fslmc_vfio_process_group(void)
                            !is_dpmcp_in_blocklist) {
                                if (dpmcp_count == 1 ||
                                    current_device != dpmcp_count) {
-                                       TAILQ_REMOVE(&rte_fslmc_bus.device_list,
-                                                    dev, next);
+                                       
rte_bus_remove_device(&rte_fslmc_bus.bus,
+                                                    &dev->device);
                                        continue;
                                }
                        }
@@ -1647,7 +1645,7 @@ fslmc_vfio_process_group(void)
                                found_mportal = 1;
                        }
 
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                        free(dev);
                        dev = NULL;
                        /* Ideally there is only a single dpmcp, but in case
@@ -1666,27 +1664,26 @@ fslmc_vfio_process_group(void)
         * other devices.
         */
        current_device = 0;
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) 
{
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                if (dev->dev_type == DPAA2_DPRC) {
                        ret = fslmc_process_iodevices(dev);
                        if (ret) {
                                DPAA2_BUS_ERR("Unable to process dprc");
                                return ret;
                        }
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                }
        }
 
        current_device = 0;
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next,
-               dev_temp) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                if (dev->dev_type == DPAA2_IO)
                        current_device++;
                if (dev->device.devargs &&
                    dev->device.devargs->policy == RTE_DEV_BLOCKED) {
                        DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping",
                                      dev->device.name);
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                        continue;
                }
                if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
@@ -1694,7 +1691,7 @@ fslmc_vfio_process_group(void)
                    dev->dev_type != DPAA2_CRYPTO &&
                    dev->dev_type != DPAA2_QDMA &&
                    dev->dev_type != DPAA2_IO) {
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                        continue;
                }
                switch (dev->dev_type) {
@@ -1736,14 +1733,14 @@ fslmc_vfio_process_group(void)
                        if (!is_dpio_in_blocklist && dpio_count > 1) {
                                if (rte_eal_process_type() == RTE_PROC_SECONDARY
                                    && current_device != dpio_count) {
-                                       TAILQ_REMOVE(&rte_fslmc_bus.device_list,
-                                                    dev, next);
+                                       
rte_bus_remove_device(&rte_fslmc_bus.bus,
+                                                    &dev->device);
                                        break;
                                }
                                if (rte_eal_process_type() == RTE_PROC_PRIMARY
                                    && current_device == dpio_count) {
-                                       TAILQ_REMOVE(&rte_fslmc_bus.device_list,
-                                                    dev, next);
+                                       
rte_bus_remove_device(&rte_fslmc_bus.bus,
+                                                    &dev->device);
                                        break;
                                }
                        }
@@ -1761,7 +1758,7 @@ fslmc_vfio_process_group(void)
                        /* Unknown - ignore */
                        DPAA2_BUS_DEBUG("Found unknown device (%s)",
                                        dev->device.name);
-                       TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next);
+                       rte_bus_remove_device(&rte_fslmc_bus.bus, &dev->device);
                        free(dev);
                        dev = NULL;
                }
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dprc.c 
b/drivers/bus/fslmc/portal/dpaa2_hw_dprc.c
index a057cb1309..a66e55a456 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dprc.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dprc.c
@@ -28,7 +28,7 @@ rte_dpaa2_create_dprc_device(int vdev_fd __rte_unused,
 {
        struct dpaa2_dprc_dev *dprc_node;
        struct dprc_endpoint endpoint1, endpoint2;
-       struct rte_dpaa2_device *dev, *dev_tmp;
+       struct rte_dpaa2_device *dev;
        int ret, dprc_id = obj->object_id;
 
        /* Allocate DPAA2 dprc handle */
@@ -49,7 +49,7 @@ rte_dpaa2_create_dprc_device(int vdev_fd __rte_unused,
                return ret;
        }
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_tmp) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus.bus) {
                /** DPRC is always created before it's children are created.*/
                dev->container = dprc_node;
                if (dev->dev_type == DPAA2_ETH) {
diff --git a/drivers/bus/fslmc/private.h b/drivers/bus/fslmc/private.h
index 338f55b094..2fe592f24d 100644
--- a/drivers/bus/fslmc/private.h
+++ b/drivers/bus/fslmc/private.h
@@ -14,8 +14,6 @@
  */
 struct rte_fslmc_bus {
        struct rte_bus bus;     /**< Generic Bus object */
-       TAILQ_HEAD(, rte_dpaa2_device) device_list;
-                               /**< FSLMC DPAA2 Device list */
        int device_count[DPAA2_DEVTYPE_MAX];
                                /**< Count of all devices scanned */
 };
diff --git a/drivers/bus/ifpga/bus_ifpga_driver.h 
b/drivers/bus/ifpga/bus_ifpga_driver.h
index 7d724dc1a0..c1ff38bdb2 100644
--- a/drivers/bus/ifpga/bus_ifpga_driver.h
+++ b/drivers/bus/ifpga/bus_ifpga_driver.h
@@ -67,7 +67,6 @@ struct rte_afu_shared {
  * A structure describing a AFU device.
  */
 struct rte_afu_device {
-       RTE_TAILQ_ENTRY(rte_afu_device) next;       /**< Next in device list. */
        struct rte_device device;               /**< Inherit core device */
        struct rte_rawdev *rawdev;    /**< Point Rawdev */
        struct rte_afu_id id;                   /**< AFU id within FPGA. */
diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c
index c038144ebd..4edff5efd4 100644
--- a/drivers/bus/ifpga/ifpga_bus.c
+++ b/drivers/bus/ifpga/ifpga_bus.c
@@ -38,9 +38,6 @@
  */
 static struct rte_bus rte_ifpga_bus;
 
-static TAILQ_HEAD(, rte_afu_device) ifpga_afu_dev_list =
-       TAILQ_HEAD_INITIALIZER(ifpga_afu_dev_list);
-
 /* register a ifpga bus based driver */
 RTE_EXPORT_INTERNAL_SYMBOL(rte_ifpga_driver_register)
 void rte_ifpga_driver_register(struct rte_afu_driver *driver)
@@ -63,7 +60,7 @@ ifpga_find_afu_dev(const struct rte_rawdev *rdev,
 {
        struct rte_afu_device *afu_dev = NULL;
 
-       TAILQ_FOREACH(afu_dev, &ifpga_afu_dev_list, next) {
+       RTE_BUS_FOREACH_DEV(afu_dev, &rte_ifpga_bus) {
                if (afu_dev->rawdev == rdev &&
                        !ifpga_afu_id_cmp(&afu_dev->id, afu_id))
                        return afu_dev;
@@ -139,7 +136,6 @@ ifpga_scan_one(struct rte_rawdev *rawdev,
        if (!afu_dev)
                goto end;
 
-       afu_dev->device.bus = &rte_ifpga_bus;
        afu_dev->device.devargs = devargs;
        afu_dev->device.numa_node = SOCKET_ID_ANY;
        afu_dev->device.name = devargs->name;
@@ -236,7 +232,7 @@ ifpga_scan(void)
 
                afu_dev = ifpga_scan_one(rawdev, devargs);
                if (afu_dev != NULL)
-                       TAILQ_INSERT_TAIL(&ifpga_afu_dev_list, afu_dev, next);
+                       rte_bus_add_device(&rte_ifpga_bus, &afu_dev->device);
        }
 
 end:
@@ -333,7 +329,7 @@ ifpga_probe(void)
        struct rte_afu_device *afu_dev = NULL;
        int ret = 0;
 
-       TAILQ_FOREACH(afu_dev, &ifpga_afu_dev_list, next) {
+       RTE_BUS_FOREACH_DEV(afu_dev, &rte_ifpga_bus) {
                ret = ifpga_probe_all_drivers(afu_dev);
                if (ret == -EEXIST)
                        continue;
@@ -352,10 +348,10 @@ ifpga_probe(void)
 static int
 ifpga_cleanup(void)
 {
-       struct rte_afu_device *afu_dev, *tmp_dev;
+       struct rte_afu_device *afu_dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(afu_dev, &ifpga_afu_dev_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(afu_dev, &rte_ifpga_bus) {
                struct rte_afu_driver *drv = afu_dev->driver;
                int ret = 0;
 
@@ -373,7 +369,7 @@ ifpga_cleanup(void)
                afu_dev->device.driver = NULL;
 
 free:
-               TAILQ_REMOVE(&ifpga_afu_dev_list, afu_dev, next);
+               rte_bus_remove_device(&rte_ifpga_bus, &afu_dev->device);
                rte_devargs_remove(afu_dev->device.devargs);
                rte_intr_instance_free(afu_dev->intr_handle);
                free(afu_dev);
@@ -398,7 +394,7 @@ ifpga_unplug(struct rte_device *dev)
        if (ret)
                return ret;
 
-       TAILQ_REMOVE(&ifpga_afu_dev_list, afu_dev, next);
+       rte_bus_remove_device(&rte_ifpga_bus, &afu_dev->device);
 
        rte_devargs_remove(dev->devargs);
        rte_intr_instance_free(afu_dev->intr_handle);
@@ -411,15 +407,15 @@ static struct rte_device *
 ifpga_find_device(const struct rte_device *start,
        rte_dev_cmp_t cmp, const void *data)
 {
-       struct rte_afu_device *afu_dev;
+       struct rte_device *dev;
 
-       TAILQ_FOREACH(afu_dev, &ifpga_afu_dev_list, next) {
-               if (start && &afu_dev->device == start) {
+       TAILQ_FOREACH(dev, &rte_ifpga_bus.device_list, next) {
+               if (start && dev == start) {
                        start = NULL;
                        continue;
                }
-               if (cmp(&afu_dev->device, data) == 0)
-                       return &afu_dev->device;
+               if (cmp(dev, data) == 0)
+                       return dev;
        }
 
        return NULL;
diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
index aba44492e0..78d14ab3ae 100644
--- a/drivers/bus/pci/bsd/pci.c
+++ b/drivers/bus/pci/bsd/pci.c
@@ -233,7 +233,6 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
 
        memset(pdev, 0, sizeof(*pdev));
        dev = &pdev->device;
-       dev->device.bus = &rte_pci_bus.bus;
 
        dev->addr.domain = conf->pc_sel.pc_domain;
        dev->addr.bus = conf->pc_sel.pc_bus;
@@ -298,19 +297,20 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
        }
 
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
-               rte_pci_add_device(dev);
+       if (TAILQ_EMPTY(&rte_pci_bus.bus.device_list)) {
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        }
        else {
                struct rte_pci_device *dev2 = NULL;
                int ret;
 
-               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev2, &rte_pci_bus.bus) {
                        ret = rte_pci_addr_cmp(&dev->addr, &dev2->addr);
                        if (ret > 0)
                                continue;
                        else if (ret < 0) {
-                               rte_pci_insert_device(dev2, dev);
+                               rte_bus_insert_device(&rte_pci_bus.bus, 
&dev2->device,
+                                       &dev->device);
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
                                dev2->max_vfs = dev->max_vfs;
@@ -322,7 +322,7 @@ pci_scan_one(int dev_pci_fd, struct pci_conf *conf)
                        }
                        return 0;
                }
-               rte_pci_add_device(dev);
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        }
 
        return 0;
diff --git a/drivers/bus/pci/bus_pci_driver.h b/drivers/bus/pci/bus_pci_driver.h
index 993d690f96..b0e5428e64 100644
--- a/drivers/bus/pci/bus_pci_driver.h
+++ b/drivers/bus/pci/bus_pci_driver.h
@@ -33,7 +33,6 @@ enum rte_pci_kernel_driver {
  * A structure describing a PCI device.
  */
 struct rte_pci_device {
-       RTE_TAILQ_ENTRY(rte_pci_device) next;   /**< Next probed PCI device. */
        struct rte_device device;           /**< Inherit core device */
        struct rte_pci_addr addr;           /**< PCI location. */
        struct rte_pci_id id;               /**< PCI ID. */
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 5f263f8b28..cf8a60313b 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -218,7 +218,6 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
 
        memset(pdev, 0, sizeof(*pdev));
        dev = &pdev->device;
-       dev->device.bus = &rte_pci_bus.bus;
        dev->addr = *addr;
 
        /* get vendor id */
@@ -322,18 +321,19 @@ pci_scan_one(const char *dirname, const struct 
rte_pci_addr *addr)
                return 0;
        }
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
-               rte_pci_add_device(dev);
+       if (TAILQ_EMPTY(&rte_pci_bus.bus.device_list)) {
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        } else {
                struct rte_pci_device *dev2;
 
-               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev2, &rte_pci_bus.bus) {
                        ret = rte_pci_addr_cmp(&dev->addr, &dev2->addr);
                        if (ret > 0)
                                continue;
 
                        if (ret < 0) {
-                               rte_pci_insert_device(dev2, dev);
+                               rte_bus_insert_device(&rte_pci_bus.bus, 
&dev2->device,
+                                       &dev->device);
                        } else { /* already registered */
                                if (!rte_dev_is_probed(&dev2->device)) {
                                        dev2->kdrv = dev->kdrv;
@@ -377,7 +377,7 @@ pci_scan_one(const char *dirname, const struct rte_pci_addr 
*addr)
                        return 0;
                }
 
-               rte_pci_add_device(dev);
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        }
 
        return 0;
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index 79cc14a6dd..94dc63d865 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -383,7 +383,7 @@ pci_probe(void)
        size_t probed = 0, failed = 0;
        int ret = 0;
 
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_pci_bus.bus) {
                probed++;
 
                ret = pci_probe_all_drivers(dev);
@@ -405,10 +405,10 @@ pci_probe(void)
 static int
 pci_cleanup(void)
 {
-       struct rte_pci_device *dev, *tmp_dev;
+       struct rte_pci_device *dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_pci_bus.device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_pci_bus.bus) {
                struct rte_pci_driver *drv = dev->driver;
                int ret = 0;
 
@@ -432,7 +432,7 @@ pci_cleanup(void)
                rte_intr_instance_free(dev->vfio_req_intr_handle);
                dev->vfio_req_intr_handle = NULL;
 
-               TAILQ_REMOVE(&rte_pci_bus.device_list, dev, next);
+               rte_bus_remove_device(&rte_pci_bus.bus, &dev->device);
                pci_free(RTE_PCI_DEVICE_INTERNAL(dev));
        }
 
@@ -466,7 +466,7 @@ rte_pci_dump(FILE *f)
 {
        struct rte_pci_device *dev = NULL;
 
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_pci_bus.bus) {
                pci_dump_one_device(f, dev);
        }
 }
@@ -512,45 +512,21 @@ rte_pci_unregister(struct rte_pci_driver *driver)
        rte_bus_remove_driver(&rte_pci_bus.bus, &driver->driver);
 }
 
-/* Add a device to PCI bus */
-void
-rte_pci_add_device(struct rte_pci_device *pci_dev)
-{
-       TAILQ_INSERT_TAIL(&rte_pci_bus.device_list, pci_dev, next);
-}
-
-/* Insert a device into a predefined position in PCI bus */
-void
-rte_pci_insert_device(struct rte_pci_device *exist_pci_dev,
-                     struct rte_pci_device *new_pci_dev)
-{
-       TAILQ_INSERT_BEFORE(exist_pci_dev, new_pci_dev, next);
-}
-
-/* Remove a device from PCI bus */
-static void
-rte_pci_remove_device(struct rte_pci_device *pci_dev)
-{
-       TAILQ_REMOVE(&rte_pci_bus.device_list, pci_dev, next);
-}
-
 static struct rte_device *
 pci_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                const void *data)
 {
-       const struct rte_pci_device *pstart;
-       struct rte_pci_device *pdev;
+       struct rte_device *dev;
 
        if (start != NULL) {
-               pstart = RTE_BUS_DEVICE(start, *pstart);
-               pdev = TAILQ_NEXT(pstart, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               pdev = TAILQ_FIRST(&rte_pci_bus.device_list);
+               dev = TAILQ_FIRST(&rte_pci_bus.bus.device_list);
        }
-       while (pdev != NULL) {
-               if (cmp(&pdev->device, data) == 0)
-                       return &pdev->device;
-               pdev = TAILQ_NEXT(pdev, next);
+       while (dev != NULL) {
+               if (cmp(dev, data) == 0)
+                       return dev;
+               dev = TAILQ_NEXT(dev, next);
        }
        return NULL;
 }
@@ -569,7 +545,7 @@ pci_find_device_by_addr(const void *failure_addr)
 
        check_point = (uint64_t)(uintptr_t)failure_addr;
 
-       FOREACH_DEVICE_ON_PCIBUS(pdev) {
+       RTE_BUS_FOREACH_DEV(pdev, &rte_pci_bus.bus) {
                for (i = 0; i != RTE_DIM(pdev->mem_resource); i++) {
                        start = (uint64_t)(uintptr_t)pdev->mem_resource[i].addr;
                        len = pdev->mem_resource[i].len;
@@ -653,7 +629,7 @@ pci_unplug(struct rte_device *dev)
 
        ret = rte_pci_detach_dev(pdev);
        if (ret == 0) {
-               rte_pci_remove_device(pdev);
+               rte_bus_remove_device(&rte_pci_bus.bus, &pdev->device);
                rte_devargs_remove(dev->devargs);
                pci_free(RTE_PCI_DEVICE_INTERNAL(pdev));
        }
@@ -708,7 +684,7 @@ rte_pci_get_iommu_class(void)
        bool devices_want_pa = false;
        int iommu_no_va = -1;
 
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_pci_bus.bus) {
                /*
                 * We can check this only once, because the IOMMU hardware is
                 * the same for all of them.
@@ -916,7 +892,6 @@ struct rte_pci_bus rte_pci_bus = {
                .hot_unplug_handler = pci_hot_unplug_handler,
                .sigbus_handler = pci_sigbus_handler,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),
 };
 
 RTE_REGISTER_BUS(pci, rte_pci_bus.bus);
diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h
index 8b5f563dc3..52fa6b0f76 100644
--- a/drivers/bus/pci/private.h
+++ b/drivers/bus/pci/private.h
@@ -34,15 +34,10 @@ extern int pci_bus_logtype;
  */
 struct rte_pci_bus {
        struct rte_bus bus;               /**< Inherit the generic class */
-       RTE_TAILQ_HEAD(, rte_pci_device) device_list; /**< List of PCI devices 
*/
 };
 
 extern struct rte_pci_bus rte_pci_bus;
 
-/* PCI Bus iterators */
-#define FOREACH_DEVICE_ON_PCIBUS(p)    \
-       RTE_TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next)
-
 struct rte_pci_driver;
 struct rte_pci_device;
 
@@ -78,31 +73,6 @@ pci_common_set(struct rte_pci_device *dev);
 void
 pci_free(struct rte_pci_device_internal *pdev);
 
-/**
- * Add a PCI device to the PCI Bus (append to PCI Device list). This function
- * also updates the bus references of the PCI Device (and the generic device
- * object embedded within.
- *
- * @param pci_dev
- *     PCI device to add
- * @return void
- */
-void rte_pci_add_device(struct rte_pci_device *pci_dev);
-
-/**
- * Insert a PCI device in the PCI Bus at a particular location in the device
- * list. It also updates the PCI Bus reference of the new devices to be
- * inserted.
- *
- * @param exist_pci_dev
- *     Existing PCI device in PCI Bus
- * @param new_pci_dev
- *     PCI device to be added before exist_pci_dev
- * @return void
- */
-void rte_pci_insert_device(struct rte_pci_device *exist_pci_dev,
-               struct rte_pci_device *new_pci_dev);
-
 /**
  * A structure describing a PCI mapping.
  */
diff --git a/drivers/bus/pci/windows/pci.c b/drivers/bus/pci/windows/pci.c
index 549319ad5b..3b3f97da27 100644
--- a/drivers/bus/pci/windows/pci.c
+++ b/drivers/bus/pci/windows/pci.c
@@ -415,7 +415,6 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA 
device_info_data)
        memset(pdev, 0, sizeof(*pdev));
        dev = &pdev->device;
 
-       dev->device.bus = &rte_pci_bus.bus;
        dev->addr = addr;
        dev->id = pci_id;
        dev->max_vfs = 0; /* TODO: get max_vfs */
@@ -431,17 +430,18 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA 
device_info_data)
        }
 
        /* device is valid, add in list (sorted) */
-       if (TAILQ_EMPTY(&rte_pci_bus.device_list)) {
-               rte_pci_add_device(dev);
+       if (TAILQ_EMPTY(&rte_pci_bus.bus.device_list)) {
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        } else {
                struct rte_pci_device *dev2 = NULL;
 
-               TAILQ_FOREACH(dev2, &rte_pci_bus.device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev2, &rte_pci_bus.bus) {
                        ret = rte_pci_addr_cmp(&dev->addr, &dev2->addr);
                        if (ret > 0) {
                                continue;
                        } else if (ret < 0) {
-                               rte_pci_insert_device(dev2, dev);
+                               rte_bus_insert_device(&rte_pci_bus.bus, 
&dev2->device,
+                                       &dev->device);
                        } else { /* already registered */
                                dev2->kdrv = dev->kdrv;
                                dev2->max_vfs = dev->max_vfs;
@@ -451,7 +451,7 @@ pci_scan_one(HDEVINFO dev_info, PSP_DEVINFO_DATA 
device_info_data)
                        }
                        return 0;
                }
-               rte_pci_add_device(dev);
+               rte_bus_add_device(&rte_pci_bus.bus, &dev->device);
        }
 
        return 0;
diff --git a/drivers/bus/platform/bus_platform_driver.h 
b/drivers/bus/platform/bus_platform_driver.h
index a72d5c00a3..3912ed5b85 100644
--- a/drivers/bus/platform/bus_platform_driver.h
+++ b/drivers/bus/platform/bus_platform_driver.h
@@ -94,7 +94,6 @@ struct rte_platform_resource {
  * A structure describing a platform device.
  */
 struct rte_platform_device {
-       RTE_TAILQ_ENTRY(rte_platform_device) next; /**< Next attached platform 
device */
        struct rte_device device; /**< Core device */
        struct rte_platform_driver *driver; /**< Matching device driver */
        char name[RTE_DEV_NAME_MAX_LEN]; /**< Device name */
diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c
index 9d3c4877b0..0c23e5d9b6 100644
--- a/drivers/bus/platform/platform.c
+++ b/drivers/bus/platform/platform.c
@@ -57,11 +57,10 @@ dev_add(const char *dev_name)
        rte_strscpy(pdev->name, dev_name, sizeof(pdev->name));
        pdev->device.name = pdev->name;
        pdev->device.devargs = rte_bus_find_devargs(&platform_bus.bus, 
dev_name);
-       pdev->device.bus = &platform_bus.bus;
        snprintf(path, sizeof(path), PLATFORM_BUS_DEVICES_PATH "/%s/numa_node", 
dev_name);
        pdev->device.numa_node = eal_parse_sysfs_value(path, &val) ? 
rte_socket_id() : val;
 
-       FOREACH_DEVICE_ON_PLATFORM_BUS(tmp) {
+       RTE_BUS_FOREACH_DEV(tmp, &platform_bus.bus) {
                if (!strcmp(tmp->name, pdev->name)) {
                        PLATFORM_LOG_LINE(INFO, "device %s already added", 
pdev->name);
 
@@ -73,7 +72,7 @@ dev_add(const char *dev_name)
                }
        }
 
-       TAILQ_INSERT_HEAD(&platform_bus.device_list, pdev, next);
+       rte_bus_add_device(&platform_bus.bus, &pdev->device);
 
        PLATFORM_LOG_LINE(INFO, "adding device %s to the list", dev_name);
 
@@ -425,7 +424,7 @@ platform_bus_probe(void)
        struct rte_platform_device *pdev;
        int ret;
 
-       FOREACH_DEVICE_ON_PLATFORM_BUS(pdev) {
+       RTE_BUS_FOREACH_DEV(pdev, &platform_bus.bus) {
                ret = device_attach(pdev);
                if (ret == -EBUSY) {
                        PLATFORM_LOG_LINE(DEBUG, "device %s already probed", 
pdev->name);
@@ -441,20 +440,18 @@ platform_bus_probe(void)
 static struct rte_device *
 platform_bus_find_device(const struct rte_device *start, rte_dev_cmp_t cmp, 
const void *data)
 {
-       const struct rte_platform_device *pstart;
-       struct rte_platform_device *pdev;
+       struct rte_device *dev;
 
        if (start != NULL) {
-               pstart = RTE_BUS_DEVICE(start, *pstart);
-               pdev = TAILQ_NEXT(pstart, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               pdev = RTE_TAILQ_FIRST(&platform_bus.device_list);
+               dev = RTE_TAILQ_FIRST(&platform_bus.bus.device_list);
        }
-       while (pdev) {
-               if (cmp(&pdev->device, data) == 0)
-                       return &pdev->device;
+       while (dev) {
+               if (cmp(dev, data) == 0)
+                       return dev;
 
-               pdev = RTE_TAILQ_NEXT(pdev, next);
+               dev = RTE_TAILQ_NEXT(dev, next);
        }
 
        return NULL;
@@ -550,7 +547,7 @@ platform_bus_get_iommu_class(void)
        struct rte_platform_driver *pdrv;
        struct rte_platform_device *pdev;
 
-       FOREACH_DEVICE_ON_PLATFORM_BUS(pdev) {
+       RTE_BUS_FOREACH_DEV(pdev, &platform_bus.bus) {
                pdrv = pdev->driver;
                if (pdrv != NULL && pdrv->drv_flags & 
RTE_PLATFORM_DRV_NEED_IOVA_AS_VA)
                        return RTE_IOVA_VA;
@@ -562,10 +559,10 @@ platform_bus_get_iommu_class(void)
 static int
 platform_bus_cleanup(void)
 {
-       struct rte_platform_device *pdev, *tmp;
+       struct rte_platform_device *pdev;
 
-       RTE_TAILQ_FOREACH_SAFE(pdev, &platform_bus.device_list, next, tmp) {
-               TAILQ_REMOVE(&platform_bus.device_list, pdev, next);
+       RTE_BUS_FOREACH_DEV(pdev, &platform_bus.bus) {
+               rte_bus_remove_device(&platform_bus.bus, &pdev->device);
                if (!rte_dev_is_probed(&pdev->device))
                        continue;
                platform_bus_unplug(&pdev->device);
@@ -588,7 +585,6 @@ struct rte_platform_bus platform_bus = {
                .dev_iterate = platform_bus_dev_iterate,
                .cleanup = platform_bus_cleanup,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(platform_bus.device_list),
 };
 
 RTE_REGISTER_BUS(platform, platform_bus.bus);
diff --git a/drivers/bus/platform/private.h b/drivers/bus/platform/private.h
index f7ee80f3ac..81a8984052 100644
--- a/drivers/bus/platform/private.h
+++ b/drivers/bus/platform/private.h
@@ -16,16 +16,11 @@
 
 extern struct rte_platform_bus platform_bus;
 
-/* Platform bus iterators. */
-#define FOREACH_DEVICE_ON_PLATFORM_BUS(p) \
-       RTE_TAILQ_FOREACH(p, &(platform_bus.device_list), next)
-
 /*
  * Structure describing platform bus.
  */
 struct rte_platform_bus {
        struct rte_bus bus; /* Core bus */
-       RTE_TAILQ_HEAD(, rte_platform_device) device_list; /* List of bus 
devices */
 };
 
 extern int platform_bus_logtype;
diff --git a/drivers/bus/uacce/bus_uacce_driver.h 
b/drivers/bus/uacce/bus_uacce_driver.h
index 051e1736cf..04ced912c9 100644
--- a/drivers/bus/uacce/bus_uacce_driver.h
+++ b/drivers/bus/uacce/bus_uacce_driver.h
@@ -43,7 +43,6 @@ struct rte_uacce_driver;
  * A structure describing a UACCE device.
  */
 struct rte_uacce_device {
-       RTE_TAILQ_ENTRY(rte_uacce_device) next;  /**< Next in device list. */
        struct rte_device device;                /**< Inherit core device. */
        struct rte_uacce_driver *driver;         /**< Driver used in probing. */
        char name[RTE_DEV_NAME_MAX_LEN];         /**< Device name. */
diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c
index c0a1e1d8ec..199517442d 100644
--- a/drivers/bus/uacce/uacce.c
+++ b/drivers/bus/uacce/uacce.c
@@ -39,7 +39,6 @@
  */
 struct rte_uacce_bus {
        struct rte_bus bus;                         /* Inherit the generic 
class. */
-       TAILQ_HEAD(, rte_uacce_device) device_list; /* List of devices. */
 };
 
 /* Forward declaration of UACCE bus. */
@@ -54,9 +53,6 @@ static const char *const uacce_params_keys[] = {
        NULL,
 };
 
-#define FOREACH_DEVICE_ON_UACCEBUS(p)  \
-               RTE_TAILQ_FOREACH(p, &uacce_bus.device_list, next)
-
 extern int uacce_bus_logtype;
 #define RTE_LOGTYPE_UACCE_BUS uacce_bus_logtype
 #define UACCE_BUS_LOG(level, ...) \
@@ -217,7 +213,6 @@ uacce_scan_one(const char *dev_name)
        if (!dev)
                return -ENOMEM;
 
-       dev->device.bus = &uacce_bus.bus;
        dev->device.name = dev->name;
        dev->device.devargs = rte_bus_find_devargs(&uacce_bus.bus, dev_name);
        snprintf(dev->name, sizeof(dev->name), "%s", dev_name);
@@ -243,7 +238,7 @@ uacce_scan_one(const char *dev_name)
        if (ret != 0)
                goto err;
 
-       TAILQ_INSERT_TAIL(&uacce_bus.device_list, dev, next);
+       rte_bus_add_device(&uacce_bus.bus, &dev->device);
        return 0;
 
 err:
@@ -425,7 +420,7 @@ uacce_probe(void)
        struct rte_uacce_device *dev;
        int ret;
 
-       FOREACH_DEVICE_ON_UACCEBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &uacce_bus.bus) {
                probed++;
 
                ret = uacce_probe_all_drivers(dev);
@@ -443,10 +438,10 @@ uacce_probe(void)
 static int
 uacce_cleanup(void)
 {
-       struct rte_uacce_device *dev, *tmp_dev;
+       struct rte_uacce_device *dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &uacce_bus.device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &uacce_bus.bus) {
                struct rte_uacce_driver *dr = dev->driver;
                int ret = 0;
 
@@ -464,7 +459,7 @@ uacce_cleanup(void)
                dev->device.driver = NULL;
 
 free:
-               TAILQ_REMOVE(&uacce_bus.device_list, dev, next);
+               rte_bus_remove_device(&uacce_bus.bus, &dev->device);
                free(dev);
        }
 
@@ -505,7 +500,7 @@ uacce_unplug(struct rte_device *dev)
 
        ret = uacce_detach_dev(uacce_dev);
        if (ret == 0) {
-               TAILQ_REMOVE(&uacce_bus.device_list, uacce_dev, next);
+               rte_bus_remove_device(&uacce_bus.bus, &uacce_dev->device);
                rte_devargs_remove(dev->devargs);
                free(uacce_dev);
        }
@@ -516,20 +511,18 @@ uacce_unplug(struct rte_device *dev)
 static struct rte_device *
 uacce_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,  const 
void *data)
 {
-       const struct rte_uacce_device *uacce_start;
-       struct rte_uacce_device *uacce_dev;
+       struct rte_device *dev;
 
        if (start != NULL) {
-               uacce_start = RTE_BUS_DEVICE(start, *uacce_start);
-               uacce_dev = TAILQ_NEXT(uacce_start, next);
+               dev = TAILQ_NEXT(start, next);
        } else {
-               uacce_dev = TAILQ_FIRST(&uacce_bus.device_list);
+               dev = TAILQ_FIRST(&uacce_bus.bus.device_list);
        }
 
-       while (uacce_dev != NULL) {
-               if (cmp(&uacce_dev->device, data) == 0)
-                       return &uacce_dev->device;
-               uacce_dev = TAILQ_NEXT(uacce_dev, next);
+       while (dev != NULL) {
+               if (cmp(dev, data) == 0)
+                       return dev;
+               dev = TAILQ_NEXT(dev, next);
        }
 
        return NULL;
@@ -707,7 +700,6 @@ static struct rte_uacce_bus uacce_bus = {
                .parse = uacce_parse,
                .dev_iterate = uacce_dev_iterate,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(uacce_bus.device_list),
 };
 
 RTE_REGISTER_BUS(uacce, uacce_bus.bus);
diff --git a/drivers/bus/vdev/bus_vdev_driver.h 
b/drivers/bus/vdev/bus_vdev_driver.h
index eceaa56696..8d114e4b3b 100644
--- a/drivers/bus/vdev/bus_vdev_driver.h
+++ b/drivers/bus/vdev/bus_vdev_driver.h
@@ -16,7 +16,6 @@ extern "C" {
 #endif
 
 struct rte_vdev_device {
-       RTE_TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
        struct rte_device device;               /**< Inherit core device */
 };
 
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
index c360c38ed5..db73b08c38 100644
--- a/drivers/bus/vdev/vdev.c
+++ b/drivers/bus/vdev/vdev.c
@@ -31,9 +31,6 @@
 /* Forward declare to access virtual bus name */
 static struct rte_bus rte_vdev_bus;
 
-
-static TAILQ_HEAD(, rte_vdev_device) vdev_device_list =
-       TAILQ_HEAD_INITIALIZER(vdev_device_list);
 /* The lock needs to be recursive because a vdev can manage another vdev. */
 static rte_spinlock_recursive_t vdev_device_list_lock =
        RTE_SPINLOCK_RECURSIVE_INITIALIZER;
@@ -198,7 +195,7 @@ find_vdev(const char *name)
        if (!name)
                return NULL;
 
-       TAILQ_FOREACH(dev, &vdev_device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vdev_bus) {
                const char *devname = rte_vdev_device_name(dev);
 
                if (!strcmp(devname, name))
@@ -262,7 +259,6 @@ insert_vdev(const char *name, const char *args,
                goto fail;
        }
 
-       dev->device.bus = &rte_vdev_bus;
        dev->device.numa_node = SOCKET_ID_ANY;
 
        if (find_vdev(name)) {
@@ -279,7 +275,7 @@ insert_vdev(const char *name, const char *args,
                rte_devargs_insert(&devargs);
        dev->device.devargs = devargs;
        dev->device.name = devargs->name;
-       TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+       rte_bus_add_device(&rte_vdev_bus, &dev->device);
 
        if (p_dev)
                *p_dev = dev;
@@ -307,7 +303,7 @@ rte_vdev_init(const char *name, const char *args)
                        if (ret > 0)
                                VDEV_LOG(ERR, "no driver found for %s", name);
                        /* If fails, remove it from vdev list */
-                       TAILQ_REMOVE(&vdev_device_list, dev, next);
+                       rte_bus_remove_device(&rte_vdev_bus, &dev->device);
                        rte_devargs_remove(dev->device.devargs);
                        free(dev);
                }
@@ -354,7 +350,7 @@ rte_vdev_uninit(const char *name)
        if (ret)
                goto unlock;
 
-       TAILQ_REMOVE(&vdev_device_list, dev, next);
+       rte_bus_remove_device(&rte_vdev_bus, &dev->device);
        rte_devargs_remove(dev->device.devargs);
        free(dev);
 
@@ -405,7 +401,7 @@ vdev_action(const struct rte_mp_msg *mp_msg, const void 
*peer)
                num = 0;
 
                rte_spinlock_recursive_lock(&vdev_device_list_lock);
-               TAILQ_FOREACH(dev, &vdev_device_list, next) {
+               RTE_BUS_FOREACH_DEV(dev, &rte_vdev_bus) {
                        devname = rte_vdev_device_name(dev);
                        if (strlen(devname) == 0) {
                                VDEV_LOG(INFO, "vdev with no name is not sent");
@@ -511,12 +507,11 @@ vdev_scan(void)
                        continue;
                }
 
-               dev->device.bus = &rte_vdev_bus;
                dev->device.devargs = devargs;
                dev->device.numa_node = SOCKET_ID_ANY;
                dev->device.name = devargs->name;
 
-               TAILQ_INSERT_TAIL(&vdev_device_list, dev, next);
+               rte_bus_add_device(&rte_vdev_bus, &dev->device);
 
                rte_spinlock_recursive_unlock(&vdev_device_list_lock);
        }
@@ -531,7 +526,7 @@ vdev_probe(void)
        int r, ret = 0;
 
        /* call the init function for each virtual device */
-       TAILQ_FOREACH(dev, &vdev_device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vdev_bus) {
                /* we don't use the vdev lock here, as it's only used in DPDK
                 * initialization; and we don't want to hold such a lock when
                 * we call each driver probe.
@@ -553,10 +548,10 @@ vdev_probe(void)
 static int
 vdev_cleanup(void)
 {
-       struct rte_vdev_device *dev, *tmp_dev;
+       struct rte_vdev_device *dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &vdev_device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vdev_bus) {
                const struct rte_vdev_driver *drv;
                int ret;
 
@@ -574,7 +569,7 @@ vdev_cleanup(void)
 
                dev->device.driver = NULL;
 free:
-               TAILQ_REMOVE(&vdev_device_list, dev, next);
+               rte_bus_remove_device(&rte_vdev_bus, &dev->device);
                free(dev);
        }
 
@@ -585,24 +580,22 @@ struct rte_device *
 rte_vdev_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                     const void *data)
 {
-       const struct rte_vdev_device *vstart;
-       struct rte_vdev_device *dev;
+       struct rte_device *dev;
 
        rte_spinlock_recursive_lock(&vdev_device_list_lock);
-       if (start != NULL) {
-               vstart = RTE_BUS_DEVICE(start, *vstart);
-               dev = TAILQ_NEXT(vstart, next);
-       } else {
-               dev = TAILQ_FIRST(&vdev_device_list);
-       }
+       if (start != NULL)
+               dev = TAILQ_NEXT(start, next);
+       else
+               dev = TAILQ_FIRST(&rte_vdev_bus.device_list);
+
        while (dev != NULL) {
-               if (cmp(&dev->device, data) == 0)
+               if (cmp(dev, data) == 0)
                        break;
                dev = TAILQ_NEXT(dev, next);
        }
        rte_spinlock_recursive_unlock(&vdev_device_list_lock);
 
-       return dev ? &dev->device : NULL;
+       return dev;
 }
 
 static int
@@ -624,7 +617,7 @@ vdev_get_iommu_class(void)
        struct rte_vdev_device *dev;
        struct rte_vdev_driver *driver;
 
-       TAILQ_FOREACH(dev, &vdev_device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vdev_bus) {
                name = rte_vdev_device_name(dev);
                if (vdev_parse(name, &driver))
                        continue;
diff --git a/drivers/bus/vmbus/bus_vmbus_driver.h 
b/drivers/bus/vmbus/bus_vmbus_driver.h
index 4a06ff8e66..d53bda2340 100644
--- a/drivers/bus/vmbus/bus_vmbus_driver.h
+++ b/drivers/bus/vmbus/bus_vmbus_driver.h
@@ -37,7 +37,6 @@ enum hv_uio_map {
  * A structure describing a VMBUS device.
  */
 struct rte_vmbus_device {
-       RTE_TAILQ_ENTRY(rte_vmbus_device) next; /**< Next probed VMBUS device */
        const struct rte_vmbus_driver *driver; /**< Associated driver */
        struct rte_device device;              /**< Inherit core device */
        rte_uuid_t device_id;                  /**< VMBUS device id */
diff --git a/drivers/bus/vmbus/linux/vmbus_bus.c 
b/drivers/bus/vmbus/linux/vmbus_bus.c
index 5958b97077..6268a14d40 100644
--- a/drivers/bus/vmbus/linux/vmbus_bus.c
+++ b/drivers/bus/vmbus/linux/vmbus_bus.c
@@ -288,7 +288,6 @@ vmbus_scan_one(const char *name)
        if (dev == NULL)
                return -1;
 
-       dev->device.bus = &rte_vmbus_bus.bus;
        dev->device.name = dev_name = strdup(name);
        if (!dev->device.name)
                goto error;
@@ -357,7 +356,7 @@ vmbus_scan_one(const char *name)
        /* device is valid, add in list (sorted) */
        VMBUS_LOG(DEBUG, "Adding vmbus device %s", name);
 
-       TAILQ_FOREACH(dev2, &rte_vmbus_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev2, &rte_vmbus_bus.bus) {
                int ret;
 
                ret = rte_uuid_compare(dev->device_id, dev2->device_id);
@@ -365,7 +364,7 @@ vmbus_scan_one(const char *name)
                        continue;
 
                if (ret < 0) {
-                       vmbus_insert_device(dev2, dev);
+                       rte_bus_insert_device(&rte_vmbus_bus.bus, 
&dev2->device, &dev->device);
                } else { /* already registered */
                        VMBUS_LOG(NOTICE,
                                "%s already registered", name);
@@ -375,7 +374,7 @@ vmbus_scan_one(const char *name)
                return 0;
        }
 
-       vmbus_add_device(dev);
+       rte_bus_add_device(&rte_vmbus_bus.bus, &dev->device);
        return 0;
 error:
        VMBUS_LOG(DEBUG, "failed");
diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h
index bd1151385c..6abb97c607 100644
--- a/drivers/bus/vmbus/private.h
+++ b/drivers/bus/vmbus/private.h
@@ -20,15 +20,10 @@
  */
 struct rte_vmbus_bus {
        struct rte_bus bus;               /**< Inherit the generic class */
-       RTE_TAILQ_HEAD(, rte_vmbus_device) device_list; /**< List of devices */
 };
 
 extern struct rte_vmbus_bus rte_vmbus_bus;
 
-/* VMBus iterators */
-#define FOREACH_DEVICE_ON_VMBUS(p)     \
-       RTE_TAILQ_FOREACH(p, &(rte_vmbus_bus.device_list), next)
-
 extern int vmbus_logtype_bus;
 #define RTE_LOGTYPE_VMBUS_BUS vmbus_logtype_bus
 #define VMBUS_LOG(level, ...) \
@@ -98,11 +93,6 @@ int vmbus_chan_create(const struct rte_vmbus_device *device,
                      uint16_t relid, uint16_t subid, uint8_t monitor_id,
                      struct vmbus_channel **new_chan);
 
-void vmbus_add_device(struct rte_vmbus_device *vmbus_dev);
-void vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
-                        struct rte_vmbus_device *new_vmbus_dev);
-void vmbus_remove_device(struct rte_vmbus_device *vmbus_device);
-
 void vmbus_uio_irq_control(const struct rte_vmbus_device *dev, int32_t onoff);
 int vmbus_uio_irq_read(struct rte_vmbus_device *dev);
 
diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c
index a414f0a892..889b9347d7 100644
--- a/drivers/bus/vmbus/vmbus_common.c
+++ b/drivers/bus/vmbus/vmbus_common.c
@@ -181,7 +181,7 @@ rte_vmbus_probe(void)
        size_t probed = 0, failed = 0;
        char ubuf[RTE_UUID_STRLEN];
 
-       FOREACH_DEVICE_ON_VMBUS(dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vmbus_bus.bus) {
                probed++;
 
                rte_uuid_unparse(dev->device_id, ubuf, sizeof(ubuf));
@@ -203,10 +203,10 @@ rte_vmbus_probe(void)
 static int
 rte_vmbus_cleanup(void)
 {
-       struct rte_vmbus_device *dev, *tmp_dev;
+       struct rte_vmbus_device *dev;
        int error = 0;
 
-       RTE_TAILQ_FOREACH_SAFE(dev, &rte_vmbus_bus.device_list, next, tmp_dev) {
+       RTE_BUS_FOREACH_DEV(dev, &rte_vmbus_bus.bus) {
                const struct rte_vmbus_driver *drv = dev->driver;
                int ret;
 
@@ -223,7 +223,7 @@ rte_vmbus_cleanup(void)
 
                dev->driver = NULL;
                dev->device.driver = NULL;
-               TAILQ_REMOVE(&rte_vmbus_bus.device_list, dev, next);
+               rte_bus_remove_device(&rte_vmbus_bus.bus, &dev->device);
                free(dev);
        }
 
@@ -274,42 +274,20 @@ rte_vmbus_unregister(struct rte_vmbus_driver *driver)
        rte_bus_remove_driver(&rte_vmbus_bus.bus, &driver->driver);
 }
 
-/* Add a device to VMBUS bus */
-void
-vmbus_add_device(struct rte_vmbus_device *vmbus_dev)
-{
-       TAILQ_INSERT_TAIL(&rte_vmbus_bus.device_list, vmbus_dev, next);
-}
-
-/* Insert a device into a predefined position in VMBUS bus */
-void
-vmbus_insert_device(struct rte_vmbus_device *exist_vmbus_dev,
-                     struct rte_vmbus_device *new_vmbus_dev)
-{
-       TAILQ_INSERT_BEFORE(exist_vmbus_dev, new_vmbus_dev, next);
-}
-
-/* Remove a device from VMBUS bus */
-void
-vmbus_remove_device(struct rte_vmbus_device *vmbus_dev)
-{
-       TAILQ_REMOVE(&rte_vmbus_bus.device_list, vmbus_dev, next);
-}
-
 /* VMBUS doesn't support hotplug */
 static struct rte_device *
 vmbus_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                  const void *data)
 {
-       struct rte_vmbus_device *dev;
+       struct rte_device *dev;
 
-       FOREACH_DEVICE_ON_VMBUS(dev) {
-               if (start && &dev->device == start) {
+       TAILQ_FOREACH(dev, &rte_vmbus_bus.bus.device_list, next) {
+               if (start && dev == start) {
                        start = NULL;
                        continue;
                }
-               if (cmp(&dev->device, data) == 0)
-                       return &dev->device;
+               if (cmp(dev, data) == 0)
+                       return dev;
        }
 
        return NULL;
@@ -325,7 +303,6 @@ struct rte_vmbus_bus rte_vmbus_bus = {
                .parse = vmbus_parse,
                .dev_compare = vmbus_dev_compare,
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(rte_vmbus_bus.device_list),
 };
 
 RTE_REGISTER_BUS(vmbus, rte_vmbus_bus.bus);
diff --git a/drivers/dma/idxd/idxd_bus.c b/drivers/dma/idxd/idxd_bus.c
index 7f4920b274..b3e691a2bd 100644
--- a/drivers/dma/idxd/idxd_bus.c
+++ b/drivers/dma/idxd/idxd_bus.c
@@ -49,16 +49,12 @@ static struct rte_device *dsa_find_device(const struct 
rte_device *start,
 static enum rte_iova_mode dsa_get_iommu_class(void);
 static int dsa_addr_parse(const char *name, void *addr);
 
-/** List of devices */
-TAILQ_HEAD(dsa_device_list, rte_dsa_device);
-
 /**
  * Structure describing the DSA bus
  */
 struct dsa_bus {
        struct rte_bus bus;               /**< Inherit the generic class */
        struct rte_driver driver;         /**< Driver struct for devices to 
point to */
-       struct dsa_device_list device_list;  /**< List of PCI devices */
 };
 
 struct dsa_bus dsa_bus = {
@@ -72,7 +68,6 @@ struct dsa_bus dsa_bus = {
        .driver = {
                .name = "dmadev_idxd",
        },
-       .device_list = TAILQ_HEAD_INITIALIZER(dsa_bus.device_list),
 };
 
 static inline const char *
@@ -274,7 +269,7 @@ dsa_probe(void)
 {
        struct rte_dsa_device *dev;
 
-       TAILQ_FOREACH(dev, &dsa_bus.device_list, next) {
+       RTE_BUS_FOREACH_DEV(dev, &dsa_bus.bus) {
                char type[64], name[64];
 
                if (read_wq_string(dev, "type", type, sizeof(type)) < 0 ||
@@ -332,9 +327,8 @@ dsa_scan(void)
                        free(dev);
                        continue;
                }
-               dev->device.bus = &dsa_bus.bus;
                strlcpy(dev->wq_name, wq->d_name, sizeof(dev->wq_name));
-               TAILQ_INSERT_TAIL(&dsa_bus.device_list, dev, next);
+               rte_bus_add_device(&dsa_bus.bus, &dev->device);
                devcount++;
 
                read_device_int(dev, "numa_node", &numa_node);
@@ -350,16 +344,13 @@ static struct rte_device *
 dsa_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                         const void *data)
 {
-       struct rte_dsa_device *dev = TAILQ_FIRST(&dsa_bus.device_list);
-
-       /* the rte_device struct must be at start of dsa structure */
-       RTE_BUILD_BUG_ON(offsetof(struct rte_dsa_device, device) != 0);
+       struct rte_device *dev = TAILQ_FIRST(&dsa_bus.bus.device_list);
 
        if (start != NULL) /* jump to start point if given */
-               dev = TAILQ_NEXT((const struct rte_dsa_device *)start, next);
+               dev = TAILQ_NEXT(start, next);
        while (dev != NULL) {
-               if (cmp(&dev->device, data) == 0)
-                       return &dev->device;
+               if (cmp(dev, data) == 0)
+                       return dev;
                dev = TAILQ_NEXT(dev, next);
        }
        return NULL;
diff --git a/lib/eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c
index e155936014..2748e99826 100644
--- a/lib/eal/common/eal_common_bus.c
+++ b/lib/eal/common/eal_common_bus.c
@@ -38,6 +38,7 @@ rte_bus_register(struct rte_bus *bus)
        /* Buses supporting driver plug also require unplug. */
        RTE_VERIFY(!bus->plug || bus->unplug);
 
+       TAILQ_INIT(&bus->device_list);
        TAILQ_INIT(&bus->driver_list);
        TAILQ_INSERT_TAIL(&rte_bus_list, bus, next);
        EAL_LOG(DEBUG, "Registered [%s] bus.", rte_bus_name(bus));
@@ -371,6 +372,32 @@ rte_bus_sigbus_handler(const void *failure_addr)
        return ret;
 }
 
+RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_add_device)
+void
+rte_bus_add_device(struct rte_bus *bus, struct rte_device *dev)
+{
+       TAILQ_INSERT_TAIL(&bus->device_list, dev, next);
+       dev->bus = bus;
+}
+
+RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_remove_device)
+void
+rte_bus_remove_device(struct rte_bus *bus, struct rte_device *dev)
+{
+       TAILQ_REMOVE(&bus->device_list, dev, next);
+       dev->bus = NULL;
+}
+
+RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_insert_device)
+void
+rte_bus_insert_device(struct rte_bus *bus,
+                     struct rte_device *exist_dev,
+                     struct rte_device *new_dev)
+{
+       TAILQ_INSERT_BEFORE(exist_dev, new_dev, next);
+       new_dev->bus = bus;
+}
+
 RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_add_driver)
 void
 rte_bus_add_driver(struct rte_bus *bus, struct rte_driver *driver)
diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h
index 3c8f661a17..5b40fcd606 100644
--- a/lib/eal/include/bus_driver.h
+++ b/lib/eal/include/bus_driver.h
@@ -286,6 +286,7 @@ struct rte_bus {
        rte_bus_sigbus_handler_t sigbus_handler;
                                        /**< handle sigbus error on the bus */
        rte_bus_cleanup_t cleanup;   /**< Cleanup devices on bus */
+       RTE_TAILQ_HEAD(, rte_device) device_list; /**< List of devices on the 
bus */
        RTE_TAILQ_HEAD(, rte_driver) driver_list; /**< List of drivers on the 
bus */
 };
 
@@ -371,6 +372,64 @@ void rte_bus_unregister(struct rte_bus *bus);
 #define RTE_BUS_DRIVER(drv, bus_drv_type) \
        container_of(drv, typeof(bus_drv_type), driver)
 
+/**
+ * Helper macro to iterate over all devices on a bus.
+ *
+ * @param dev
+ *   Variable name for the bus-specific device pointer.
+ * @param bus
+ *   Pointer to the bus structure.
+ *
+ * Example:
+ *   struct rte_pci_device *pci_dev;
+ *   RTE_BUS_FOREACH_DEV(pci_dev, &pci_bus.bus) {
+ *       // Use pci_dev here
+ *   }
+ */
+#define RTE_BUS_FOREACH_DEV(dev, bus) \
+       for (struct rte_device *__rte_dev = TAILQ_FIRST(&(bus)->device_list), 
*__rte_dev_tmp; \
+                       (__rte_dev != NULL && ((dev) = 
RTE_BUS_DEVICE(__rte_dev, *dev), \
+                               __rte_dev_tmp = TAILQ_NEXT(__rte_dev, next), 
1)) || \
+                       (dev = NULL, 0); \
+                       __rte_dev = __rte_dev_tmp)
+
+/**
+ * Add a device to the bus device list.
+ *
+ * @param bus
+ *   A pointer to a rte_bus structure.
+ * @param dev
+ *   A pointer to a rte_device structure to add.
+ */
+__rte_internal
+void rte_bus_add_device(struct rte_bus *bus, struct rte_device *dev);
+
+/**
+ * Remove a device from the bus device list.
+ *
+ * @param bus
+ *   A pointer to a rte_bus structure.
+ * @param dev
+ *   A pointer to a rte_device structure to remove.
+ */
+__rte_internal
+void rte_bus_remove_device(struct rte_bus *bus, struct rte_device *dev);
+
+/**
+ * Insert a device before another in the bus device list.
+ *
+ * @param bus
+ *   A pointer to a rte_bus structure.
+ * @param exist_dev
+ *   Existing device in the list.
+ * @param new_dev
+ *   New device to insert before exist_dev.
+ */
+__rte_internal
+void rte_bus_insert_device(struct rte_bus *bus,
+                          struct rte_device *exist_dev,
+                          struct rte_device *new_dev);
+
 /**
  * Helper macro to iterate over all drivers on a bus.
  *
-- 
2.53.0

Reply via email to