[v3,3/3] test/devargs: add devargs test cases

Message ID 20211020082200.2412189-4-xuemingl@nvidia.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series devargs: support path in global syntax |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/github-robot: build fail github build: failed
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS

Commit Message

Xueming Li Oct. 20, 2021, 8:22 a.m. UTC
  Initial version to test Global devargs syntax.

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
---
 app/test/meson.build    |   2 +
 app/test/test_devargs.c | 184 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 186 insertions(+)
 create mode 100644 app/test/test_devargs.c
  

Comments

David Marchand Oct. 20, 2021, 9:08 a.m. UTC | #1
On Wed, Oct 20, 2021 at 10:22 AM Xueming Li <xuemingl@nvidia.com> wrote:
>
> Initial version to test Global devargs syntax.
>
> Signed-off-by: Xueming Li <xuemingl@nvidia.com>

10/95 DPDK:fast-tests / devargs_autotest      FAIL     0.17 s (exit
status 255 or signal 127 SIGinvalid)

--- command ---
DPDK_TEST='devargs_autotest'
/home/runner/work/dpdk/dpdk/build/app/test/dpdk-test -l 0-1
--file-prefix=devargs_autotest
--- stdout ---
RTE>>devargs_autotest
== test valid case ==
rte_devargs_parse(net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1)
returned -14 (but should not)
rte_devargs_parse(net_virtio_user0,iface=test,path=/class/bus/,queues=1)
returned -14 (but should not)
Test Failed
RTE>>
--- stderr ---
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/devargs_autotest/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available 1048576 kB hugepages reported
EAL: VFIO support initialized
APP: HPET is not enabled, using TSC as default timer
EAL: failed to parse device "net_virtio_user0"
EAL: failed to parse device "net_virtio_user0"
-------
  
Xueming Li Oct. 20, 2021, 9:40 a.m. UTC | #2
On Wed, 2021-10-20 at 11:08 +0200, David Marchand wrote:
> On Wed, Oct 20, 2021 at 10:22 AM Xueming Li <xuemingl@nvidia.com> wrote:
> > 
> > Initial version to test Global devargs syntax.
> > 
> > Signed-off-by: Xueming Li <xuemingl@nvidia.com>
> 
> 10/95 DPDK:fast-tests / devargs_autotest      FAIL     0.17 s (exit
> status 255 or signal 127 SIGinvalid)
> 
> --- command ---
> DPDK_TEST='devargs_autotest'
> /home/runner/work/dpdk/dpdk/build/app/test/dpdk-test -l 0-1
> --file-prefix=devargs_autotest
> --- stdout ---
> RTE>>devargs_autotest
> == test valid case ==
> rte_devargs_parse(net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1)
> returned -14 (but should not)
> rte_devargs_parse(net_virtio_user0,iface=test,path=/class/bus/,queues=1)
> returned -14 (but should not)
> Test Failed
> RTE>>
> --- stderr ---
> EAL: Detected CPU lcores: 2
> EAL: Detected NUMA nodes: 1
> EAL: Detected shared linkage of DPDK
> EAL: Multi-process socket /var/run/dpdk/devargs_autotest/mp_socket
> EAL: Selected IOVA mode 'PA'
> EAL: No available 1048576 kB hugepages reported
> EAL: VFIO support initialized
> APP: HPET is not enabled, using TSC as default timer
> EAL: failed to parse device "net_virtio_user0"
> EAL: failed to parse device "net_virtio_user0"

Yes, noticed that, seems virtio driver not enabled. Tried to add
"net_virtio" to test_deps in meson file, but failed with:
../app/test/meson.build:444:4: ERROR: Tried to get unknown variable
"static_rte_net_virtio".

Seems meson scripts only lookup dependency on libs, I'm not good at
meson, any suggestion? 

> -------
> 
>
  
Bruce Richardson Oct. 20, 2021, 10:41 a.m. UTC | #3
On Wed, Oct 20, 2021 at 09:40:55AM +0000, Xueming(Steven) Li wrote:
> On Wed, 2021-10-20 at 11:08 +0200, David Marchand wrote:
> > On Wed, Oct 20, 2021 at 10:22 AM Xueming Li <xuemingl@nvidia.com> wrote:
> > > 
> > > Initial version to test Global devargs syntax.
> > > 
> > > Signed-off-by: Xueming Li <xuemingl@nvidia.com>
> > 
> > 10/95 DPDK:fast-tests / devargs_autotest      FAIL     0.17 s (exit
> > status 255 or signal 127 SIGinvalid)
> > 
> > --- command ---
> > DPDK_TEST='devargs_autotest'
> > /home/runner/work/dpdk/dpdk/build/app/test/dpdk-test -l 0-1
> > --file-prefix=devargs_autotest
> > --- stdout ---
> > RTE>>devargs_autotest
> > == test valid case ==
> > rte_devargs_parse(net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1)
> > returned -14 (but should not)
> > rte_devargs_parse(net_virtio_user0,iface=test,path=/class/bus/,queues=1)
> > returned -14 (but should not)
> > Test Failed
> > RTE>>
> > --- stderr ---
> > EAL: Detected CPU lcores: 2
> > EAL: Detected NUMA nodes: 1
> > EAL: Detected shared linkage of DPDK
> > EAL: Multi-process socket /var/run/dpdk/devargs_autotest/mp_socket
> > EAL: Selected IOVA mode 'PA'
> > EAL: No available 1048576 kB hugepages reported
> > EAL: VFIO support initialized
> > APP: HPET is not enabled, using TSC as default timer
> > EAL: failed to parse device "net_virtio_user0"
> > EAL: failed to parse device "net_virtio_user0"
> 
> Yes, noticed that, seems virtio driver not enabled. Tried to add
> "net_virtio" to test_deps in meson file, but failed with:
> ../app/test/meson.build:444:4: ERROR: Tried to get unknown variable
> "static_rte_net_virtio".
> 
> Seems meson scripts only lookup dependency on libs, I'm not good at
> meson, any suggestion? 
>
"net_virtio" is correct for the virtio driver. However, you probably need
to do like is done for the other network drivers linked into the autotest,
and make it conditional on the support being present, since not every build
enables the virtio driver. For example, as is currently in the meson.build
for the autotests:

# The following linkages of drivers are required because
# they are used via a driver-specific API.
if dpdk_conf.has('RTE_NET_BOND')
    test_deps += 'net_bond'
    test_sources += ['test_link_bonding.c', 'test_link_bonding_rssconf.c']
    ...
endif

/Bruce
  

Patch

diff --git a/app/test/meson.build b/app/test/meson.build
index a16374b7a10..842388b0d32 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -42,6 +42,7 @@  test_sources = files(
         'test_cryptodev_security_pdcp.c',
         'test_cycles.c',
         'test_debug.c',
+        'test_devargs.c',
         'test_distributor.c',
         'test_distributor_perf.c',
         'test_dmadev.c',
@@ -204,6 +205,7 @@  fast_tests = [
         ['common_autotest', true],
         ['cpuflags_autotest', true],
         ['debug_autotest', true],
+        ['devargs_autotest', true],
         ['eal_flags_c_opt_autotest', false],
         ['eal_flags_main_opt_autotest', false],
         ['eal_flags_n_opt_autotest', false],
diff --git a/app/test/test_devargs.c b/app/test/test_devargs.c
new file mode 100644
index 00000000000..13e95f052b0
--- /dev/null
+++ b/app/test/test_devargs.c
@@ -0,0 +1,184 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2021 NVIDIA Corporation & Affiliates
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <rte_common.h>
+#include <rte_devargs.h>
+#include <rte_kvargs.h>
+#include <rte_bus.h>
+#include <rte_class.h>
+
+#include "test.h"
+
+/* Check layer arguments. */
+static int
+test_args(const char *devargs, const char *layer, const char *args, const int n)
+{
+	struct rte_kvargs *kvlist;
+
+	if (n == 0) {
+		if (args != NULL && strlen(args) > 0) {
+			printf("rte_devargs_parse(%s) %s args parsed (not expected)\n",
+			       devargs, layer);
+			return -1;
+		} else {
+			return 0;
+		}
+	}
+	if (args == NULL) {
+		printf("rte_devargs_parse(%s) %s args not parsed\n",
+		       devargs, layer);
+		return -1;
+	}
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_devargs_parse(%s) %s_str: %s not parsed\n",
+		       devargs, layer, args);
+		return -1;
+	}
+	if ((int)kvlist->count != n) {
+		printf("rte_devargs_parse(%s) %s_str: %s kv number %u, not %d\n",
+		       devargs, layer, args, kvlist->count, n);
+		return -1;
+	}
+	return 0;
+}
+
+/* Test several valid cases */
+static int
+test_valid_devargs(void)
+{
+	static const struct {
+		const char *devargs;
+		int bus_kv;
+		int class_kv;
+		int driver_kv;
+		const char *bus;
+		const char *name;
+		const char *class;
+	} list[] = {
+		/* Global devargs syntax: */
+		{ "bus=pci",
+		  1, 0, 0, "pci", NULL, NULL},
+		{ "class=eth",
+		  0, 1, 0, NULL, NULL, "eth" },
+		{ "bus=pci,addr=1:2.3/class=eth/driver=abc,k0=v0",
+		  2, 1, 2, "pci", "0000:01:02.3", "eth" },
+		{ "bus=vdev,name=/dev/file/name/class=eth",
+		  2, 1, 0, "vdev", "/dev/file/name", "eth" },
+		{ "bus=vdev,name=/class/bus/path/class=eth",
+		  2, 1, 0, "vdev", "/class/bus/path", "eth" },
+		{ "bus=vdev,name=///dblslsh/class=eth",
+		  2, 1, 0, "vdev", "///dblslsh", "eth" },
+		/* Legacy devargs syntax: */
+		{ "1:2.3", 0, 0, 0,
+		  "pci", "1:2.3", NULL },
+		{ "pci:1:2.3,k0=v0",
+		  0, 0, 1, "pci", "1:2.3", NULL },
+		{ "net_virtio_user0,iface=test,path=/dev/vhost-net,queues=1",
+		  0, 0, 3, "vdev", "net_virtio_user0", NULL },
+		{ "net_virtio_user0,iface=test,path=/class/bus/,queues=1",
+		  0, 0, 3, "vdev", "net_virtio_user0", NULL },
+	};
+	struct rte_devargs da;
+	uint32_t i;
+	int ret;
+	int fail = 0;
+
+	for (i = 0; i < RTE_DIM(list); i++) {
+		memset(&da, 0, sizeof(da));
+		ret = rte_devargs_parse(&da, list[i].devargs);
+		if (ret < 0) {
+			printf("rte_devargs_parse(%s) returned %d (but should not)\n",
+			       list[i].devargs, ret);
+			goto fail;
+		}
+		if ((list[i].bus_kv > 0 || list[i].bus != NULL) &&
+		    da.bus == NULL) {
+			printf("rte_devargs_parse(%s) bus not parsed\n",
+			       list[i].devargs);
+			goto fail;
+		}
+		if (test_args(list[i].devargs, "bus", da.bus_str,
+			      list[i].bus_kv) != 0)
+			goto fail;
+		if (list[i].bus != NULL &&
+		    strcmp(da.bus->name, list[i].bus) != 0) {
+			printf("rte_devargs_parse(%s) bus name (%s) not expected (%s)\n",
+			       list[i].devargs, da.bus->name, list[i].bus);
+			goto fail;
+		}
+		if ((list[i].class_kv > 0 || list[i].class != NULL) &&
+		    da.cls == NULL) {
+			printf("rte_devargs_parse(%s) class not parsed\n",
+			       list[i].devargs);
+			goto fail;
+		}
+		if (test_args(list[i].devargs, "class", da.cls_str,
+			      list[i].class_kv) != 0)
+			goto fail;
+		if (list[i].class != NULL &&
+		    strcmp(da.cls->name, list[i].class) != 0) {
+			printf("rte_devargs_parse(%s) class name (%s) not expected (%s)\n",
+			       list[i].devargs, da.cls->name, list[i].class);
+			goto fail;
+		}
+		if (test_args(list[i].devargs, "driver", da.drv_str,
+			      list[i].driver_kv) != 0)
+			goto fail;
+		if (list[i].name != NULL &&
+		    strcmp(da.name, list[i].name) != 0) {
+			printf("rte_devargs_parse(%s) device name (%s) not expected (%s)\n",
+			       list[i].devargs, da.name, list[i].name);
+			goto fail;
+		}
+		goto cleanup;
+fail:
+		fail = -1;
+cleanup:
+		rte_devargs_reset(&da);
+	}
+	return fail;
+}
+
+/* Test several invalid cases */
+static int
+test_invalid_devargs(void)
+{
+	static const char * const list[] = {
+		"bus=wrong-bus",
+		"class=wrong-class"};
+	struct rte_devargs da;
+	uint32_t i;
+	int ret;
+	int fail = 0;
+
+	for (i = 0; i < RTE_DIM(list); i++) {
+		ret = rte_devargs_parse(&da, list[i]);
+		if (ret >= 0) {
+			printf("rte_devargs_parse(%s) returned %d (but should not)\n",
+			       list[i], ret);
+			fail = ret;
+		}
+		rte_devargs_reset(&da);
+	}
+	return fail;
+}
+
+static int
+test_devargs(void)
+{
+	printf("== test valid case ==\n");
+	if (test_valid_devargs() < 0)
+		return -1;
+	printf("== test invalid case ==\n");
+	if (test_invalid_devargs() < 0)
+		return -1;
+	return 0;
+}
+
+REGISTER_TEST_COMMAND(devargs_autotest, test_devargs);