Move driver_list management from individual bus implementations to common EAL bus code. This eliminates duplication and provides a consistent API for driver registration across all buses.
Introduce rte_bus_add_driver() and rte_bus_remove_driver() helpers that manage a per-bus driver list internally in EAL. Update all buses to use these common helpers and remove bus-specific driver_list fields and iteration macros. Store a reference to the bus object in the generic driver. Also update the dma/idxd code that has only one hardcoded driver. Signed-off-by: David Marchand <[email protected]> --- drivers/bus/auxiliary/auxiliary_common.c | 11 +++-- drivers/bus/auxiliary/bus_auxiliary_driver.h | 1 - drivers/bus/auxiliary/linux/auxiliary.c | 3 +- drivers/bus/auxiliary/private.h | 4 -- drivers/bus/cdx/bus_cdx_driver.h | 2 - drivers/bus/cdx/cdx.c | 12 ++---- drivers/bus/cdx/private.h | 1 - drivers/bus/dpaa/bus_dpaa_driver.h | 1 - drivers/bus/dpaa/dpaa_bus.c | 8 ++-- drivers/bus/fslmc/bus_fslmc_driver.h | 1 - drivers/bus/fslmc/fslmc_bus.c | 11 +++-- drivers/bus/fslmc/private.h | 2 - drivers/bus/ifpga/bus_ifpga_driver.h | 3 +- drivers/bus/ifpga/ifpga_bus.c | 9 ++-- drivers/bus/pci/bus_pci_driver.h | 1 - drivers/bus/pci/pci_common.c | 9 ++-- drivers/bus/pci/private.h | 4 -- drivers/bus/platform/bus_platform_driver.h | 1 - drivers/bus/platform/platform.c | 9 ++-- drivers/bus/platform/private.h | 4 -- drivers/bus/uacce/bus_uacce_driver.h | 2 - drivers/bus/uacce/uacce.c | 12 ++---- drivers/bus/vdev/bus_vdev_driver.h | 1 - drivers/bus/vdev/vdev.c | 9 ++-- drivers/bus/vmbus/bus_vmbus_driver.h | 1 - drivers/bus/vmbus/private.h | 4 -- drivers/bus/vmbus/vmbus_common.c | 7 ++-- drivers/dma/idxd/idxd_bus.c | 6 ++- lib/eal/common/eal_common_bus.c | 17 ++++++++ lib/eal/include/bus_driver.h | 44 ++++++++++++++++++++ lib/eal/include/dev_driver.h | 1 + 31 files changed, 106 insertions(+), 95 deletions(-) diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c index afb4a7ce1b..7e2d832dda 100644 --- a/drivers/bus/auxiliary/auxiliary_common.c +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -171,7 +171,7 @@ auxiliary_probe_all_drivers(struct rte_auxiliary_device *dev) struct rte_auxiliary_driver *drv; int rc; - FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + RTE_BUS_FOREACH_DRV(drv, &auxiliary_bus.bus) { if (!drv->match(dev->name)) continue; @@ -226,7 +226,7 @@ auxiliary_parse(const char *name, void *addr) if (strlen(name) == 0) return 0; - FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + RTE_BUS_FOREACH_DRV(drv, &auxiliary_bus.bus) { if (drv->match(name)) break; } @@ -240,7 +240,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_auxiliary_register) void rte_auxiliary_register(struct rte_auxiliary_driver *driver) { - TAILQ_INSERT_TAIL(&auxiliary_bus.driver_list, driver, next); + rte_bus_add_driver(&auxiliary_bus.bus, &driver->driver); } /* Unregister a driver */ @@ -248,7 +248,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_auxiliary_unregister) void rte_auxiliary_unregister(struct rte_auxiliary_driver *driver) { - TAILQ_REMOVE(&auxiliary_bus.driver_list, driver, next); + rte_bus_remove_driver(&auxiliary_bus.bus, &driver->driver); } /* Add a device to auxiliary bus */ @@ -369,7 +369,7 @@ auxiliary_get_iommu_class(void) { const struct rte_auxiliary_driver *drv; - FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + RTE_BUS_FOREACH_DRV(drv, &auxiliary_bus.bus) { if ((drv->drv_flags & RTE_AUXILIARY_DRV_NEED_IOVA_AS_VA) > 0) return RTE_IOVA_VA; } @@ -392,7 +392,6 @@ struct rte_auxiliary_bus auxiliary_bus = { .dev_iterate = auxiliary_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(auxiliary_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(auxiliary_bus.driver_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 5c14592f6f..59c46e08a0 100644 --- a/drivers/bus/auxiliary/bus_auxiliary_driver.h +++ b/drivers/bus/auxiliary/bus_auxiliary_driver.h @@ -121,7 +121,6 @@ struct rte_auxiliary_device { * A structure describing an auxiliary driver. */ struct rte_auxiliary_driver { - RTE_TAILQ_ENTRY(rte_auxiliary_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherit core driver. */ rte_auxiliary_match_t *match; /**< Device match function. */ rte_auxiliary_probe_t *probe; /**< Device probe function. */ diff --git a/drivers/bus/auxiliary/linux/auxiliary.c b/drivers/bus/auxiliary/linux/auxiliary.c index 4cfd0a266c..7c430629d0 100644 --- a/drivers/bus/auxiliary/linux/auxiliary.c +++ b/drivers/bus/auxiliary/linux/auxiliary.c @@ -117,7 +117,8 @@ auxiliary_scan(void) AUXILIARY_SYSFS_PATH, e->d_name); /* Ignore if no driver can handle. */ - FOREACH_DRIVER_ON_AUXILIARY_BUS(drv) { + drv = NULL; + RTE_BUS_FOREACH_DRV(drv, &auxiliary_bus.bus) { if (drv->match(e->d_name)) break; } diff --git a/drivers/bus/auxiliary/private.h b/drivers/bus/auxiliary/private.h index 6e61a5f494..66ba97b946 100644 --- a/drivers/bus/auxiliary/private.h +++ b/drivers/bus/auxiliary/private.h @@ -25,7 +25,6 @@ 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 */ - TAILQ_HEAD(, rte_auxiliary_driver) driver_list; /* List of drivers */ }; extern struct rte_auxiliary_bus auxiliary_bus; @@ -34,9 +33,6 @@ extern struct rte_auxiliary_bus auxiliary_bus; #define FOREACH_DEVICE_ON_AUXILIARY_BUS(p) \ TAILQ_FOREACH(p, &(auxiliary_bus.device_list), next) -#define FOREACH_DRIVER_ON_AUXILIARY_BUS(p) \ - TAILQ_FOREACH(p, &(auxiliary_bus.driver_list), next) - /* * Test whether the auxiliary device exist. */ diff --git a/drivers/bus/cdx/bus_cdx_driver.h b/drivers/bus/cdx/bus_cdx_driver.h index 935e37158a..823a5b1be3 100644 --- a/drivers/bus/cdx/bus_cdx_driver.h +++ b/drivers/bus/cdx/bus_cdx_driver.h @@ -91,9 +91,7 @@ typedef int (rte_cdx_remove_t)(struct rte_cdx_device *); * A structure describing a CDX driver. */ struct rte_cdx_driver { - RTE_TAILQ_ENTRY(rte_cdx_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherit core driver. */ - struct rte_cdx_bus *bus; /**< CDX bus reference. */ rte_cdx_probe_t *probe; /**< Device probe function. */ rte_cdx_remove_t *remove; /**< Device remove function. */ const struct rte_cdx_id *id_table; /**< ID table, NULL terminated. */ diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c index 267c7598c7..5973f75be2 100644 --- a/drivers/bus/cdx/cdx.c +++ b/drivers/bus/cdx/cdx.c @@ -88,9 +88,6 @@ #define FOREACH_DEVICE_ON_CDXBUS(p) \ RTE_TAILQ_FOREACH(p, &rte_cdx_bus.device_list, next) -#define FOREACH_DRIVER_ON_CDXBUS(p) \ - RTE_TAILQ_FOREACH(p, &rte_cdx_bus.driver_list, next) - struct rte_cdx_bus rte_cdx_bus; enum cdx_params { @@ -394,7 +391,7 @@ cdx_probe_all_drivers(struct rte_cdx_device *dev) struct rte_cdx_driver *dr = NULL; int rc = 0; - FOREACH_DRIVER_ON_CDXBUS(dr) { + RTE_BUS_FOREACH_DRV(dr, &rte_cdx_bus.bus) { rc = cdx_probe_one_driver(dr, dev); if (rc < 0) /* negative value is an error */ @@ -453,8 +450,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_cdx_register) void rte_cdx_register(struct rte_cdx_driver *driver) { - TAILQ_INSERT_TAIL(&rte_cdx_bus.driver_list, driver, next); - driver->bus = &rte_cdx_bus; + rte_bus_add_driver(&rte_cdx_bus.bus, &driver->driver); } /* unregister a driver */ @@ -462,8 +458,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_cdx_unregister) void rte_cdx_unregister(struct rte_cdx_driver *driver) { - TAILQ_REMOVE(&rte_cdx_bus.driver_list, driver, next); - driver->bus = NULL; + rte_bus_remove_driver(&rte_cdx_bus.bus, &driver->driver); } static struct rte_device * @@ -630,7 +625,6 @@ struct rte_cdx_bus rte_cdx_bus = { .dev_iterate = cdx_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_cdx_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(rte_cdx_bus.driver_list), }; RTE_REGISTER_BUS(cdx, rte_cdx_bus.bus); diff --git a/drivers/bus/cdx/private.h b/drivers/bus/cdx/private.h index 81987d0cfe..3807a17bfb 100644 --- a/drivers/bus/cdx/private.h +++ b/drivers/bus/cdx/private.h @@ -13,7 +13,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 */ - RTE_TAILQ_HEAD(, rte_cdx_driver) driver_list; /**< List of CDX drivers */ }; /** diff --git a/drivers/bus/dpaa/bus_dpaa_driver.h b/drivers/bus/dpaa/bus_dpaa_driver.h index 64cbfd8e92..1575ed19e7 100644 --- a/drivers/bus/dpaa/bus_dpaa_driver.h +++ b/drivers/bus/dpaa/bus_dpaa_driver.h @@ -98,7 +98,6 @@ typedef int (*rte_dpaa_probe_t)(struct rte_dpaa_driver *dpaa_drv, typedef int (*rte_dpaa_remove_t)(struct rte_dpaa_device *dpaa_dev); struct rte_dpaa_driver { - TAILQ_ENTRY(rte_dpaa_driver) next; struct rte_driver driver; enum rte_dpaa_type drv_type; rte_dpaa_probe_t probe; diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index ca6fd06ac0..f9f902cbd6 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -60,7 +60,6 @@ struct rte_dpaa_bus { struct rte_bus bus; TAILQ_HEAD(, rte_dpaa_device) device_list; - TAILQ_HEAD(, rte_dpaa_driver) driver_list; int device_count; int detected; uint32_t svr_ver; @@ -618,7 +617,7 @@ rte_dpaa_driver_register(struct rte_dpaa_driver *driver) BUS_INIT_FUNC_TRACE(); - TAILQ_INSERT_TAIL(&rte_dpaa_bus.driver_list, driver, next); + rte_bus_add_driver(&rte_dpaa_bus.bus, &driver->driver); } /* un-register a dpaa bus based dpaa driver */ @@ -628,7 +627,7 @@ rte_dpaa_driver_unregister(struct rte_dpaa_driver *driver) { BUS_INIT_FUNC_TRACE(); - TAILQ_REMOVE(&rte_dpaa_bus.driver_list, driver, next); + rte_bus_remove_driver(&rte_dpaa_bus.bus, &driver->driver); } static int @@ -797,7 +796,7 @@ rte_dpaa_bus_probe(void) /* For each registered driver, and device, call the driver->probe */ TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) { - TAILQ_FOREACH(drv, &rte_dpaa_bus.driver_list, next) { + RTE_BUS_FOREACH_DRV(drv, &rte_dpaa_bus.bus) { ret = rte_dpaa_device_match(drv, dev); if (ret) continue; @@ -990,7 +989,6 @@ static struct rte_dpaa_bus rte_dpaa_bus = { }, .max_push_rxq_num = DPAA_DEFAULT_PUSH_MODE_QUEUE, .device_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.driver_list), .device_count = 0, }; diff --git a/drivers/bus/fslmc/bus_fslmc_driver.h b/drivers/bus/fslmc/bus_fslmc_driver.h index 51bca8a6ef..c82b182720 100644 --- a/drivers/bus/fslmc/bus_fslmc_driver.h +++ b/drivers/bus/fslmc/bus_fslmc_driver.h @@ -138,7 +138,6 @@ rte_fslmc_vfio_mem_dmaunmap(uint64_t iova, uint64_t size); * A structure describing a DPAA2 driver. */ struct rte_dpaa2_driver { - TAILQ_ENTRY(rte_dpaa2_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherit core driver. */ uint32_t drv_flags; /**< Flags for controlling device.*/ enum rte_dpaa2_dev_type drv_type; /**< Driver Type */ diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index 59c9d85bb8..36ec018785 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -457,7 +457,7 @@ rte_fslmc_probe(void) } TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) { - TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { + RTE_BUS_FOREACH_DRV(drv, &rte_fslmc_bus.bus) { ret = rte_fslmc_match(drv, dev); if (ret) continue; @@ -522,7 +522,7 @@ rte_fslmc_driver_register(struct rte_dpaa2_driver *driver) RTE_VERIFY(driver); RTE_VERIFY(driver->probe != NULL); - TAILQ_INSERT_TAIL(&rte_fslmc_bus.driver_list, driver, next); + rte_bus_add_driver(&rte_fslmc_bus.bus, &driver->driver); } /*un-register a fslmc bus based dpaa2 driver */ @@ -530,7 +530,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_fslmc_driver_unregister) void rte_fslmc_driver_unregister(struct rte_dpaa2_driver *driver) { - TAILQ_REMOVE(&rte_fslmc_bus.driver_list, driver, next); + rte_bus_remove_driver(&rte_fslmc_bus.bus, &driver->driver); } /* @@ -544,7 +544,7 @@ fslmc_all_device_support_iova(void) struct rte_dpaa2_driver *drv; TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) { - TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { + RTE_BUS_FOREACH_DRV(drv, &rte_fslmc_bus.bus) { ret = rte_fslmc_match(drv, dev); if (ret) continue; @@ -582,7 +582,7 @@ fslmc_bus_plug(struct rte_device *rte_dev) struct rte_dpaa2_device *dev = RTE_BUS_DEVICE(rte_dev, *dev); struct rte_dpaa2_driver *drv; - TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { + RTE_BUS_FOREACH_DRV(drv, &rte_fslmc_bus.bus) { ret = rte_fslmc_match(drv, dev); if (ret) continue; @@ -688,7 +688,6 @@ struct rte_fslmc_bus rte_fslmc_bus = { .dev_iterate = fslmc_bus_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_fslmc_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(rte_fslmc_bus.driver_list), .device_count = {0}, }; diff --git a/drivers/bus/fslmc/private.h b/drivers/bus/fslmc/private.h index 6f14085d98..338f55b094 100644 --- a/drivers/bus/fslmc/private.h +++ b/drivers/bus/fslmc/private.h @@ -16,8 +16,6 @@ struct rte_fslmc_bus { struct rte_bus bus; /**< Generic Bus object */ TAILQ_HEAD(, rte_dpaa2_device) device_list; /**< FSLMC DPAA2 Device list */ - TAILQ_HEAD(, rte_dpaa2_driver) driver_list; - /**< FSLMC DPAA2 Driver 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 b0ba8c9e64..7d724dc1a0 100644 --- a/drivers/bus/ifpga/bus_ifpga_driver.h +++ b/drivers/bus/ifpga/bus_ifpga_driver.h @@ -91,10 +91,9 @@ typedef int (afu_probe_t)(struct rte_afu_device *); typedef int (afu_remove_t)(struct rte_afu_device *); /** - * A structure describing a AFU device. + * A structure describing a AFU driver. */ struct rte_afu_driver { - RTE_TAILQ_ENTRY(rte_afu_driver) next; /**< Next afu driver. */ struct rte_driver driver; /**< Inherit core driver. */ afu_probe_t *probe; /**< Device Probe function. */ afu_remove_t *remove; /**< Device Remove function. */ diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index 63f6a01cde..c038144ebd 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -40,9 +40,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); -static TAILQ_HEAD(, rte_afu_driver) ifpga_afu_drv_list = - TAILQ_HEAD_INITIALIZER(ifpga_afu_drv_list); - /* register a ifpga bus based driver */ RTE_EXPORT_INTERNAL_SYMBOL(rte_ifpga_driver_register) @@ -50,14 +47,14 @@ void rte_ifpga_driver_register(struct rte_afu_driver *driver) { RTE_VERIFY(driver); - TAILQ_INSERT_TAIL(&ifpga_afu_drv_list, driver, next); + rte_bus_add_driver(&rte_ifpga_bus, &driver->driver); } /* un-register a fpga bus based driver */ RTE_EXPORT_INTERNAL_SYMBOL(rte_ifpga_driver_unregister) void rte_ifpga_driver_unregister(struct rte_afu_driver *driver) { - TAILQ_REMOVE(&ifpga_afu_drv_list, driver, next); + rte_bus_remove_driver(&rte_ifpga_bus, &driver->driver); } static struct rte_afu_device * @@ -309,7 +306,7 @@ ifpga_probe_all_drivers(struct rte_afu_device *afu_dev) return -EEXIST; } - TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) { + RTE_BUS_FOREACH_DRV(drv, &rte_ifpga_bus) { ret = ifpga_probe_one_driver(drv, afu_dev); if (ret < 0) /* negative value is an error */ diff --git a/drivers/bus/pci/bus_pci_driver.h b/drivers/bus/pci/bus_pci_driver.h index 22ab962f05..993d690f96 100644 --- a/drivers/bus/pci/bus_pci_driver.h +++ b/drivers/bus/pci/bus_pci_driver.h @@ -122,7 +122,6 @@ typedef int (pci_dma_unmap_t)(struct rte_pci_device *dev, void *addr, * A structure describing a PCI driver. */ struct rte_pci_driver { - RTE_TAILQ_ENTRY(rte_pci_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherit core driver. */ rte_pci_probe_t *probe; /**< Device probe function. */ rte_pci_remove_t *remove; /**< Device remove function. */ diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index f3d7878966..79cc14a6dd 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -358,7 +358,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev) if (dev == NULL) return -EINVAL; - FOREACH_DRIVER_ON_PCIBUS(dr) { + RTE_BUS_FOREACH_DRV(dr, &rte_pci_bus.bus) { rc = rte_pci_probe_one_driver(dr, dev); if (rc < 0) /* negative value is an error */ @@ -501,7 +501,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_pci_register) void rte_pci_register(struct rte_pci_driver *driver) { - TAILQ_INSERT_TAIL(&rte_pci_bus.driver_list, driver, next); + rte_bus_add_driver(&rte_pci_bus.bus, &driver->driver); } /* unregister a driver */ @@ -509,7 +509,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_pci_unregister) void rte_pci_unregister(struct rte_pci_driver *driver) { - TAILQ_REMOVE(&rte_pci_bus.driver_list, driver, next); + rte_bus_remove_driver(&rte_pci_bus.bus, &driver->driver); } /* Add a device to PCI bus */ @@ -720,7 +720,7 @@ rte_pci_get_iommu_class(void) if (dev->kdrv == RTE_PCI_KDRV_UNKNOWN || dev->kdrv == RTE_PCI_KDRV_NONE) continue; - FOREACH_DRIVER_ON_PCIBUS(drv) { + RTE_BUS_FOREACH_DRV(drv, &rte_pci_bus.bus) { enum rte_iova_mode dev_iova_mode; if (!rte_pci_match(drv, dev)) @@ -917,7 +917,6 @@ struct rte_pci_bus rte_pci_bus = { .sigbus_handler = pci_sigbus_handler, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list), }; RTE_REGISTER_BUS(pci, rte_pci_bus.bus); diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index 8591c4a0a7..8b5f563dc3 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -35,7 +35,6 @@ 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 */ - RTE_TAILQ_HEAD(, rte_pci_driver) driver_list; /**< List of PCI drivers */ }; extern struct rte_pci_bus rte_pci_bus; @@ -44,9 +43,6 @@ extern struct rte_pci_bus rte_pci_bus; #define FOREACH_DEVICE_ON_PCIBUS(p) \ RTE_TAILQ_FOREACH(p, &(rte_pci_bus.device_list), next) -#define FOREACH_DRIVER_ON_PCIBUS(p) \ - RTE_TAILQ_FOREACH(p, &(rte_pci_bus.driver_list), next) - struct rte_pci_driver; struct rte_pci_device; diff --git a/drivers/bus/platform/bus_platform_driver.h b/drivers/bus/platform/bus_platform_driver.h index 09eb08e347..a72d5c00a3 100644 --- a/drivers/bus/platform/bus_platform_driver.h +++ b/drivers/bus/platform/bus_platform_driver.h @@ -107,7 +107,6 @@ struct rte_platform_device { * A structure describing a platform device driver. */ struct rte_platform_driver { - RTE_TAILQ_ENTRY(rte_platform_driver) next; /**< Next available platform driver */ struct rte_driver driver; /**< Core driver */ rte_platform_probe_t *probe; /**< Device probe function */ rte_platform_remove_t *remove; /**< Device remove function */ diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c index 0e57473f25..9d3c4877b0 100644 --- a/drivers/bus/platform/platform.c +++ b/drivers/bus/platform/platform.c @@ -33,14 +33,14 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_platform_register) void rte_platform_register(struct rte_platform_driver *pdrv) { - TAILQ_INSERT_TAIL(&platform_bus.driver_list, pdrv, next); + rte_bus_add_driver(&platform_bus.bus, &pdrv->driver); } RTE_EXPORT_INTERNAL_SYMBOL(rte_platform_unregister) void rte_platform_unregister(struct rte_platform_driver *pdrv) { - TAILQ_REMOVE(&platform_bus.driver_list, pdrv, next); + rte_bus_remove_driver(&platform_bus.bus, &pdrv->driver); } static int @@ -408,7 +408,7 @@ device_attach(struct rte_platform_device *pdev) { struct rte_platform_driver *pdrv; - FOREACH_DRIVER_ON_PLATFORM_BUS(pdrv) { + RTE_BUS_FOREACH_DRV(pdrv, &platform_bus.bus) { if (driver_match_device(pdrv, pdev)) break; } @@ -510,7 +510,7 @@ platform_bus_parse(const char *name, void *addr) rte_strscpy(pdev.name, name, sizeof(pdev.name)); - FOREACH_DRIVER_ON_PLATFORM_BUS(pdrv) { + RTE_BUS_FOREACH_DRV(pdrv, &platform_bus.bus) { if (driver_match_device(pdrv, &pdev)) break; } @@ -589,7 +589,6 @@ struct rte_platform_bus platform_bus = { .cleanup = platform_bus_cleanup, }, .device_list = TAILQ_HEAD_INITIALIZER(platform_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(platform_bus.driver_list), }; RTE_REGISTER_BUS(platform, platform_bus.bus); diff --git a/drivers/bus/platform/private.h b/drivers/bus/platform/private.h index d89ba0e4a5..f7ee80f3ac 100644 --- a/drivers/bus/platform/private.h +++ b/drivers/bus/platform/private.h @@ -20,16 +20,12 @@ extern struct rte_platform_bus platform_bus; #define FOREACH_DEVICE_ON_PLATFORM_BUS(p) \ RTE_TAILQ_FOREACH(p, &(platform_bus.device_list), next) -#define FOREACH_DRIVER_ON_PLATFORM_BUS(p) \ - RTE_TAILQ_FOREACH(p, &(platform_bus.driver_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 */ - RTE_TAILQ_HEAD(, rte_platform_driver) driver_list; /* List of bus drivers */ }; extern int platform_bus_logtype; diff --git a/drivers/bus/uacce/bus_uacce_driver.h b/drivers/bus/uacce/bus_uacce_driver.h index 476afbc857..051e1736cf 100644 --- a/drivers/bus/uacce/bus_uacce_driver.h +++ b/drivers/bus/uacce/bus_uacce_driver.h @@ -85,9 +85,7 @@ typedef int (rte_uacce_remove_t)(struct rte_uacce_device *); * A structure describing a UACCE driver. */ struct rte_uacce_driver { - RTE_TAILQ_ENTRY(rte_uacce_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherit core driver. */ - struct rte_uacce_bus *bus; /**< UACCE bus reference. */ rte_uacce_probe_t *probe; /**< Device probe function. */ rte_uacce_remove_t *remove; /**< Device remove function. */ const struct rte_uacce_id *id_table; /**< ID table, NULL terminated. */ diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c index 6e1eb73e68..c0a1e1d8ec 100644 --- a/drivers/bus/uacce/uacce.c +++ b/drivers/bus/uacce/uacce.c @@ -40,7 +40,6 @@ struct rte_uacce_bus { struct rte_bus bus; /* Inherit the generic class. */ TAILQ_HEAD(, rte_uacce_device) device_list; /* List of devices. */ - TAILQ_HEAD(, rte_uacce_driver) driver_list; /* List of drivers. */ }; /* Forward declaration of UACCE bus. */ @@ -57,8 +56,6 @@ static const char *const uacce_params_keys[] = { #define FOREACH_DEVICE_ON_UACCEBUS(p) \ RTE_TAILQ_FOREACH(p, &uacce_bus.device_list, next) -#define FOREACH_DRIVER_ON_UACCEBUS(p) \ - RTE_TAILQ_FOREACH(p, &uacce_bus.driver_list, next) extern int uacce_bus_logtype; #define RTE_LOGTYPE_UACCE_BUS uacce_bus_logtype @@ -407,7 +404,7 @@ uacce_probe_all_drivers(struct rte_uacce_device *dev) struct rte_uacce_driver *dr; int rc; - FOREACH_DRIVER_ON_UACCEBUS(dr) { + RTE_BUS_FOREACH_DRV(dr, &uacce_bus.bus) { rc = uacce_probe_one_driver(dr, dev); if (rc < 0) /* negative value is an error */ @@ -689,16 +686,14 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_uacce_register) void rte_uacce_register(struct rte_uacce_driver *driver) { - TAILQ_INSERT_TAIL(&uacce_bus.driver_list, driver, next); - driver->bus = &uacce_bus; + rte_bus_add_driver(&uacce_bus.bus, &driver->driver); } RTE_EXPORT_INTERNAL_SYMBOL(rte_uacce_unregister) void rte_uacce_unregister(struct rte_uacce_driver *driver) { - TAILQ_REMOVE(&uacce_bus.driver_list, driver, next); - driver->bus = NULL; + rte_bus_remove_driver(&uacce_bus.bus, &driver->driver); } static struct rte_uacce_bus uacce_bus = { @@ -713,7 +708,6 @@ static struct rte_uacce_bus uacce_bus = { .dev_iterate = uacce_dev_iterate, }, .device_list = TAILQ_HEAD_INITIALIZER(uacce_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(uacce_bus.driver_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 f352daabda..eceaa56696 100644 --- a/drivers/bus/vdev/bus_vdev_driver.h +++ b/drivers/bus/vdev/bus_vdev_driver.h @@ -91,7 +91,6 @@ typedef int (rte_vdev_dma_unmap_t)(struct rte_vdev_device *dev, void *addr, * A virtual device driver abstraction. */ struct rte_vdev_driver { - RTE_TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */ struct rte_driver driver; /**< Inherited general driver. */ rte_vdev_probe_t *probe; /**< Virtual device probe function. */ rte_vdev_remove_t *remove; /**< Virtual device remove function. */ diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index ea81b755e3..c360c38ed5 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -38,9 +38,6 @@ static TAILQ_HEAD(, rte_vdev_device) vdev_device_list = static rte_spinlock_recursive_t vdev_device_list_lock = RTE_SPINLOCK_RECURSIVE_INITIALIZER; -static TAILQ_HEAD(, rte_vdev_driver) vdev_driver_list = - TAILQ_HEAD_INITIALIZER(vdev_driver_list); - struct vdev_custom_scan { TAILQ_ENTRY(vdev_custom_scan) next; rte_vdev_scan_callback callback; @@ -56,7 +53,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_vdev_register) void rte_vdev_register(struct rte_vdev_driver *driver) { - TAILQ_INSERT_TAIL(&vdev_driver_list, driver, next); + rte_bus_add_driver(&rte_vdev_bus, &driver->driver); } /* unregister a driver */ @@ -64,7 +61,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_vdev_unregister) void rte_vdev_unregister(struct rte_vdev_driver *driver) { - TAILQ_REMOVE(&vdev_driver_list, driver, next); + rte_bus_remove_driver(&rte_vdev_bus, &driver->driver); } RTE_EXPORT_SYMBOL(rte_vdev_add_custom_scan) @@ -123,7 +120,7 @@ vdev_parse(const char *name, void *addr) struct rte_vdev_driver **out = addr; struct rte_vdev_driver *driver = NULL; - TAILQ_FOREACH(driver, &vdev_driver_list, next) { + RTE_BUS_FOREACH_DRV(driver, &rte_vdev_bus) { if (strncmp(driver->driver.name, name, strlen(driver->driver.name)) == 0) break; diff --git a/drivers/bus/vmbus/bus_vmbus_driver.h b/drivers/bus/vmbus/bus_vmbus_driver.h index fca512db31..4a06ff8e66 100644 --- a/drivers/bus/vmbus/bus_vmbus_driver.h +++ b/drivers/bus/vmbus/bus_vmbus_driver.h @@ -68,7 +68,6 @@ typedef int (vmbus_remove_t)(struct rte_vmbus_device *); * A structure describing a VMBUS driver. */ struct rte_vmbus_driver { - RTE_TAILQ_ENTRY(rte_vmbus_driver) next; /**< Next in list. */ struct rte_driver driver; vmbus_probe_t *probe; /**< Device Probe function. */ vmbus_remove_t *remove; /**< Device Remove function. */ diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h index 8ac6119ef2..bd1151385c 100644 --- a/drivers/bus/vmbus/private.h +++ b/drivers/bus/vmbus/private.h @@ -21,7 +21,6 @@ struct rte_vmbus_bus { struct rte_bus bus; /**< Inherit the generic class */ RTE_TAILQ_HEAD(, rte_vmbus_device) device_list; /**< List of devices */ - RTE_TAILQ_HEAD(, rte_vmbus_driver) driver_list; /**< List of drivers */ }; extern struct rte_vmbus_bus rte_vmbus_bus; @@ -30,9 +29,6 @@ extern struct rte_vmbus_bus rte_vmbus_bus; #define FOREACH_DEVICE_ON_VMBUS(p) \ RTE_TAILQ_FOREACH(p, &(rte_vmbus_bus.device_list), next) -#define FOREACH_DRIVER_ON_VMBUS(p) \ - RTE_TAILQ_FOREACH(p, &(rte_vmbus_bus.driver_list), next) - extern int vmbus_logtype_bus; #define RTE_LOGTYPE_VMBUS_BUS vmbus_logtype_bus #define VMBUS_LOG(level, ...) \ diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index d38c75d597..a414f0a892 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -155,7 +155,7 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev) return 0; } - FOREACH_DRIVER_ON_VMBUS(dr) { + RTE_BUS_FOREACH_DRV(dr, &rte_vmbus_bus.bus) { rc = vmbus_probe_one_driver(dr, dev); if (rc < 0) /* negative is an error */ return -1; @@ -263,7 +263,7 @@ rte_vmbus_register(struct rte_vmbus_driver *driver) VMBUS_LOG(DEBUG, "Registered driver %s", driver->driver.name); - TAILQ_INSERT_TAIL(&rte_vmbus_bus.driver_list, driver, next); + rte_bus_add_driver(&rte_vmbus_bus.bus, &driver->driver); } /* unregister vmbus driver */ @@ -271,7 +271,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(rte_vmbus_unregister) void rte_vmbus_unregister(struct rte_vmbus_driver *driver) { - TAILQ_REMOVE(&rte_vmbus_bus.driver_list, driver, next); + rte_bus_remove_driver(&rte_vmbus_bus.bus, &driver->driver); } /* Add a device to VMBUS bus */ @@ -326,7 +326,6 @@ struct rte_vmbus_bus rte_vmbus_bus = { .dev_compare = vmbus_dev_compare, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_vmbus_bus.device_list), - .driver_list = TAILQ_HEAD_INITIALIZER(rte_vmbus_bus.driver_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 291cd6c707..7f4920b274 100644 --- a/drivers/dma/idxd/idxd_bus.c +++ b/drivers/dma/idxd/idxd_bus.c @@ -70,7 +70,7 @@ struct dsa_bus dsa_bus = { .parse = dsa_addr_parse, }, .driver = { - .name = "dmadev_idxd" + .name = "dmadev_idxd", }, .device_list = TAILQ_HEAD_INITIALIZER(dsa_bus.device_list), }; @@ -392,3 +392,7 @@ dsa_addr_parse(const char *name, void *addr) } RTE_REGISTER_BUS(dsa, dsa_bus.bus); +RTE_INIT(dsa_bus_init) +{ + rte_bus_add_driver(&dsa_bus.bus, &dsa_bus.driver); +} diff --git a/lib/eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c index b33f5b4bf4..e155936014 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->driver_list); TAILQ_INSERT_TAIL(&rte_bus_list, bus, next); EAL_LOG(DEBUG, "Registered [%s] bus.", rte_bus_name(bus)); } @@ -369,3 +370,19 @@ rte_bus_sigbus_handler(const void *failure_addr) return ret; } + +RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_add_driver) +void +rte_bus_add_driver(struct rte_bus *bus, struct rte_driver *driver) +{ + TAILQ_INSERT_TAIL(&bus->driver_list, driver, next); + driver->bus = bus; +} + +RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_remove_driver) +void +rte_bus_remove_driver(struct rte_bus *bus, struct rte_driver *driver) +{ + TAILQ_REMOVE(&bus->driver_list, driver, next); + driver->bus = NULL; +} diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h index 71346fb8b2..3c8f661a17 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_driver) driver_list; /**< List of drivers on the bus */ }; /** @@ -370,6 +371,49 @@ 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 drivers on a bus. + * + * @param drv + * Variable name for the bus-specific driver pointer. + * @param bus + * Pointer to the bus structure. + * + * Example: + * struct rte_pci_driver *pci_drv; + * RTE_BUS_FOREACH_DRV(pci_drv, &pci_bus.bus) { + * // Use pci_drv here + * } + */ +#define RTE_BUS_FOREACH_DRV(drv, bus) \ + for (struct rte_driver *__rte_drv = TAILQ_FIRST(&(bus)->driver_list), *__rte_drv_tmp; \ + (__rte_drv != NULL && ((drv) = RTE_BUS_DRIVER(__rte_drv, *drv), \ + __rte_drv_tmp = TAILQ_NEXT(__rte_drv, next), 1)) || \ + (drv = NULL, 0); \ + __rte_drv = __rte_drv_tmp) + +/** + * Add a driver to the bus driver list. + * + * @param bus + * A pointer to a rte_bus structure. + * @param driver + * A pointer to a rte_driver structure to add. + */ +__rte_internal +void rte_bus_add_driver(struct rte_bus *bus, struct rte_driver *driver); + +/** + * Remove a driver from the bus driver list. + * + * @param bus + * A pointer to a rte_bus structure. + * @param driver + * A pointer to a rte_driver structure to remove. + */ +__rte_internal +void rte_bus_remove_driver(struct rte_bus *bus, struct rte_driver *driver); + #ifdef __cplusplus } #endif diff --git a/lib/eal/include/dev_driver.h b/lib/eal/include/dev_driver.h index a2517ac1d4..2052e3ecb2 100644 --- a/lib/eal/include/dev_driver.h +++ b/lib/eal/include/dev_driver.h @@ -15,6 +15,7 @@ struct rte_driver { RTE_TAILQ_ENTRY(rte_driver) next; /**< Next in list. */ const char *name; /**< Driver name. */ const char *alias; /**< Driver alias. */ + const struct rte_bus *bus; /**< Bus reference. */ }; /** -- 2.53.0

