All buses (thankfully) implement the same logic when it comes to selecting the devices to probe based on -a/-b options. As we want to adjust how devices are selected, provide a common helper in EAL and use it in the buses.
Signed-off-by: David Marchand <[email protected]> --- drivers/bus/auxiliary/auxiliary_common.c | 15 +---------- drivers/bus/cdx/cdx.c | 21 +--------------- drivers/bus/dpaa/dpaa_bus.c | 24 ++++++------------ drivers/bus/fslmc/fslmc_bus.c | 22 ++++++---------- drivers/bus/pci/pci_common.c | 15 +---------- drivers/bus/platform/platform.c | 28 ++------------------- drivers/bus/uacce/uacce.c | 22 +--------------- drivers/bus/vmbus/vmbus_common.c | 21 +--------------- drivers/dma/idxd/idxd_bus.c | 32 +++++++++--------------- lib/eal/common/eal_common_bus.c | 18 +++++++++++++ lib/eal/include/bus_driver.h | 7 ++++++ 11 files changed, 58 insertions(+), 167 deletions(-) diff --git a/drivers/bus/auxiliary/auxiliary_common.c b/drivers/bus/auxiliary/auxiliary_common.c index ac766e283e..5baf76441a 100644 --- a/drivers/bus/auxiliary/auxiliary_common.c +++ b/drivers/bus/auxiliary/auxiliary_common.c @@ -399,20 +399,7 @@ auxiliary_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, bool auxiliary_is_ignored_device(const char *name) { - struct rte_devargs *devargs = auxiliary_devargs_lookup(name); - - switch (auxiliary_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs && devargs->policy == RTE_DEV_ALLOWED) - return false; - break; - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) - return false; - break; - } - return true; + return rte_bus_is_ignored_device(&auxiliary_bus.bus, auxiliary_devargs_lookup(name)); } static enum rte_iova_mode diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c index 729d54337c..ce0da41b82 100644 --- a/drivers/bus/cdx/cdx.c +++ b/drivers/bus/cdx/cdx.c @@ -164,25 +164,6 @@ cdx_devargs_lookup(const char *dev_name) return NULL; } -static bool -cdx_ignore_device(const char *dev_name) -{ - struct rte_devargs *devargs = cdx_devargs_lookup(dev_name); - - switch (rte_cdx_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs && devargs->policy == RTE_DEV_ALLOWED) - return false; - break; - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) - return false; - break; - } - return true; -} - /* * Scan one cdx sysfs entry, and fill the devices list from it. * It checks if the CDX device is bound to vfio-cdx driver. In case @@ -282,7 +263,7 @@ cdx_scan(void) if (e->d_name[0] == '.') continue; - if (cdx_ignore_device(e->d_name)) + if (rte_bus_is_ignored_device(&rte_cdx_bus.bus, cdx_devargs_lookup(e->d_name))) continue; snprintf(dirname, sizeof(dirname), "%s/%s", diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 5e0f32bfe8..bc1dbf3592 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -717,7 +717,6 @@ rte_dpaa_bus_probe(void) struct rte_dpaa_driver *drv; FILE *svr_file = NULL; uint32_t svr_ver; - int probe_all = rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST; static int process_once; char *penv; @@ -725,9 +724,6 @@ rte_dpaa_bus_probe(void) if (!rte_dpaa_bus.detected) return 0; - if (rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST) - probe_all = true; - svr_file = fopen(DPAA_SOC_ID_FILE, "r"); if (svr_file) { if (fscanf(svr_file, "svr:%x", &svr_ver) > 0) @@ -809,21 +805,15 @@ rte_dpaa_bus_probe(void) if (rte_dev_is_probed(&dev->device)) continue; - if (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_BLOCKED) + if (rte_bus_is_ignored_device(&rte_dpaa_bus.bus, dev->device.devargs)) continue; - if (probe_all || - (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_ALLOWED)) { - ret = drv->probe(drv, dev); - if (ret) { - DPAA_BUS_ERR("unable to probe:%s", - dev->name); - } else { - dev->driver = drv; - dev->device.driver = &drv->driver; - } + ret = drv->probe(drv, dev); + if (ret) { + DPAA_BUS_ERR("unable to probe: %s", dev->name); + } else { + dev->driver = drv; + dev->device.driver = &drv->driver; } break; } diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index ac9fb7a08c..27ef84659a 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -410,7 +410,6 @@ static int rte_fslmc_probe(void) { int ret = 0; - int probe_all; struct rte_dpaa2_device *dev; struct rte_dpaa2_driver *drv; @@ -457,8 +456,6 @@ rte_fslmc_probe(void) return 0; } - probe_all = rte_fslmc_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST; - TAILQ_FOREACH(dev, &rte_fslmc_bus.device_list, next) { TAILQ_FOREACH(drv, &rte_fslmc_bus.driver_list, next) { ret = rte_fslmc_match(drv, dev); @@ -468,23 +465,18 @@ rte_fslmc_probe(void) if (rte_dev_is_probed(&dev->device)) continue; - if (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_BLOCKED) { + if (rte_bus_is_ignored_device(&rte_fslmc_bus.bus, dev->device.devargs)) { DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping", dev->device.name); continue; } - if (probe_all || - (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_ALLOWED)) { - ret = drv->probe(drv, dev); - if (ret) { - DPAA2_BUS_ERR("Unable to probe"); - } else { - dev->driver = drv; - dev->device.driver = &drv->driver; - } + ret = drv->probe(drv, dev); + if (ret) { + DPAA2_BUS_ERR("Unable to probe"); + } else { + dev->driver = drv; + dev->device.driver = &drv->driver; } break; } diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index bf5df3d94e..c5cc9db9cf 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -721,20 +721,7 @@ pci_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) bool rte_pci_ignore_device(const struct rte_pci_addr *pci_addr) { - struct rte_devargs *devargs = pci_devargs_lookup(pci_addr); - - switch (rte_pci_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs && devargs->policy == RTE_DEV_ALLOWED) - return false; - break; - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) - return false; - break; - } - return true; + return rte_bus_is_ignored_device(&rte_pci_bus.bus, pci_devargs_lookup(pci_addr)); } enum rte_iova_mode diff --git a/drivers/bus/platform/platform.c b/drivers/bus/platform/platform.c index f6673cf181..21f8240e28 100644 --- a/drivers/bus/platform/platform.c +++ b/drivers/bus/platform/platform.c @@ -56,30 +56,6 @@ dev_devargs(const char *dev_name) return NULL; } -static bool -dev_allowed(const char *dev_name) -{ - struct rte_devargs *devargs; - - devargs = dev_devargs(dev_name); - if (devargs == NULL) - return true; - - switch (platform_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs->policy == RTE_DEV_ALLOWED) - return true; - break; - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs->policy == RTE_DEV_BLOCKED) - return false; - break; - } - - return true; -} - static int dev_add(const char *dev_name) { @@ -173,7 +149,7 @@ platform_bus_scan(void) if (dev_name[0] == '.') continue; - if (!dev_allowed(dev_name)) + if (rte_bus_is_ignored_device(&platform_bus.bus, dev_devargs(dev_name))) continue; if (!dev_is_bound_vfio_platform(dev_name)) @@ -497,7 +473,7 @@ platform_bus_plug(struct rte_device *dev) { struct rte_platform_device *pdev; - if (!dev_allowed(dev->name)) + if (rte_bus_is_ignored_device(&platform_bus.bus, dev->devargs)) return -EPERM; if (!dev_is_bound_vfio_platform(dev->name)) diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c index 79f990c54c..bf04e22057 100644 --- a/drivers/bus/uacce/uacce.c +++ b/drivers/bus/uacce/uacce.c @@ -84,26 +84,6 @@ uacce_devargs_lookup(const char *dev_name) return NULL; } -static bool -uacce_ignore_device(const char *dev_name) -{ - struct rte_devargs *devargs = uacce_devargs_lookup(dev_name); - - switch (uacce_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs && devargs->policy == RTE_DEV_ALLOWED) - return false; - break; - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) - return false; - break; - } - - return true; -} - /* * Returns the number of bytes read (removed last newline) on success. * Otherwise negative value is returned. @@ -310,7 +290,7 @@ uacce_scan(void) continue; } - if (uacce_ignore_device(e->d_name)) + if (rte_bus_is_ignored_device(&uacce_bus.bus, uacce_devargs_lookup(e->d_name))) continue; if (uacce_scan_one(e->d_name) < 0) diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index a787d8b18d..c386bf02c4 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -168,25 +168,6 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev) return 1; } -static bool -vmbus_ignore_device(struct rte_vmbus_device *dev) -{ - struct rte_devargs *devargs = vmbus_devargs_lookup(dev); - - switch (rte_vmbus_bus.bus.conf.scan_mode) { - case RTE_BUS_SCAN_ALLOWLIST: - if (devargs && devargs->policy == RTE_DEV_ALLOWED) - return false; - break; - case RTE_BUS_SCAN_UNDEFINED: - case RTE_BUS_SCAN_BLOCKLIST: - if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) - return false; - break; - } - return true; -} - /* * Scan the vmbus, and call the devinit() function for * all registered drivers that have a matching entry in its id_table @@ -205,7 +186,7 @@ rte_vmbus_probe(void) rte_uuid_unparse(dev->device_id, ubuf, sizeof(ubuf)); - if (vmbus_ignore_device(dev)) + if (rte_bus_is_ignored_device(&rte_vmbus_bus.bus, vmbus_devargs_lookup((dev)))) continue; if (vmbus_probe_all_drivers(dev) < 0) { diff --git a/drivers/dma/idxd/idxd_bus.c b/drivers/dma/idxd/idxd_bus.c index 9a8213bbbe..2e96039334 100644 --- a/drivers/dma/idxd/idxd_bus.c +++ b/drivers/dma/idxd/idxd_bus.c @@ -6,6 +6,7 @@ #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> +#include <stdbool.h> #include <libgen.h> #include <bus_driver.h> @@ -247,40 +248,32 @@ idxd_probe_dsa(struct rte_dsa_device *dev) return 0; } -static int search_devargs(const char *name) +static const struct rte_devargs *search_devargs(const char *name) { struct rte_devargs *devargs; RTE_EAL_DEVARGS_FOREACH(dsa_bus.bus.name, devargs) { if (strcmp(devargs->name, name) == 0) - return 1; + return devargs; } - return 0; + return NULL; } -static int +static bool is_for_this_process_use(struct rte_dsa_device *dev, const char *name) { char prefix[256]; - int retval = 0; size_t prefixlen; prefixlen = rte_basename(rte_eal_get_runtime_dir(), prefix, sizeof(prefix)); if (prefixlen >= sizeof(prefix) || strcmp(prefix, ".") == 0) - return retval; - - if (strncmp(name, "dpdk_", 5) == 0) - retval = 1; - if (strncmp(name, prefix, prefixlen) == 0 && name[prefixlen] == '_') - retval = 1; - - if (retval && dsa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_UNDEFINED) { - if (dsa_bus.bus.conf.scan_mode == RTE_BUS_SCAN_ALLOWLIST) - retval = search_devargs(dev->device.name); - else - retval = !search_devargs(dev->device.name); + return false; + + if (strncmp(name, "dpdk_", 5) == 0 || + (strncmp(name, prefix, prefixlen) == 0 && name[prefixlen] == '_')) { + return !rte_bus_is_ignored_device(&dsa_bus.bus, search_devargs(dev->device.name)); } - return retval; + return false; } static int @@ -295,8 +288,7 @@ dsa_probe(void) read_wq_string(dev, "name", name, sizeof(name)) < 0) continue; - if (strncmp(type, "user", 4) == 0 && - is_for_this_process_use(dev, name)) { + if (strncmp(type, "user", 4) == 0 && is_for_this_process_use(dev, name)) { dev->device.driver = &dsa_bus.driver; idxd_probe_dsa(dev); continue; diff --git a/lib/eal/common/eal_common_bus.c b/lib/eal/common/eal_common_bus.c index 0a2311a342..fbe20cfe35 100644 --- a/lib/eal/common/eal_common_bus.c +++ b/lib/eal/common/eal_common_bus.c @@ -8,6 +8,7 @@ #include <bus_driver.h> #include <rte_debug.h> +#include <rte_devargs.h> #include <rte_string_fns.h> #include <rte_errno.h> @@ -226,6 +227,23 @@ rte_bus_find_by_device_name(const char *str) return rte_bus_find(NULL, bus_can_parse, name); } +RTE_EXPORT_INTERNAL_SYMBOL(rte_bus_is_ignored_device) +bool +rte_bus_is_ignored_device(const struct rte_bus *bus, const struct rte_devargs *devargs) +{ + switch (bus->conf.scan_mode) { + case RTE_BUS_SCAN_ALLOWLIST: + if (devargs && devargs->policy == RTE_DEV_ALLOWED) + return false; + break; + case RTE_BUS_SCAN_UNDEFINED: + case RTE_BUS_SCAN_BLOCKLIST: + if (devargs == NULL || devargs->policy != RTE_DEV_BLOCKED) + return false; + break; + } + return true; +} /* * Get iommu class of devices on the bus. diff --git a/lib/eal/include/bus_driver.h b/lib/eal/include/bus_driver.h index 60527b75b6..1ec1ff57bb 100644 --- a/lib/eal/include/bus_driver.h +++ b/lib/eal/include/bus_driver.h @@ -302,6 +302,13 @@ RTE_INIT_PRIO(businitfn_ ##nm, BUS) \ __rte_internal void rte_bus_unregister(struct rte_bus *bus); +/** + * Indicate if a device referenced by some devargs should be skipped during + * probing of a bus. + */ +__rte_internal +bool rte_bus_is_ignored_device(const struct rte_bus *bus, const struct rte_devargs *devargs); + #ifdef __cplusplus } #endif -- 2.53.0

