[PATCH v3 2/3] net/ring: create vdev from PMD specific API
From: Ferruh Yigit <hidden>
Date: 2017-06-09 17:51:28
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
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 creates a virtual device and sets proper fields, not all, and it still won't be linked in the virtual device list eal keeps track. But makes PMD usable in usual manner. Signed-off-by: Ferruh Yigit <redacted> --- drivers/net/ring/rte_eth_ring.c | 49 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 6feb137..a9355ff 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c@@ -365,6 +365,41 @@ do_eth_dev_ring_create(const char *name, return -1; } +static struct rte_vdev_device * +alloc_vdev(const char *name) +{ + struct rte_devargs *devargs = NULL; + struct rte_vdev_device *vdev = NULL; + int ret; + + devargs = calloc(1, sizeof(*devargs)); + if (!devargs) + goto out_free; + + vdev = calloc(1, sizeof(*vdev)); + if (!vdev) + goto out_free; + + devargs->type = RTE_DEVTYPE_VIRTUAL; + ret = snprintf(devargs->virt.drv_name, sizeof(devargs->virt.drv_name), + "%s", name); + if (ret < 0) + goto out_free; + + vdev->device.devargs = devargs; + vdev->device.numa_node = SOCKET_ID_ANY; + vdev->device.name = devargs->virt.drv_name; + + vdev->device.driver = &pmd_ring_drv.driver; + + return vdev; + +out_free: + free(devargs); + free(vdev); + return NULL; +} + int rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned nb_rx_queues,
@@ -373,6 +408,8 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned numa_node) { struct rte_eth_dev *eth_dev = NULL; + struct rte_vdev_device *vdev; + int ret; /* do some parameter checking */ if (rx_queues == NULL && nb_rx_queues > 0) {
@@ -388,9 +425,19 @@ 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, + vdev = alloc_vdev(name); + if (!vdev) { + rte_errno = EINVAL; + return -1; + } + + ret = do_eth_dev_ring_create(name, rx_queues, nb_rx_queues, tx_queues, nb_tx_queues, numa_node, DEV_ATTACH, ð_dev); + + eth_dev->device = &vdev->device; + + return ret; } int
--
2.9.4