When ring PMD created via PMD specific API instead of EAL abstraction it is missing the virtual device creation done by EAL vdev.
And this makes eth_dev unusable exact same as other PMDs used, because of some missing fields, like rte_device->name. Now API calls EAL APIs to create ring PMDs. Signed-off-by: Ferruh Yigit <ferruh.yi...@intel.com> --- drivers/net/ring/rte_eth_ring.c | 75 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 6feb137..d656b55 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -45,12 +45,22 @@ #define ETH_RING_NUMA_NODE_ACTION_ARG "nodeaction" #define ETH_RING_ACTION_CREATE "CREATE" #define ETH_RING_ACTION_ATTACH "ATTACH" +#define ETH_RING_INTERNAL_ARG "internal" static const char *valid_arguments[] = { ETH_RING_NUMA_NODE_ACTION_ARG, + ETH_RING_INTERNAL_ARG, NULL }; +struct ring_internal_args { + struct rte_ring * const *rx_queues; + const unsigned nb_rx_queues; + struct rte_ring * const *tx_queues; + const unsigned nb_tx_queues; + const unsigned numa_node; +}; + enum dev_action { DEV_CREATE, DEV_ATTACH @@ -372,7 +382,17 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned nb_tx_queues, const unsigned numa_node) { - struct rte_eth_dev *eth_dev = NULL; + struct ring_internal_args args = { + .rx_queues = rx_queues, + .nb_rx_queues = nb_rx_queues, + .tx_queues = tx_queues, + .nb_tx_queues = nb_tx_queues, + .numa_node = numa_node, + }; + char args_str[32] = { 0 }; + char ring_name[32] = { 0 }; + uint8_t port_id = RTE_MAX_ETHPORTS; + int ret; /* do some parameter checking */ if (rx_queues == NULL && nb_rx_queues > 0) { @@ -388,9 +408,18 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], return -1; } - return do_eth_dev_ring_create(name, rx_queues, nb_rx_queues, - tx_queues, nb_tx_queues, numa_node, DEV_ATTACH, - ð_dev); + snprintf(args_str, 32, "%s=%p", ETH_RING_INTERNAL_ARG, &args); + snprintf(ring_name, 32, "net_ring_%s", name); + + ret = rte_vdev_init(ring_name, args_str); + if (ret) { + rte_errno = EINVAL; + return -1; + } + + rte_eth_dev_get_port_by_name(ring_name, &port_id); + + return port_id; } int @@ -508,6 +537,20 @@ static int parse_kvlist (const char *key __rte_unused, const char *value, void * } static int +parse_internal_args (const char *key __rte_unused, const char *value, + void *data) +{ + struct ring_internal_args *internal_args = data; + void *args; + + sscanf(value, "%p", &args); + + *internal_args = *(struct ring_internal_args *)args; + + return 0; +} + +static int rte_pmd_ring_probe(struct rte_vdev_device *dev) { const char *name, *params; @@ -515,6 +558,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) int ret = 0; struct node_action_list *info = NULL; struct rte_eth_dev *eth_dev = NULL; + struct ring_internal_args internal_args; name = rte_vdev_device_name(dev); params = rte_vdev_device_args(dev); @@ -530,8 +574,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) ret = eth_dev_ring_create(name, rte_socket_id(), DEV_ATTACH, ð_dev); } - } - else { + } else { kvlist = rte_kvargs_parse(params, valid_arguments); if (!kvlist) { @@ -546,7 +589,27 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) ret = eth_dev_ring_create(name, rte_socket_id(), DEV_ATTACH, ð_dev); } + + if (eth_dev) + eth_dev->device = &dev->device; + return ret; + } + + if (rte_kvargs_count(kvlist, ETH_RING_INTERNAL_ARG) == 1) { + ret = rte_kvargs_process(kvlist, ETH_RING_INTERNAL_ARG, + parse_internal_args, + &internal_args); + ret = do_eth_dev_ring_create(name, + internal_args.rx_queues, + internal_args.nb_rx_queues, + internal_args.tx_queues, + internal_args.nb_tx_queues, + internal_args.numa_node, + DEV_ATTACH, + ð_dev); + if (ret >= 0) + ret = 0; } else { ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG); info = rte_zmalloc("struct node_action_list", -- 2.9.4