[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