summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadu Nicolau <radu.nicolau@intel.com>2021-12-02 12:50:40 +0000
committerThomas Monjalon <thomas@monjalon.net>2022-02-13 23:18:01 +0100
commitcecf5ed9e4038e44dba832df2181edee35ccf556 (patch)
treee430c82795a3ae70b698fae232828a143690c663
parenta4c1146c754b4b8cceb1c615df2a20138c09d25a (diff)
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>
-rw-r--r--doc/guides/dmadevs/idxd.rst10
-rw-r--r--drivers/dma/idxd/idxd_bus.c30
2 files changed, 36 insertions, 4 deletions
diff --git a/doc/guides/dmadevs/idxd.rst b/doc/guides/dmadevs/idxd.rst
index d4a210b854..8d7cea6583 100644
--- a/doc/guides/dmadevs/idxd.rst
+++ b/doc/guides/dmadevs/idxd.rst
@@ -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.
diff --git a/drivers/dma/idxd/idxd_bus.c b/drivers/dma/idxd/idxd_bus.c
index 08639e9dce..13cb967f6d 100644
--- a/drivers/dma/idxd/idxd_bus.c
+++ b/drivers/dma/idxd/idxd_bus.c
@@ -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;
}