From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shreyansh Jain Subject: [PATCH v5 12/12] eal/bus: add bus iteration macros Date: Mon, 26 Dec 2016 18:54:05 +0530 Message-ID: <1482758645-23057-13-git-send-email-shreyansh.jain@nxp.com> References: <1482756644-13726-1-git-send-email-shreyansh.jain@nxp.com> <1482758645-23057-1-git-send-email-shreyansh.jain@nxp.com> Mime-Version: 1.0 Content-Type: text/plain Cc: , , Shreyansh Jain To: Return-path: Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0079.outbound.protection.outlook.com [104.47.42.79]) by dpdk.org (Postfix) with ESMTP id BB343F927 for ; Mon, 26 Dec 2016 14:21:45 +0100 (CET) In-Reply-To: <1482758645-23057-1-git-send-email-shreyansh.jain@nxp.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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