Three macros: FOREACH_BUS FOREACH_DEVICE_ON_BUS FOREACH_DRIVER_ON_BUS are introduced to make looping over bus (on global list), devices and drivers (on a specific bus) prettier.
Signed-off-by: Shreyansh Jain <shreyansh.j...@nxp.com> --- app/test/test_pci.c | 12 ++++++------ lib/librte_eal/common/eal_common_bus.c | 12 ++++++------ lib/librte_eal/common/eal_common_pci.c | 10 +++++----- lib/librte_eal/common/include/rte_bus.h | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/app/test/test_pci.c b/app/test/test_pci.c index e95b758..6a413e8 100644 --- a/app/test/test_pci.c +++ b/app/test/test_pci.c @@ -129,7 +129,7 @@ do_pci_device_dump(FILE *f) struct rte_pci_device *dev = NULL; struct rte_device *r_dev = NULL; - TAILQ_FOREACH(r_dev, &pci_bus->device_list, next) { + FOREACH_DEVICE_ON_BUS(pci_bus, r_dev) { dev = container_of(r_dev, struct rte_pci_device, device); fprintf(f, PCI_PRI_FMT, dev->addr.domain, dev->addr.bus, @@ -154,8 +154,8 @@ do_pci_bus_probe(void) struct rte_device *device; struct rte_driver *driver; - TAILQ_FOREACH(device, &pci_bus->device_list, next) { - TAILQ_FOREACH(driver, &pci_bus->driver_list, next) { + FOREACH_DEVICE_ON_BUS(pci_bus, device) { + FOREACH_DRIVER_ON_BUS(pci_bus, driver) { ret = pci_bus->match(driver, device); if (!ret) { if (!driver->probe) @@ -180,7 +180,7 @@ blacklist_all_devices(void) unsigned i = 0; char pci_addr_str[16]; - TAILQ_FOREACH(device, &(pci_bus->device_list), next) { + FOREACH_DEVICE_ON_BUS(pci_bus, device) { dev = container_of(device, struct rte_pci_device, device); snprintf(pci_addr_str, sizeof(pci_addr_str), PCI_PRI_FMT, dev->addr.domain, dev->addr.bus, dev->addr.devid, @@ -265,12 +265,12 @@ test_pci_cleanup(void) * cannot free the devices in the right way. Let's assume that we * don't care for tests. */ - TAILQ_FOREACH(dev, &(pci_bus->device_list), next) { + FOREACH_DEVICE_ON_BUS(pci_bus, dev) { rte_eal_bus_remove_device(dev); dev->driver = NULL; } - TAILQ_FOREACH(dr, &(pci_bus->driver_list), next) { + FOREACH_DRIVER_ON_BUS(pci_bus, dr) { rte_eal_bus_remove_driver(dr); } diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c index 6dc7b73..f8c2e03 100644 --- a/lib/librte_eal/common/eal_common_bus.c +++ b/lib/librte_eal/common/eal_common_bus.c @@ -125,7 +125,7 @@ rte_eal_bus_get(const char *bus_name) RTE_VERIFY(bus_name); - TAILQ_FOREACH(bus, &rte_bus_list, next) { + FOREACH_BUS(bus) { RTE_VERIFY(bus->name); if (!strcmp(bus_name, bus->name)) @@ -179,7 +179,7 @@ rte_eal_bus_scan(void) int ret; struct rte_bus *bus = NULL; - TAILQ_FOREACH(bus, &rte_bus_list, next) { + FOREACH_BUS(bus) { ret = bus->scan(bus); if (ret) { RTE_LOG(ERR, EAL, "Scan for (%s) bus failed.\n", @@ -228,9 +228,9 @@ rte_eal_bus_probe(void) struct rte_driver *driver; /* For each bus registered with EAL */ - TAILQ_FOREACH(bus, &rte_bus_list, next) { - TAILQ_FOREACH(device, &bus->device_list, next) { - TAILQ_FOREACH(driver, &bus->driver_list, next) { + FOREACH_BUS(bus) { + FOREACH_DEVICE_ON_BUS(bus, device) { + FOREACH_DRIVER_ON_BUS(bus, driver) { ret = bus->match(driver, device); if (!ret) { ret = perform_probe(bus, driver, @@ -273,7 +273,7 @@ rte_eal_bus_dump(FILE *f) int ret; struct rte_bus *bus; - TAILQ_FOREACH(bus, &rte_bus_list, next) { + FOREACH_BUS(bus) { ret = bus_dump_one(f, bus); if (ret) { RTE_LOG(ERR, EAL, "Unable to write to stream (%d)\n", diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index ce19b9a..2d5a399 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -283,7 +283,7 @@ pci_probe_all_drivers(struct rte_bus *bus, struct rte_pci_device *dev) if (dev->driver != NULL) return 0; - TAILQ_FOREACH(r_dr, &bus->driver_list, next) { + FOREACH_DRIVER_ON_BUS(bus, r_dr) { rc = rte_eal_pci_probe(r_dr, &dev->device); if (rc < 0) /* negative value is an error */ @@ -311,7 +311,7 @@ pci_detach_all_drivers(struct rte_bus *bus, struct rte_pci_device *dev) if (dev == NULL) return -1; - TAILQ_FOREACH(r_dr, &bus->driver_list, next) { + FOREACH_DRIVER_ON_BUS(bus, r_dr) { dr = container_of(r_dr, struct rte_pci_driver, driver); rc = rte_eal_pci_detach_dev(dr, dev); if (rc < 0) @@ -352,7 +352,7 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr) if (pci_update_device(bus, addr) < 0) goto err_return; - TAILQ_FOREACH(r_dev, &bus->device_list, next) { + FOREACH_DEVICE_ON_BUS(bus, r_dev) { dev = container_of(r_dev, struct rte_pci_device, device); if (rte_eal_compare_pci_addr(&dev->addr, addr)) continue; @@ -391,7 +391,7 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr) return -1; } - TAILQ_FOREACH(r_dev, &bus->device_list, next) { + FOREACH_DEVICE_ON_BUS(bus, r_dev) { dev = container_of(r_dev, struct rte_pci_device, device); if (rte_eal_compare_pci_addr(&dev->addr, addr)) continue; @@ -517,7 +517,7 @@ rte_eal_pci_dump(FILE *f) return; } - TAILQ_FOREACH(r_dev, &bus->device_list, next) { + FOREACH_DEVICE_ON_BUS(bus, r_dev) { dev = container_of(r_dev, struct rte_pci_device, device); pci_dump_one_device(f, dev); } diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h index 3bd3ab5..07c30c4 100644 --- a/lib/librte_eal/common/include/rte_bus.h +++ b/lib/librte_eal/common/include/rte_bus.h @@ -56,6 +56,39 @@ extern "C" { /** Double linked list of buses */ TAILQ_HEAD(rte_bus_list, rte_bus); +/* Helpers for Bus, device and driver list traversal */ + +/** + * Iterate over all the buses registered + * + * @param bus + * A rte_bus type NULL initialized pointer + */ +#define FOREACH_BUS(bus) \ + TAILQ_FOREACH((bus), &rte_bus_list, next) + +/** + * Iterate over all the drivers registered with a particular bus + * + * @param bus + * Valid reference of bus to iterate over + * @param drv + * NULL initialized rte_driver type pointer + */ +#define FOREACH_DRIVER_ON_BUS(bus, drv) \ + TAILQ_FOREACH((drv), &(bus)->driver_list, next) + +/** + * Iterate over all the devices scanned/found on a particular bus + * + * @param bus + * Valid reference of bus to iterate over + * @param dev + * NULL initialized rte_device type pointer + */ +#define FOREACH_DEVICE_ON_BUS(bus, dev) \ + TAILQ_FOREACH((dev), &(bus)->device_list, next) + /* Global Bus list */ extern struct rte_bus_list rte_bus_list; -- 2.7.4