[v6,7/8] vhost: vDPA blk device gets ready when the first queue is ready
Checks
Commit Message
When boot from virtio blk device, seabios in QEMU only enables one queue.
To work in this scenario, vDPA BLK device back-end configure device
when any queue is ready.
Add vdpa_device_type to rte_vdpa_device to store vDPA device type.
Signed-off-by: Andy Pei <andy.pei@intel.com>
Signed-off-by: Huang Wei <wei.huang@intel.com>
---
lib/vhost/vdpa_driver.h | 2 ++
lib/vhost/vhost_user.c | 55 ++++++++++++++++++++++++++++++++++---------------
2 files changed, 40 insertions(+), 17 deletions(-)
@@ -92,6 +92,8 @@ struct rte_vdpa_device {
struct rte_device *device;
/** vdpa device operations */
struct rte_vdpa_dev_ops *ops;
+ /** vdpa device type: net, blk... */
+ uint32_t vdpa_device_type;
};
/**
@@ -1441,11 +1441,14 @@
}
#define VIRTIO_BUILTIN_NUM_VQS_TO_BE_READY 2u
+#define VIRTIO_BLK_NUM_VQS_TO_BE_READY 1u
static int
virtio_is_ready(struct virtio_net *dev)
{
+ struct rte_vdpa_device *vdpa_dev;
struct vhost_virtqueue *vq;
+ uint32_t vdpa_type;
uint32_t i, nr_vring = dev->nr_vring;
if (dev->flags & VIRTIO_DEV_READY)
@@ -1454,13 +1457,22 @@
if (!dev->nr_vring)
return 0;
- if (dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET) {
- nr_vring = VIRTIO_BUILTIN_NUM_VQS_TO_BE_READY;
+ vdpa_dev = dev->vdpa_dev;
+ if (vdpa_dev)
+ vdpa_type = vdpa_dev->vdpa_device_type;
+ else
+ vdpa_type = -1;
- if (dev->nr_vring < nr_vring)
- return 0;
+ if (vdpa_type == RTE_VHOST_VDPA_DEVICE_TYPE_BLK) {
+ nr_vring = VIRTIO_BLK_NUM_VQS_TO_BE_READY;
+ } else {
+ if (dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET)
+ nr_vring = VIRTIO_BUILTIN_NUM_VQS_TO_BE_READY;
}
+ if (dev->nr_vring < nr_vring)
+ return 0;
+
for (i = 0; i < nr_vring; i++) {
vq = dev->virtqueue[i];
@@ -2958,7 +2970,7 @@ static int is_vring_iotlb(struct virtio_net *dev,
int ret;
int unlock_required = 0;
bool handled;
- uint32_t vdpa_type = 0;
+ uint32_t vdpa_type = -1;
uint32_t request;
uint32_t i;
@@ -3152,7 +3164,27 @@ static int is_vring_iotlb(struct virtio_net *dev,
if (unlock_required)
vhost_user_unlock_all_queue_pairs(dev);
- if (ret != 0 || !virtio_is_ready(dev))
+ if (ret != 0)
+ goto out;
+
+ vdpa_dev = dev->vdpa_dev;
+ if (vdpa_dev) {
+ if (vdpa_dev->ops->get_dev_type) {
+ ret = vdpa_dev->ops->get_dev_type(vdpa_dev, &vdpa_type);
+ if (ret) {
+ VHOST_LOG_CONFIG(dev->ifname, ERR,
+ "failed to get vdpa dev type.\n");
+ ret = -1;
+ goto out;
+ }
+ } else {
+ vdpa_type = RTE_VHOST_VDPA_DEVICE_TYPE_NET;
+ }
+
+ vdpa_dev->vdpa_device_type = vdpa_type;
+ }
+
+ if (!virtio_is_ready(dev))
goto out;
/*
@@ -3166,20 +3198,9 @@ static int is_vring_iotlb(struct virtio_net *dev,
dev->flags |= VIRTIO_DEV_RUNNING;
}
- vdpa_dev = dev->vdpa_dev;
if (!vdpa_dev)
goto out;
- if (vdpa_dev->ops->get_dev_type) {
- ret = vdpa_dev->ops->get_dev_type(vdpa_dev, &vdpa_type);
- if (ret) {
- VHOST_LOG_CONFIG(dev->ifname, ERR, "failed to get vdpa dev type.\n");
- ret = -1;
- goto out;
- }
- } else {
- vdpa_type = RTE_VHOST_VDPA_DEVICE_TYPE_NET;
- }
if (vdpa_type == RTE_VHOST_VDPA_DEVICE_TYPE_BLK
&& request != VHOST_USER_SET_VRING_CALL)
goto out;