dma/idxd: support allow/block list

Add support for allow or block list for devices bound
to the kernel driver.
When used the allow or block list applies as an additional
condition to the name prefix.

Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Kevin Laatz <kevin.laatz@intel.com>
This commit is contained in:
Radu Nicolau 2021-12-02 12:50:40 +00:00 committed by Thomas Monjalon
parent a4c1146c75
commit cecf5ed9e4
2 changed files with 36 additions and 4 deletions

View File

@ -117,6 +117,16 @@ the value used as the DPDK ``--file-prefix`` parameter may be used as a workqueu
name prefix, instead of ``dpdk_``, allowing each DPDK application instance to only
use a subset of configured queues.
Additionally, the -a (allowlist) or -b (blocklist) commandline parameters
are also available to further restrict the device list that will be used.
If the -a option is used, then any device that passes the ``dpdk_``
or ``--file-prefix`` prefix condition must also be present in the allow list.
Similarly, when the block list is used,
any device that passes the prefix condition must not be in the block list.
For example, to only use ``wq0.3``, assuming the name prefix condition is met::
$ dpdk-test -a wq0.3
Once probed successfully, irrespective of kernel driver, the device will appear as a ``dmadev``,
that is a "DMA device type" inside DPDK, and can be accessed using APIs from the
``rte_dmadev`` library.

View File

@ -9,6 +9,7 @@
#include <libgen.h>
#include <rte_bus.h>
#include <rte_devargs.h>
#include <rte_eal.h>
#include <rte_log.h>
#include <rte_dmadev_pmd.h>
@ -244,8 +245,18 @@ idxd_probe_dsa(struct rte_dsa_device *dev)
return 0;
}
static int 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 0;
}
static int
is_for_this_process_use(const char *name)
is_for_this_process_use(struct rte_dsa_device *dev, const char *name)
{
char *runtime_dir = strdup(rte_eal_get_runtime_dir());
char *prefix = basename(runtime_dir);
@ -257,6 +268,13 @@ is_for_this_process_use(const char *name)
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);
}
free(runtime_dir);
return retval;
}
@ -273,7 +291,8 @@ dsa_probe(void)
read_wq_string(dev, "name", name, sizeof(name)) < 0)
continue;
if (strncmp(type, "user", 4) == 0 && is_for_this_process_use(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;
@ -370,8 +389,11 @@ dsa_addr_parse(const char *name, void *addr)
return -1;
}
wq->device_id = device_id;
wq->wq_id = wq_id;
if (wq != NULL) {
wq->device_id = device_id;
wq->wq_id = wq_id;
}
return 0;
}