Need ability to allow process like dumpcap to make a ring ethdev with a pre-existing ring. Do this via devargs so it can work with hotplug.
The API rte_eth_from_ring() doesn't do this. Signed-off-by: Stephen Hemminger <step...@networkplumber.org> --- drivers/net/ring/rte_eth_ring.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 966c64d9a5..94a739a925 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -23,9 +23,12 @@ #define ETH_RING_INTERNAL_ARG "internal" #define ETH_RING_INTERNAL_ARG_MAX_LEN 19 /* "0x..16chars..\0" */ +#define ETH_RING_RING_ARG "ring" + static const char *valid_arguments[] = { ETH_RING_NUMA_NODE_ACTION_ARG, ETH_RING_INTERNAL_ARG, + ETH_RING_RING_ARG, NULL }; @@ -693,6 +696,20 @@ parse_internal_args(const char *key __rte_unused, const char *value, return 0; } +static int +parse_ring_arg(const char *key __rte_unused, const char *value, void *data) +{ + struct rte_ring **rp = data; + + *rp = rte_ring_lookup(value); + if (*rp == NULL) { + PMD_LOG(ERR, "ring '%s' not found", value); + return -1; + } + + return 0; +} + static int rte_pmd_ring_probe(struct rte_vdev_device *dev) { @@ -770,6 +787,18 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) ð_dev); if (ret >= 0) ret = 0; + } else if (rte_kvargs_count(kvlist, ETH_RING_RING_ARG) == 1) { + struct rte_ring *rxtx[1] = { }; + + ret = rte_kvargs_process(kvlist, ETH_RING_RING_ARG, parse_ring_arg, rxtx); + if (ret < 0) + goto out_free; + + /* Note: rte_eth_from_ring() does not do what is expected here! */ + ret = do_eth_dev_ring_create(name, dev, rxtx, 1, rxtx, 1, + rte_socket_id(), DEV_ATTACH, ð_dev); + if (ret < 0) + goto out_free; } else { ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG); info = rte_zmalloc("struct node_action_list", @@ -843,4 +872,5 @@ static struct rte_vdev_driver pmd_ring_drv = { RTE_PMD_REGISTER_VDEV(net_ring, pmd_ring_drv); RTE_PMD_REGISTER_ALIAS(net_ring, eth_ring); RTE_PMD_REGISTER_PARAM_STRING(net_ring, + ETH_RING_RING_ARG "=<string> " ETH_RING_NUMA_NODE_ACTION_ARG "=name:node:action(ATTACH|CREATE)"); -- 2.47.2