vhost: replace vDPA device ID in Vhost
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Fri, 26 Jun 2020 14:04:33 +0000 (16:04 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 30 Jun 2020 12:52:30 +0000 (14:52 +0200)
This removes the notion of device ID in Vhost library
as a preliminary step to get rid of the vDPA device ID.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Adrián Moreno <amorenoz@redhat.com>
drivers/vdpa/ifc/ifcvf_vdpa.c
drivers/vdpa/mlx5/mlx5_vdpa.c
examples/vdpa/main.c
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
lib/librte_vhost/vhost_user.c

index 0418f9a..4163047 100644 (file)
@@ -881,7 +881,7 @@ ifcvf_dev_config(int vid)
        struct internal_list *list;
        struct ifcvf_internal *internal;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
@@ -907,7 +907,7 @@ ifcvf_dev_close(int vid)
        struct internal_list *list;
        struct ifcvf_internal *internal;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
@@ -947,7 +947,7 @@ ifcvf_set_features(int vid)
        struct ifcvf_internal *internal;
        uint64_t log_base = 0, log_size = 0;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
@@ -978,7 +978,7 @@ ifcvf_get_vfio_group_fd(int vid)
        struct rte_vdpa_device *vdev;
        struct internal_list *list;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
@@ -994,7 +994,7 @@ ifcvf_get_vfio_device_fd(int vid)
        struct rte_vdpa_device *vdev;
        struct internal_list *list;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
@@ -1013,7 +1013,7 @@ ifcvf_get_notify_area(int vid, int qid, uint64_t *offset, uint64_t *size)
        struct vfio_region_info reg = { .argsz = sizeof(reg) };
        int ret;
 
-       vdev = rte_vdpa_get_device(rte_vhost_get_vdpa_device_id(vid));
+       vdev = rte_vhost_get_vdpa_device(vid);
        list = find_internal_resource_by_vdev(vdev);
        if (list == NULL) {
                DRV_LOG(ERR, "Invalid vDPA device: %p", vdev);
index 9ea032d..47db5fd 100644 (file)
@@ -129,8 +129,7 @@ mlx5_vdpa_get_protocol_features(struct rte_vdpa_device *vdev,
 static int
 mlx5_vdpa_set_vring_state(int vid, int vring, int state)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
 
@@ -171,8 +170,7 @@ mlx5_vdpa_direct_db_prepare(struct mlx5_vdpa_priv *priv)
 static int
 mlx5_vdpa_features_set(int vid)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
        uint64_t log_base, log_size;
@@ -292,8 +290,7 @@ mlx5_vdpa_mtu_set(struct mlx5_vdpa_priv *priv)
 static int
 mlx5_vdpa_dev_close(int vid)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
        int ret = 0;
@@ -322,8 +319,7 @@ mlx5_vdpa_dev_close(int vid)
 static int
 mlx5_vdpa_dev_config(int vid)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
 
@@ -354,8 +350,7 @@ mlx5_vdpa_dev_config(int vid)
 static int
 mlx5_vdpa_get_device_fd(int vid)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
 
@@ -369,8 +364,7 @@ mlx5_vdpa_get_device_fd(int vid)
 static int
 mlx5_vdpa_get_notify_area(int vid, int qid, uint64_t *offset, uint64_t *size)
 {
-       struct rte_vdpa_device *vdev = rte_vdpa_get_device(
-                       rte_vhost_get_vdpa_device_id(vid));
+       struct rte_vdpa_device *vdev = rte_vhost_get_vdpa_device(vid);
        struct mlx5_vdpa_priv *priv =
                mlx5_vdpa_find_priv_resource_by_vdev(vdev);
 
index bdb0060..6a719e3 100644 (file)
@@ -149,6 +149,7 @@ 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)
@@ -173,7 +174,13 @@ start_vdpa(struct vdpa_port *vport)
                        "register driver ops failed: %s\n",
                        socket_path);
 
-       ret = rte_vhost_driver_attach_vdpa_device(socket_path, did);
+       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);
        if (ret != 0)
                rte_exit(EXIT_FAILURE,
                        "attach vdpa device failed: %s\n",
index d43669f..2fbc364 100644 (file)
@@ -90,6 +90,7 @@ extern "C" {
 #define VHOST_USER_F_PROTOCOL_FEATURES 30
 #endif
 
+struct rte_vdpa_device;
 
 /**
  * Information relating to memory regions including offsets to
@@ -402,14 +403,15 @@ int rte_vhost_driver_unregister(const char *path);
  *
  * @param path
  *  The vhost-user socket file path
- * @param did
- *  Device id
+ * @param dev
+ *  vDPA device pointer
  * @return
  *  0 on success, -1 on failure
  */
 __rte_experimental
 int
-rte_vhost_driver_attach_vdpa_device(const char *path, int did);
+rte_vhost_driver_attach_vdpa_device(const char *path,
+               struct rte_vdpa_device *dev);
 
 /**
  * Unset the vdpa device id
@@ -429,11 +431,11 @@ rte_vhost_driver_detach_vdpa_device(const char *path);
  * @param path
  *  The vhost-user socket file path
  * @return
- *  Device id, -1 on failure
+ *  vDPA device pointer, NULL on failure
  */
 __rte_experimental
-int
-rte_vhost_driver_get_vdpa_device_id(const char *path);
+struct rte_vdpa_device *
+rte_vhost_driver_get_vdpa_device(const char *path);
 
 /**
  * Set the feature bits the vhost-user driver supports.
@@ -977,11 +979,11 @@ rte_vhost_extern_callback_register(int vid,
  * @param vid
  *  vhost device id
  * @return
- *  device id
+ *  vDPA device pointer on success, NULL on failure
  */
 __rte_experimental
-int
-rte_vhost_get_vdpa_device_id(int vid);
+struct rte_vdpa_device *
+rte_vhost_get_vdpa_device(int vid);
 
 /**
  * Notify the guest that should get virtio configuration space from backend.
index 9325ee4..60d6744 100644 (file)
@@ -43,8 +43,8 @@ EXPERIMENTAL {
        rte_vdpa_reset_stats;
        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;
+       rte_vhost_driver_get_vdpa_device;
+       rte_vhost_get_vdpa_device;
        rte_vhost_driver_get_protocol_features;
        rte_vhost_driver_get_queue_num;
        rte_vhost_get_log_base;
index da575b6..49267ce 100644 (file)
@@ -55,12 +55,7 @@ struct vhost_user_socket {
 
        uint64_t protocol_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 rte_vdpa_device *vdpa_dev;
 
        struct vhost_device_ops const *notify_ops;
 };
@@ -230,7 +225,7 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket)
 
        vhost_set_builtin_virtio_net(vid, vsocket->use_builtin_virtio_net);
 
-       vhost_attach_vdpa_device(vid, vsocket->vdpa_dev_id);
+       vhost_attach_vdpa_device(vid, vsocket->vdpa_dev);
 
        if (vsocket->dequeue_zero_copy)
                vhost_enable_dequeue_zero_copy(vid);
@@ -578,17 +573,18 @@ find_vhost_user_socket(const char *path)
 }
 
 int
-rte_vhost_driver_attach_vdpa_device(const char *path, int did)
+rte_vhost_driver_attach_vdpa_device(const char *path,
+               struct rte_vdpa_device *dev)
 {
        struct vhost_user_socket *vsocket;
 
-       if (rte_vdpa_get_device(did) == NULL || path == NULL)
+       if (dev == NULL || path == NULL)
                return -1;
 
        pthread_mutex_lock(&vhost_user.mutex);
        vsocket = find_vhost_user_socket(path);
        if (vsocket)
-               vsocket->vdpa_dev_id = did;
+               vsocket->vdpa_dev = dev;
        pthread_mutex_unlock(&vhost_user.mutex);
 
        return vsocket ? 0 : -1;
@@ -602,25 +598,25 @@ rte_vhost_driver_detach_vdpa_device(const char *path)
        pthread_mutex_lock(&vhost_user.mutex);
        vsocket = find_vhost_user_socket(path);
        if (vsocket)
-               vsocket->vdpa_dev_id = -1;
+               vsocket->vdpa_dev = NULL;
        pthread_mutex_unlock(&vhost_user.mutex);
 
        return vsocket ? 0 : -1;
 }
 
-int
-rte_vhost_driver_get_vdpa_device_id(const char *path)
+struct rte_vdpa_device *
+rte_vhost_driver_get_vdpa_device(const char *path)
 {
        struct vhost_user_socket *vsocket;
-       int did = -1;
+       struct rte_vdpa_device *dev = NULL;
 
        pthread_mutex_lock(&vhost_user.mutex);
        vsocket = find_vhost_user_socket(path);
        if (vsocket)
-               did = vsocket->vdpa_dev_id;
+               dev = vsocket->vdpa_dev;
        pthread_mutex_unlock(&vhost_user.mutex);
 
-       return did;
+       return dev;
 }
 
 int
@@ -693,7 +689,6 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features)
        struct vhost_user_socket *vsocket;
        uint64_t vdpa_features;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
        int ret = 0;
 
        pthread_mutex_lock(&vhost_user.mutex);
@@ -705,8 +700,7 @@ rte_vhost_driver_get_features(const char *path, uint64_t *features)
                goto unlock_exit;
        }
 
-       did = vsocket->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = vsocket->vdpa_dev;
        if (!vdpa_dev || !vdpa_dev->ops->get_features) {
                *features = vsocket->features;
                goto unlock_exit;
@@ -748,7 +742,6 @@ rte_vhost_driver_get_protocol_features(const char *path,
        struct vhost_user_socket *vsocket;
        uint64_t vdpa_protocol_features;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
        int ret = 0;
 
        pthread_mutex_lock(&vhost_user.mutex);
@@ -760,8 +753,7 @@ rte_vhost_driver_get_protocol_features(const char *path,
                goto unlock_exit;
        }
 
-       did = vsocket->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = vsocket->vdpa_dev;
        if (!vdpa_dev || !vdpa_dev->ops->get_protocol_features) {
                *protocol_features = vsocket->protocol_features;
                goto unlock_exit;
@@ -790,7 +782,6 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)
        struct vhost_user_socket *vsocket;
        uint32_t vdpa_queue_num;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
        int ret = 0;
 
        pthread_mutex_lock(&vhost_user.mutex);
@@ -802,8 +793,7 @@ rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)
                goto unlock_exit;
        }
 
-       did = vsocket->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = vsocket->vdpa_dev;
        if (!vdpa_dev || !vdpa_dev->ops->get_queue_num) {
                *queue_num = VHOST_MAX_QUEUE_PAIRS;
                goto unlock_exit;
@@ -878,7 +868,7 @@ rte_vhost_driver_register(const char *path, uint64_t flags)
                        "error: failed to init connection mutex\n");
                goto out_free;
        }
-       vsocket->vdpa_dev_id = -1;
+       vsocket->vdpa_dev = NULL;
        vsocket->dequeue_zero_copy = flags & RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
        vsocket->extbuf = flags & RTE_VHOST_USER_EXTBUF_SUPPORT;
        vsocket->linearbuf = flags & RTE_VHOST_USER_LINEARBUF_SUPPORT;
index 0266318..0d822d6 100644 (file)
@@ -633,7 +633,6 @@ vhost_new_device(void)
        dev->vid = i;
        dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;
        dev->slave_req_fd = -1;
-       dev->vdpa_dev_id = -1;
        dev->postcopy_ufd = -1;
        rte_spinlock_init(&dev->slave_req_lock);
 
@@ -644,11 +643,9 @@ void
 vhost_destroy_device_notify(struct virtio_net *dev)
 {
        struct rte_vdpa_device *vdpa_dev;
-       int did;
 
        if (dev->flags & VIRTIO_DEV_RUNNING) {
-               did = dev->vdpa_dev_id;
-               vdpa_dev = rte_vdpa_get_device(did);
+               vdpa_dev = dev->vdpa_dev;
                if (vdpa_dev && vdpa_dev->ops->dev_close)
                        vdpa_dev->ops->dev_close(dev->vid);
                dev->flags &= ~VIRTIO_DEV_RUNNING;
@@ -677,17 +674,14 @@ vhost_destroy_device(int vid)
 }
 
 void
-vhost_attach_vdpa_device(int vid, int did)
+vhost_attach_vdpa_device(int vid, struct rte_vdpa_device *vdpa_dev)
 {
        struct virtio_net *dev = get_device(vid);
 
        if (dev == NULL)
                return;
 
-       if (rte_vdpa_get_device(did) == NULL)
-               return;
-
-       dev->vdpa_dev_id = did;
+       dev->vdpa_dev = vdpa_dev;
 }
 
 void
@@ -1402,14 +1396,15 @@ out:
        return ret;
 }
 
-int rte_vhost_get_vdpa_device_id(int vid)
+struct rte_vdpa_device *
+rte_vhost_get_vdpa_device(int vid)
 {
        struct virtio_net *dev = get_device(vid);
 
        if (dev == NULL)
-               return -1;
+               return NULL;
 
-       return dev->vdpa_dev_id;
+       return dev->vdpa_dev;
 }
 
 int rte_vhost_get_log_base(int vid, uint64_t *log_base,
index df98d15..819857a 100644 (file)
@@ -377,11 +377,7 @@ struct virtio_net {
        int                     postcopy_ufd;
        int                     postcopy_listening;
 
-       /*
-        * Device id to identify a specific backend device.
-        * It's set to -1 for the default software implementation.
-        */
-       int                     vdpa_dev_id;
+       struct rte_vdpa_device *vdpa_dev;
 
        /* context data for the external message handlers */
        void                    *extern_data;
@@ -639,7 +635,7 @@ void free_vq(struct virtio_net *dev, 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_attach_vdpa_device(int vid, struct rte_vdpa_device *dev);
 
 void vhost_set_ifname(int, const char *if_name, unsigned int if_len);
 void vhost_enable_dequeue_zero_copy(int vid);
index ea9cd10..3405cd8 100644 (file)
@@ -315,7 +315,6 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg,
        uint64_t features = msg->payload.u64;
        uint64_t vhost_features = 0;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
 
        if (validate_msg_fds(msg, 0) != 0)
                return RTE_VHOST_MSG_RESULT_ERR;
@@ -384,8 +383,7 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg,
                }
        }
 
-       did = dev->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = dev->vdpa_dev;
        if (vdpa_dev && vdpa_dev->ops->set_features)
                vdpa_dev->ops->set_features(dev->vid);
 
@@ -1971,7 +1969,6 @@ vhost_user_set_vring_enable(struct virtio_net **pdev,
        int enable = (int)msg->payload.state.num;
        int index = (int)msg->payload.state.index;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
 
        if (validate_msg_fds(msg, 0) != 0)
                return RTE_VHOST_MSG_RESULT_ERR;
@@ -1980,8 +1977,7 @@ vhost_user_set_vring_enable(struct virtio_net **pdev,
                "set queue enable: %d to qp idx: %d\n",
                enable, index);
 
-       did = dev->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = dev->vdpa_dev;
        if (vdpa_dev && vdpa_dev->ops->set_vring_state)
                vdpa_dev->ops->set_vring_state(dev->vid, index, enable);
 
@@ -2147,7 +2143,6 @@ vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg,
        struct virtio_net *dev = *pdev;
        uint8_t *mac = (uint8_t *)&msg->payload.u64;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
 
        if (validate_msg_fds(msg, 0) != 0)
                return RTE_VHOST_MSG_RESULT_ERR;
@@ -2165,8 +2160,7 @@ vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg,
         * copied before the flag is set.
         */
        __atomic_store_n(&dev->broadcast_rarp, 1, __ATOMIC_RELEASE);
-       did = dev->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = dev->vdpa_dev;
        if (vdpa_dev && vdpa_dev->ops->migration_done)
                vdpa_dev->ops->migration_done(dev->vid);
 
@@ -2613,7 +2607,6 @@ vhost_user_msg_handler(int vid, int fd)
        struct virtio_net *dev;
        struct VhostUserMsg msg;
        struct rte_vdpa_device *vdpa_dev;
-       int did = -1;
        int ret;
        int unlock_required = 0;
        bool handled;
@@ -2805,8 +2798,7 @@ skip_to_post_handle:
                }
        }
 
-       did = dev->vdpa_dev_id;
-       vdpa_dev = rte_vdpa_get_device(did);
+       vdpa_dev = dev->vdpa_dev;
        if (vdpa_dev && virtio_is_ready(dev) &&
                        !(dev->flags & VIRTIO_DEV_VDPA_CONFIGURED) &&
                        msg.request.master == VHOST_USER_SET_VRING_CALL) {
@@ -2955,7 +2947,7 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
 {
        struct virtio_net *dev;
        struct rte_vdpa_device *vdpa_dev;
-       int vfio_device_fd, did, ret = 0;
+       int vfio_device_fd, ret = 0;
        uint64_t offset, size;
        unsigned int i;
 
@@ -2963,9 +2955,9 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
        if (!dev)
                return -ENODEV;
 
-       did = dev->vdpa_dev_id;
-       if (did < 0)
-               return -EINVAL;
+       vdpa_dev = dev->vdpa_dev;
+       if (vdpa_dev == NULL)
+               return -ENODEV;
 
        if (!(dev->features & (1ULL << VIRTIO_F_VERSION_1)) ||
            !(dev->features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) ||
@@ -2977,10 +2969,6 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
                        (1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER)))
                return -ENOTSUP;
 
-       vdpa_dev = rte_vdpa_get_device(did);
-       if (!vdpa_dev)
-               return -ENODEV;
-
        RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_vfio_device_fd, -ENOTSUP);
        RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_notify_area, -ENOTSUP);