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

Reply via email to