@@ -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);
@@ -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
@@ -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;
};
@@ -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 *