vhost: add APIs for datapath configuration
authorZhihong Wang <zhihong.wang@intel.com>
Mon, 2 Apr 2018 11:46:54 +0000 (19:46 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 13 Apr 2018 22:40:21 +0000 (00:40 +0200)
This patch adds APIs for datapath configuration.

The did of the vhost-user socket can be set to identify the backend device,
in this case each vhost-user socket can have only 1 connection. The did is
set to -1 by default when the software datapath is used.

Signed-off-by: Zhihong Wang <zhihong.wang@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_vhost/rte_vhost.h
lib/librte_vhost/rte_vhost_version.map
lib/librte_vhost/socket.c
lib/librte_vhost/vhost.c
lib/librte_vhost/vhost.h

index 671ea50..8f35167 100644 (file)
@@ -199,6 +199,41 @@ int rte_vhost_driver_register(const char *path, uint64_t flags);
 /* Unregister vhost driver. This is only meaningful to vhost user. */
 int rte_vhost_driver_unregister(const char *path);
 
+/**
+ * Set the vdpa device id, enforce single connection per socket
+ *
+ * @param path
+ *  The vhost-user socket file path
+ * @param did
+ *  Device id
+ * @return
+ *  0 on success, -1 on failure
+ */
+int __rte_experimental
+rte_vhost_driver_attach_vdpa_device(const char *path, int did);
+
+/**
+ * Unset the vdpa device id
+ *
+ * @param path
+ *  The vhost-user socket file path
+ * @return
+ *  0 on success, -1 on failure
+ */
+int __rte_experimental
+rte_vhost_driver_detach_vdpa_device(const char *path);
+
+/**
+ * Get the device id
+ *
+ * @param path
+ *  The vhost-user socket file path
+ * @return
+ *  Device id, -1 on failure
+ */
+int __rte_experimental
+rte_vhost_driver_get_vdpa_device_id(const char *path);
+
 /**
  * Set the feature bits the vhost-user driver supports.
  *
@@ -464,6 +499,17 @@ int rte_vhost_vring_call(int vid, uint16_t vring_idx);
  */
 uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid);
 
+/**
+ * Get vdpa device id for vhost device.
+ *
+ * @param vid
+ *  vhost device id
+ * @return
+ *  device id
+ */
+int __rte_experimental
+rte_vhost_get_vdpa_device_id(int vid);
+
 #ifdef __cplusplus
 }
 #endif
index d3453a2..e30285d 100644 (file)
@@ -65,4 +65,8 @@ EXPERIMENTAL {
        rte_vdpa_unregister_device;
        rte_vdpa_find_device_id;
        rte_vdpa_get_device;
+       rte_vhost_driver_attach_vdpa_device;
+       rte_vhost_driver_detach_vdpa_device;
+       rte_vhost_driver_get_vdpa_device_id;
+       rte_vhost_get_vdpa_device_id;
 } DPDK_18.02;
index a0a95f9..b26bdb0 100644 (file)
@@ -51,6 +51,13 @@ struct vhost_user_socket {
        uint64_t supported_features;
        uint64_t features;
 
+       /*
+        * Device id to identify a specific backend device.
+        * It's set to -1 for the default software implementation.
+        * If valid, one socket can have 1 connection only.
+        */
+       int vdpa_dev_id;
+
        struct vhost_device_ops const *notify_ops;
 };
 
@@ -545,6 +552,52 @@ find_vhost_user_socket(const char *path)
        return NULL;
 }
 
+int
+rte_vhost_driver_attach_vdpa_device(const char *path, int did)
+{
+       struct vhost_user_socket *vsocket;
+
+       if (rte_vdpa_get_device(did) == NULL)
+               return -1;
+
+       pthread_mutex_lock(&vhost_user.mutex);
+       vsocket = find_vhost_user_socket(path);
+       if (vsocket)
+               vsocket->vdpa_dev_id = did;
+       pthread_mutex_unlock(&vhost_user.mutex);
+
+       return vsocket ? 0 : -1;
+}
+
+int
+rte_vhost_driver_detach_vdpa_device(const char *path)
+{
+       struct vhost_user_socket *vsocket;
+
+       pthread_mutex_lock(&vhost_user.mutex);
+       vsocket = find_vhost_user_socket(path);
+       if (vsocket)
+               vsocket->vdpa_dev_id = -1;
+       pthread_mutex_unlock(&vhost_user.mutex);
+
+       return vsocket ? 0 : -1;
+}
+
+int
+rte_vhost_driver_get_vdpa_device_id(const char *path)
+{
+       struct vhost_user_socket *vsocket;
+       int did = -1;
+
+       pthread_mutex_lock(&vhost_user.mutex);
+       vsocket = find_vhost_user_socket(path);
+       if (vsocket)
+               did = vsocket->vdpa_dev_id;
+       pthread_mutex_unlock(&vhost_user.mutex);
+
+       return did;
+}
+
 int
 rte_vhost_driver_disable_features(const char *path, uint64_t features)
 {
index f6f12a0..16b0f9a 100644 (file)
@@ -283,6 +283,7 @@ vhost_new_device(void)
        dev->vid = i;
        dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;
        dev->slave_req_fd = -1;
+       dev->vdpa_dev_id = -1;
 
        return i;
 }
@@ -310,6 +311,31 @@ vhost_destroy_device(int vid)
        vhost_devices[vid] = NULL;
 }
 
+void
+vhost_attach_vdpa_device(int vid, int did)
+{
+       struct virtio_net *dev = get_device(vid);
+
+       if (dev == NULL)
+               return;
+
+       if (rte_vdpa_get_device(did) == NULL)
+               return;
+
+       dev->vdpa_dev_id = did;
+}
+
+void
+vhost_detach_vdpa_device(int vid)
+{
+       struct virtio_net *dev = get_device(vid);
+
+       if (dev == NULL)
+               return;
+
+       dev->vdpa_dev_id = -1;
+}
+
 void
 vhost_set_ifname(int vid, const char *if_name, unsigned int if_len)
 {
@@ -614,3 +640,13 @@ rte_vhost_rx_queue_count(int vid, uint16_t qid)
 
        return *((volatile uint16_t *)&vq->avail->idx) - vq->last_avail_idx;
 }
+
+int rte_vhost_get_vdpa_device_id(int vid)
+{
+       struct virtio_net *dev = get_device(vid);
+
+       if (dev == NULL)
+               return -1;
+
+       return dev->vdpa_dev_id;
+}
index 53d8a80..453d9a3 100644 (file)
@@ -20,6 +20,7 @@
 #include <rte_rwlock.h>
 
 #include "rte_vhost.h"
+#include "rte_vdpa.h"
 
 /* Used to indicate that the device is running on a data core */
 #define VIRTIO_DEV_RUNNING 1
@@ -240,6 +241,12 @@ struct virtio_net {
        struct guest_page       *guest_pages;
 
        int                     slave_req_fd;
+
+       /*
+        * Device id to identify a specific backend device.
+        * It's set to -1 for the default software implementation.
+        */
+       int                     vdpa_dev_id;
 } __rte_cache_aligned;
 
 
@@ -362,6 +369,9 @@ void free_vq(struct vhost_virtqueue *vq);
 
 int alloc_vring_queue(struct virtio_net *dev, uint32_t vring_idx);
 
+void vhost_attach_vdpa_device(int vid, int did);
+void vhost_detach_vdpa_device(int vid);
+
 void vhost_set_ifname(int, const char *if_name, unsigned int if_len);
 void vhost_enable_dequeue_zero_copy(int vid);
 void vhost_set_builtin_virtio_net(int vid, bool enable);