[RFC v2 4/5] bus: factorize device selection
David Marchand
david.marchand at redhat.com
Thu Feb 26 17:20:55 CET 2026
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 <david.marchand at redhat.com>
---
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
More information about the dev
mailing list