vhost: replace vDPA device ID in Vhost
[dpdk.git] / lib / librte_vhost / vhost_user.c
index ff5b131..3405cd8 100644 (file)
@@ -206,7 +206,7 @@ vhost_backend_cleanup(struct virtio_net *dev)
                        dev->inflight_info->addr = NULL;
                }
 
-               if (dev->inflight_info->fd > 0) {
+               if (dev->inflight_info->fd >= 0) {
                        close(dev->inflight_info->fd);
                        dev->inflight_info->fd = -1;
                }
@@ -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);
 
@@ -1417,6 +1415,7 @@ vhost_user_get_inflight_fd(struct virtio_net **pdev,
                                "failed to alloc dev inflight area\n");
                        return RTE_VHOST_MSG_RESULT_ERR;
                }
+               dev->inflight_info->fd = -1;
        }
 
        num_queues = msg->payload.inflight.num_queues;
@@ -1442,6 +1441,16 @@ vhost_user_get_inflight_fd(struct virtio_net **pdev,
        }
        memset(addr, 0, mmap_size);
 
+       if (dev->inflight_info->addr) {
+               munmap(dev->inflight_info->addr, dev->inflight_info->size);
+               dev->inflight_info->addr = NULL;
+       }
+
+       if (dev->inflight_info->fd >= 0) {
+               close(dev->inflight_info->fd);
+               dev->inflight_info->fd = -1;
+       }
+
        dev->inflight_info->addr = addr;
        dev->inflight_info->size = msg->payload.inflight.mmap_size = mmap_size;
        dev->inflight_info->fd = msg->fds[0] = fd;
@@ -1524,10 +1533,13 @@ vhost_user_set_inflight_fd(struct virtio_net **pdev, VhostUserMsg *msg,
                                "failed to alloc dev inflight area\n");
                        return RTE_VHOST_MSG_RESULT_ERR;
                }
+               dev->inflight_info->fd = -1;
        }
 
-       if (dev->inflight_info->addr)
+       if (dev->inflight_info->addr) {
                munmap(dev->inflight_info->addr, dev->inflight_info->size);
+               dev->inflight_info->addr = NULL;
+       }
 
        addr = mmap(0, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, mmap_offset);
@@ -1536,8 +1548,10 @@ vhost_user_set_inflight_fd(struct virtio_net **pdev, VhostUserMsg *msg,
                return RTE_VHOST_MSG_RESULT_ERR;
        }
 
-       if (dev->inflight_info->fd)
+       if (dev->inflight_info->fd >= 0) {
                close(dev->inflight_info->fd);
+               dev->inflight_info->fd = -1;
+       }
 
        dev->inflight_info->fd = fd;
        dev->inflight_info->addr = addr;
@@ -1955,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;
@@ -1964,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);
 
@@ -1996,15 +2008,6 @@ vhost_user_get_protocol_features(struct virtio_net **pdev,
        rte_vhost_driver_get_features(dev->ifname, &features);
        rte_vhost_driver_get_protocol_features(dev->ifname, &protocol_features);
 
-       /*
-        * REPLY_ACK protocol feature is only mandatory for now
-        * for IOMMU feature. If IOMMU is explicitly disabled by the
-        * application, disable also REPLY_ACK feature for older buggy
-        * Qemu versions (from v2.7.0 to v2.9.0).
-        */
-       if (!(features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)))
-               protocol_features &= ~(1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK);
-
        msg->payload.u64 = protocol_features;
        msg->size = sizeof(msg->payload.u64);
        msg->fd_num = 0;
@@ -2140,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;
@@ -2158,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);
 
@@ -2534,7 +2535,7 @@ static int
 vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev,
                        struct VhostUserMsg *msg)
 {
-       uint16_t vring_idx;
+       uint32_t vring_idx;
 
        switch (msg->request.master) {
        case VHOST_USER_SET_VRING_KICK:
@@ -2606,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;
@@ -2798,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) {
@@ -2948,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;
 
@@ -2956,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)) ||
@@ -2970,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);