[dpdk-dev] [PATCH v5 12/12] eal/bus: add bus iteration macros

Shreyansh Jain shreyansh.jain at nxp.com
Mon Dec 26 14:24:05 CET 2016


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.jain at 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



More information about the dev mailing list