[PATCH 08/23] bus: factorize device list
David Marchand
david.marchand at redhat.com
Wed Apr 29 13:44:41 CEST 2026
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 <david.marchand at redhat.com>
---
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
More information about the dev
mailing list