This patch replaces the use of vDPA device ID with
vDPA device pointer. The goals is to remove the vDPA
device ID to avoid condusion with the Vhost ID.

Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
---
 examples/vdpa/main.c                   | 79 +++++++++++++-------------
 lib/librte_vhost/rte_vdpa.h            | 21 ++++++-
 lib/librte_vhost/rte_vhost_version.map |  3 +-
 lib/librte_vhost/vdpa.c                | 19 +++++--
 4 files changed, 75 insertions(+), 47 deletions(-)

diff --git a/examples/vdpa/main.c b/examples/vdpa/main.c
index 8d707c9e2d..4417500d9b 100644
--- a/examples/vdpa/main.c
+++ b/examples/vdpa/main.c
@@ -26,7 +26,7 @@
 
 struct vdpa_port {
        char ifname[MAX_PATH_LEN];
-       int did;
+       struct rte_vdpa_device *dev;
        int vid;
        uint64_t flags;
 };
@@ -101,16 +101,23 @@ static int
 new_device(int vid)
 {
        char ifname[MAX_PATH_LEN];
+       struct rte_device *dev;
        int i;
 
        rte_vhost_get_ifname(vid, ifname, sizeof(ifname));
        for (i = 0; i < MAX_VDPA_SAMPLE_PORTS; i++) {
-               if (strncmp(ifname, vports[i].ifname, MAX_PATH_LEN) == 0) {
-                       printf("\nnew port %s, did: %d\n",
-                                       ifname, vports[i].did);
-                       vports[i].vid = vid;
-                       break;
+               if (strncmp(ifname, vports[i].ifname, MAX_PATH_LEN))
+                       continue;
+
+               dev = rte_vdpa_get_rte_device(vports[i].dev);
+               if (!dev) {
+                       RTE_LOG(ERR, VDPA,
+                               "Failed to get generic device for port %d\n", 
i);
+                       continue;
                }
+               printf("\nnew port %s, device : %s\n", ifname, dev->name);
+               vports[i].vid = vid;
+               break;
        }
 
        if (i >= MAX_VDPA_SAMPLE_PORTS)
@@ -122,16 +129,24 @@ new_device(int vid)
 static void
 destroy_device(int vid)
 {
+       struct rte_device *dev;
        char ifname[MAX_PATH_LEN];
        int i;
 
        rte_vhost_get_ifname(vid, ifname, sizeof(ifname));
        for (i = 0; i < MAX_VDPA_SAMPLE_PORTS; i++) {
-               if (strcmp(ifname, vports[i].ifname) == 0) {
-                       printf("\ndestroy port %s, did: %d\n",
-                                       ifname, vports[i].did);
-                       break;
+               if (strncmp(ifname, vports[i].ifname, MAX_PATH_LEN))
+                       continue;
+
+               dev = rte_vdpa_get_rte_device(vports[i].dev);
+               if (!dev) {
+                       RTE_LOG(ERR, VDPA,
+                               "Failed to get generic device for port %d\n", 
i);
+                       continue;
                }
+
+               printf("\ndestroy port %s, device: %s\n", ifname, dev->name);
+               break;
        }
 }
 
@@ -145,8 +160,6 @@ start_vdpa(struct vdpa_port *vport)
 {
        int ret;
        char *socket_path = vport->ifname;
-       struct rte_vdpa_device *vdev;
-       int did = vport->did;
 
        if (client_mode)
                vport->flags |= RTE_VHOST_USER_CLIENT;
@@ -170,13 +183,7 @@ start_vdpa(struct vdpa_port *vport)
                        "register driver ops failed: %s\n",
                        socket_path);
 
-       vdev = rte_vdpa_get_device(did);
-       if (!vdev)
-               rte_exit(EXIT_FAILURE,
-                       "vDPA device retrieval failed: %p\n",
-                       vdev);
-
-       ret = rte_vhost_driver_attach_vdpa_device(socket_path, vdev);
+       ret = rte_vhost_driver_attach_vdpa_device(socket_path, vport->dev);
        if (ret != 0)
                rte_exit(EXIT_FAILURE,
                        "attach vdpa device failed: %s\n",
@@ -274,35 +281,31 @@ static void cmd_list_vdpa_devices_parsed(
                struct cmdline *cl,
                __rte_unused void *data)
 {
-       int did;
        uint32_t queue_num;
        uint64_t features;
        struct rte_vdpa_device *vdev;
        struct rte_device *dev;
        struct rte_dev_iterator dev_iter;
 
-       cmdline_printf(cl, "device id\tdevice name\tqueue num\tsupported 
features\n");
+       cmdline_printf(cl, "device name\tqueue num\tsupported features\n");
        RTE_DEV_FOREACH(dev, "class=vdpa", &dev_iter) {
-               did = rte_vdpa_find_device_id_by_name(dev->name);
-               if (did < 0)
-                       continue;
-               vdev = rte_vdpa_get_device(did);
+               vdev = rte_vdpa_find_device_by_name(dev->name);
                if (!vdev)
                        continue;
                if (vdev->ops->get_queue_num(vdev, &queue_num) < 0) {
                        RTE_LOG(ERR, VDPA,
                                "failed to get vdpa queue number "
-                               "for device id %d.\n", did);
+                               "for device %s.\n", dev->name);
                        continue;
                }
                if (vdev->ops->get_features(vdev, &features) < 0) {
                        RTE_LOG(ERR, VDPA,
                                "failed to get vdpa features "
-                               "for device id %d.\n", did);
+                               "for device %s.\n", dev->name);
                        continue;
                }
-               cmdline_printf(cl, "%d\t\t%s\t\t%" PRIu32 "\t\t0x%" PRIx64 "\n",
-                       did, dev->name, queue_num, features);
+               cmdline_printf(cl, "%s\t\t%" PRIu32 "\t\t0x%" PRIx64 "\n",
+                       dev->name, queue_num, features);
        }
 }
 
@@ -330,18 +333,18 @@ static void cmd_create_vdpa_port_parsed(void 
*parsed_result,
                struct cmdline *cl,
                __rte_unused void *data)
 {
-       int did;
+       struct rte_vdpa_device *dev;
        struct cmd_create_result *res = parsed_result;
 
        rte_strscpy(vports[devcnt].ifname, res->socket_path, MAX_PATH_LEN);
-       did = rte_vdpa_find_device_id_by_name(res->bdf);
-       if (did < 0) {
+       dev = rte_vdpa_find_device_by_name(res->bdf);
+       if (dev == NULL) {
                cmdline_printf(cl, "Unable to find vdpa device id for %s.\n",
                                res->bdf);
                return;
        }
 
-       vports[devcnt].did = did;
+       vports[devcnt].dev = dev;
 
        if (start_vdpa(&vports[devcnt]) == 0)
                devcnt++;
@@ -403,9 +406,9 @@ int
 main(int argc, char *argv[])
 {
        char ch;
-       int did;
        int ret;
        struct cmdline *cl;
+       struct rte_vdpa_device *vdev;
        struct rte_device *dev;
        struct rte_dev_iterator dev_iter;
 
@@ -434,12 +437,12 @@ main(int argc, char *argv[])
                cmdline_stdin_exit(cl);
        } else {
                RTE_DEV_FOREACH(dev, "class=vdpa", &dev_iter) {
-                       did = rte_vdpa_find_device_id_by_name(dev->name);
-                       if (did < 0) {
-                               rte_panic("Failed to find device id for %s\n",
+                       vdev = rte_vdpa_find_device_by_name(dev->name);
+                       if (vdev == NULL) {
+                               rte_panic("Failed to find vDPA dev for %s\n",
                                                dev->name);
                        }
-                       vports[devcnt].did = did;
+                       vports[devcnt].dev = vdev;
                        snprintf(vports[devcnt].ifname, MAX_PATH_LEN, "%s%d",
                                        iface, devcnt);
 
diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h
index e7c785102d..6188bf6483 100644
--- a/lib/librte_vhost/rte_vdpa.h
+++ b/lib/librte_vhost/rte_vdpa.h
@@ -113,11 +113,26 @@ rte_vdpa_unregister_device(struct rte_vdpa_device *);
  * @param name
  *  the vdpa device name
  * @return
- *  device id on success, -1 on failure
+ *  vDPA device pointer on success, NULL on failure
  */
 __rte_experimental
-int
-rte_vdpa_find_device_id_by_name(const char *name);
+struct rte_vdpa_device *
+rte_vdpa_find_device_by_name(const char *name);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Get the generic device from the vdpa device
+ *
+ * @param vdpa_dev
+ *  the vdpa device pointer
+ * @return
+ *  generic device pointer on success, NULL on failure
+ */
+__rte_experimental
+struct rte_device *
+rte_vdpa_get_rte_device(struct rte_vdpa_device *vdpa_dev);
 
 /**
  * @warning
diff --git a/lib/librte_vhost/rte_vhost_version.map 
b/lib/librte_vhost/rte_vhost_version.map
index 4872bc4f35..43caab7553 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -66,5 +66,6 @@ EXPERIMENTAL {
        rte_vhost_get_vhost_ring_inflight;
        rte_vhost_get_vring_base_from_inflight;
        rte_vhost_slave_config_change;
-       rte_vdpa_find_device_id_by_name;
+       rte_vdpa_find_device_by_name;
+       rte_vdpa_get_rte_device;
 };
diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c
index 5ad96fe8a6..9ec5677a78 100644
--- a/lib/librte_vhost/vdpa.c
+++ b/lib/librte_vhost/vdpa.c
@@ -40,14 +40,14 @@ rte_vdpa_find_device_id(struct rte_vdpa_device *dev)
        return -1;
 }
 
-int
-rte_vdpa_find_device_id_by_name(const char *name)
+struct rte_vdpa_device *
+rte_vdpa_find_device_by_name(const char *name)
 {
        struct rte_vdpa_device *dev;
        int i;
 
        if (name == NULL)
-               return -1;
+               return NULL;
 
        for (i = 0; i < MAX_VHOST_DEVICE; ++i) {
                dev = &vdpa_devices[i];
@@ -55,10 +55,19 @@ rte_vdpa_find_device_id_by_name(const char *name)
                        continue;
 
                if (strcmp(dev->device->name, name) == 0)
-                       return i;
+                       return dev;
        }
 
-       return -1;
+       return NULL;
+}
+
+struct rte_device *
+rte_vdpa_get_rte_device(struct rte_vdpa_device *vdpa_dev)
+{
+       if (vdpa_dev == NULL)
+               return NULL;
+
+       return vdpa_dev->device;
 }
 
 struct rte_vdpa_device *
-- 
2.26.2

Reply via email to