[v4,5/5] devargs: parse global device syntax
Checks
Commit Message
When parsing a devargs, try to parse using the global device syntax
first. Fallback on legacy syntax on error.
Example of new global device syntax:
-a bus=pci,addr=82:00.0/class=eth/driver=mlx5,dv_flow_en=1
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: Gaetan Rivet <grive@u256.net>
---
doc/guides/rel_notes/release_21_05.rst | 6 ++++++
lib/librte_eal/common/eal_common_devargs.c | 16 ++++++++++++----
lib/librte_eal/include/rte_devargs.h | 4 ++++
lib/librte_ethdev/rte_ethdev.c | 1 -
4 files changed, 22 insertions(+), 5 deletions(-)
Comments
10/04/2021 16:23, Xueming Li:
> --- a/doc/guides/rel_notes/release_21_05.rst
> +++ b/doc/guides/rel_notes/release_21_05.rst
> @@ -131,6 +131,12 @@ New Features
> * Added command to display Rx queue used descriptor count.
> ``show port (port_id) rxq (queue_id) desc used count``
>
> +* **Enabled new devargs parser.**
> +
> + * Unified devargs storage buffer usage.
I think this one can be skipped, it is internal handling.
> + * Added new bus driver api to allow bus driver contribute to devargs parsing.
> + * Try new devargs syntax parser first, fallback to legacy syntax parser.
Rewording:
"
* Enabled devargs syntax
``bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z``
* Added bus-level parsing of the devargs syntax.
* Kept compatibility with the legacy syntax as parsing fallback.
"
Please move this block at the beginning of the release notes.
> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Tuesday, April 13, 2021 5:25 AM
> To: Xueming(Steven) Li <xuemingl@nvidia.com>
> Cc: Gaetan Rivet <gaetanr@nvidia.com>; dev@dpdk.org; Xueming(Steven) Li <xuemingl@nvidia.com>; Asaf Penso
> <asafp@nvidia.com>; Ferruh Yigit <ferruh.yigit@intel.com>; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Subject: Re: [dpdk-dev] [PATCH v4 5/5] devargs: parse global device syntax
>
> 10/04/2021 16:23, Xueming Li:
> > --- a/doc/guides/rel_notes/release_21_05.rst
> > +++ b/doc/guides/rel_notes/release_21_05.rst
> > @@ -131,6 +131,12 @@ New Features
> > * Added command to display Rx queue used descriptor count.
> > ``show port (port_id) rxq (queue_id) desc used count``
> >
> > +* **Enabled new devargs parser.**
> > +
> > + * Unified devargs storage buffer usage.
>
> I think this one can be skipped, it is internal handling.
>
> > + * Added new bus driver api to allow bus driver contribute to devargs parsing.
> > + * Try new devargs syntax parser first, fallback to legacy syntax parser.
>
> Rewording:
> "
> * Enabled devargs syntax
> ``bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z``
> * Added bus-level parsing of the devargs syntax.
> * Kept compatibility with the legacy syntax as parsing fallback.
> "
>
> Please move this block at the beginning of the release notes.
>
Thanks!
@@ -131,6 +131,12 @@ New Features
* Added command to display Rx queue used descriptor count.
``show port (port_id) rxq (queue_id) desc used count``
+* **Enabled new devargs parser.**
+
+ * Unified devargs storage buffer usage.
+ * Added new bus driver api to allow bus driver contribute to devargs parsing.
+ * Try new devargs syntax parser first, fallback to legacy syntax parser.
+
Removed Items
-------------
@@ -125,7 +125,6 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
layers[i].str = s;
layers[i].kvlist = rte_kvargs_parse_delim(s, NULL, "/");
if (layers[i].kvlist == NULL) {
- RTE_LOG(ERR, EAL, "Could not parse %s\n", s);
ret = -EINVAL;
goto get_out;
}
@@ -143,7 +142,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
kv = &layers[i].kvlist->pairs[0];
if (kv->key == NULL)
continue;
- if (strcmp(kv->key, "bus") == 0) {
+ if (strcmp(kv->key, RTE_DEVARGS_KEY_BUS) == 0) {
bus = rte_bus_find_by_name(kv->value);
if (bus == NULL) {
RTE_LOG(ERR, EAL, "Could not find bus \"%s\"\n",
@@ -151,7 +150,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
ret = -EFAULT;
goto get_out;
}
- } else if (strcmp(kv->key, "class") == 0) {
+ } else if (strcmp(kv->key, RTE_DEVARGS_KEY_CLASS) == 0) {
cls = rte_class_find_by_name(kv->value);
if (cls == NULL) {
RTE_LOG(ERR, EAL, "Could not find class \"%s\"\n",
@@ -159,7 +158,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
ret = -EFAULT;
goto get_out;
}
- } else if (strcmp(kv->key, "driver") == 0) {
+ } else if (strcmp(kv->key, RTE_DEVARGS_KEY_DRIVER) == 0) {
/* Ignore */
continue;
}
@@ -224,6 +223,15 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev)
if (da == NULL)
return -EINVAL;
+ /* First parse according global device syntax. */
+ if (rte_devargs_layers_parse(da, dev) == 0) {
+ if (da->bus != NULL || da->cls != NULL)
+ return 0;
+ rte_devargs_reset(da);
+ }
+
+ /* Otherwise fallback to legacy syntax: */
+
/* Retrieve eventual bus info */
do {
devname = dev;
@@ -25,6 +25,10 @@ extern "C" {
#include <rte_compat.h>
#include <rte_bus.h>
+#define RTE_DEVARGS_KEY_BUS "bus"
+#define RTE_DEVARGS_KEY_CLASS "class"
+#define RTE_DEVARGS_KEY_DRIVER "driver"
+
/**
* Type of generic device
*/
@@ -207,7 +207,6 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
* - 0000:08:00.0,representor=[1-3]
* - pci:0000:06:00.0,representor=[0,5]
* - class=eth,mac=00:11:22:33:44:55
- * A new syntax is in development (not yet supported):
* - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z
*/