ethdev: allow iterating with pure class filter
If no rte_device is given in the iterator, eth_dev_match() is looking at all ports without any restriction, except the ethdev kvargs filter. It allows to iterate with a devargs filter referencing only some ethdev parameters. The format (from the new devargs syntax) is: class=eth,paramY=Y Signed-off-by: Thomas Monjalon <thomas@monjalon.net> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
This commit is contained in:
parent
214ed1acd1
commit
8b9ea3b3ca
@ -42,7 +42,7 @@ eth_dev_match(const struct rte_eth_dev *edev,
|
|||||||
|
|
||||||
if (edev->state == RTE_ETH_DEV_UNUSED)
|
if (edev->state == RTE_ETH_DEV_UNUSED)
|
||||||
return -1;
|
return -1;
|
||||||
if (edev->device != arg->device)
|
if (arg->device != NULL && arg->device != edev->device)
|
||||||
return -1;
|
return -1;
|
||||||
if (kvlist == NULL)
|
if (kvlist == NULL)
|
||||||
/* Empty string matches everything. */
|
/* Empty string matches everything. */
|
||||||
|
@ -203,10 +203,24 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
|
|||||||
* The devargs string may use various syntaxes:
|
* The devargs string may use various syntaxes:
|
||||||
* - 0000:08:00.0,representor=[1-3]
|
* - 0000:08:00.0,representor=[1-3]
|
||||||
* - pci:0000:06:00.0,representor=[0,5]
|
* - 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):
|
* A new syntax is in development (not yet supported):
|
||||||
* - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z
|
* - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle pure class filter (i.e. without any bus-level argument),
|
||||||
|
* from future new syntax.
|
||||||
|
* rte_devargs_parse() is not yet supporting the new syntax,
|
||||||
|
* that's why this simple case is temporarily parsed here.
|
||||||
|
*/
|
||||||
|
#define iter_anybus_str "class=eth,"
|
||||||
|
if (strncmp(devargs_str, iter_anybus_str,
|
||||||
|
strlen(iter_anybus_str)) == 0) {
|
||||||
|
iter->cls_str = devargs_str + strlen(iter_anybus_str);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
/* Split bus, device and parameters. */
|
/* Split bus, device and parameters. */
|
||||||
ret = rte_devargs_parse(&devargs, devargs_str);
|
ret = rte_devargs_parse(&devargs, devargs_str);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -260,6 +274,7 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
|
|||||||
}
|
}
|
||||||
iter->bus_str = bus_str;
|
iter->bus_str = bus_str;
|
||||||
|
|
||||||
|
end:
|
||||||
iter->cls = rte_class_find_by_name("eth");
|
iter->cls = rte_class_find_by_name("eth");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -280,8 +295,10 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter)
|
|||||||
return RTE_MAX_ETHPORTS;
|
return RTE_MAX_ETHPORTS;
|
||||||
|
|
||||||
do { /* loop to try all matching rte_device */
|
do { /* loop to try all matching rte_device */
|
||||||
/* If not in middle of rte_eth_dev iteration, */
|
/* If not pure ethdev filter and */
|
||||||
if (iter->class_device == NULL) {
|
if (iter->bus != NULL &&
|
||||||
|
/* not in middle of rte_eth_dev iteration, */
|
||||||
|
iter->class_device == NULL) {
|
||||||
/* get next rte_device to try. */
|
/* get next rte_device to try. */
|
||||||
iter->device = iter->bus->dev_iterate(
|
iter->device = iter->bus->dev_iterate(
|
||||||
iter->device, iter->bus_str, iter);
|
iter->device, iter->bus_str, iter);
|
||||||
@ -293,7 +310,7 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter)
|
|||||||
iter->class_device, iter->cls_str, iter);
|
iter->class_device, iter->cls_str, iter);
|
||||||
if (iter->class_device != NULL)
|
if (iter->class_device != NULL)
|
||||||
return eth_dev_to_id(iter->class_device); /* match */
|
return eth_dev_to_id(iter->class_device); /* match */
|
||||||
} while (1); /* need to try next rte_device */
|
} while (iter->bus != NULL); /* need to try next rte_device */
|
||||||
|
|
||||||
/* No more ethdev port to iterate. */
|
/* No more ethdev port to iterate. */
|
||||||
rte_eth_iterator_cleanup(iter);
|
rte_eth_iterator_cleanup(iter);
|
||||||
@ -303,6 +320,8 @@ rte_eth_iterator_next(struct rte_dev_iterator *iter)
|
|||||||
void __rte_experimental
|
void __rte_experimental
|
||||||
rte_eth_iterator_cleanup(struct rte_dev_iterator *iter)
|
rte_eth_iterator_cleanup(struct rte_dev_iterator *iter)
|
||||||
{
|
{
|
||||||
|
if (iter->bus_str == NULL)
|
||||||
|
return; /* nothing to free in pure class filter */
|
||||||
free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
|
free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
|
||||||
free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */
|
free(RTE_CAST_FIELD(iter, cls_str, char *)); /* workaround const */
|
||||||
memset(iter, 0, sizeof(*iter));
|
memset(iter, 0, sizeof(*iter));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user