@@ -57,6 +57,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
struct rte_class *cls = NULL;
struct rte_bus *bus = NULL;
const char *s = devstr;
+ const char *name = NULL;
size_t nblayer;
size_t i = 0;
int ret = 0;
@@ -116,6 +117,8 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
if (layers[i].kvlist == NULL)
continue;
kv = &layers[i].kvlist->pairs[0];
+ if (!kv->key)
+ continue;
if (strcmp(kv->key, "bus") == 0) {
bus = rte_bus_find_by_name(kv->value);
if (bus == NULL) {
@@ -146,6 +149,16 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
devargs->cls = cls;
devargs->src = devstr;
+ /* Parse device name. */
+ if (bus) {
+ if (strcmp(bus->name, "vdev") == 0)
+ name = rte_kvargs_get(layers[0].kvlist, "name");
+ else if (strcmp(bus->name, "pci") == 0)
+ name = rte_kvargs_get(layers[0].kvlist, "addr");
+ if (name != NULL)
+ strncpy(devargs->name, name, sizeof(devargs->name) - 1);
+ }
+
/* If we own the data, clean up a bit
* the several layers string, to ease
* their parsing afterward.
To use Global Device Syntax as devarg, name is required for device management. This patch adds global device syntax name resolving by using same strategy as function rte_eth_iterator_init(), parses from "addr" bus parameter for PCI bus, from "name" bus parameter for vdev bus. Example: -a bus=pci,addr=83:00.0/class=eth/driver=mlx5,... name: 03:00.0 -a bus=vdev,name=pcap0/class=eth/driver=pcap,... name:pcap0 Signed-off-by: Xueming Li <xuemingl@nvidia.com> --- lib/librte_eal/common/eal_common_devargs.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)