Device iterator RTE_DEV_FOREACH() failed to return devices from classifier like "class=vdpa", because matching name from empty kvargs returns no result. If device name not specified in kvargs, the function should iterate all devices. This patch allows empty devargs or devargs without name specified. Fixes: 6aebb942907d ("kvargs: add function to get from key and value") Signed-off-by: Xueming Li <xuemingl@nvidia.com> Signed-off-by: Olivier Matz <olivier.matz@6wind.com> Acked-by: Xueming Li <xuemingl@nvidia.com>
65 lines
1.3 KiB
C
65 lines
1.3 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright 2018 Gaëtan Rivet
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include <rte_dev.h>
|
|
#include <rte_bus.h>
|
|
#include <rte_kvargs.h>
|
|
#include <rte_errno.h>
|
|
|
|
#include "vdev_logs.h"
|
|
#include "vdev_private.h"
|
|
|
|
enum vdev_params {
|
|
RTE_VDEV_PARAM_NAME,
|
|
RTE_VDEV_PARAM_MAX,
|
|
};
|
|
|
|
static const char * const vdev_params_keys[] = {
|
|
[RTE_VDEV_PARAM_NAME] = "name",
|
|
[RTE_VDEV_PARAM_MAX] = NULL,
|
|
};
|
|
|
|
static int
|
|
vdev_dev_match(const struct rte_device *dev,
|
|
const void *_kvlist)
|
|
{
|
|
const struct rte_kvargs *kvlist = _kvlist;
|
|
const char *key = vdev_params_keys[RTE_VDEV_PARAM_NAME];
|
|
const char *name;
|
|
|
|
/* no kvlist arg, all devices match */
|
|
if (kvlist == NULL)
|
|
return 0;
|
|
|
|
/* if key is present in kvlist and does not match, filter device */
|
|
name = rte_kvargs_get(kvlist, key);
|
|
if (name != NULL && strcmp(name, dev->name))
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void *
|
|
rte_vdev_dev_iterate(const void *start,
|
|
const char *str,
|
|
const struct rte_dev_iterator *it __rte_unused)
|
|
{
|
|
struct rte_kvargs *kvargs = NULL;
|
|
struct rte_device *dev;
|
|
|
|
if (str != NULL) {
|
|
kvargs = rte_kvargs_parse(str, vdev_params_keys);
|
|
if (kvargs == NULL) {
|
|
VDEV_LOG(ERR, "cannot parse argument list\n");
|
|
rte_errno = EINVAL;
|
|
return NULL;
|
|
}
|
|
}
|
|
dev = rte_vdev_find_device(start, vdev_dev_match, kvargs);
|
|
rte_kvargs_free(kvargs);
|
|
return dev;
|
|
}
|