[v9,11/12] 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 the first queue is ready.
Signed-off-by: Andy Pei <andy.pei@intel.com>
Signed-off-by: Huang Wei <wei.huang@intel.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
@@ -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->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,6 @@ static int is_vring_iotlb(struct virtio_net *dev,
int ret;
int unlock_required = 0;
bool handled;
- uint32_t vdpa_type = 0;
uint32_t request;
uint32_t i;
@@ -3170,17 +3181,7 @@ static int is_vring_iotlb(struct virtio_net *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
+ if (vdpa_dev->type == RTE_VHOST_VDPA_DEVICE_TYPE_BLK
&& request != VHOST_USER_SET_VRING_CALL)
goto out;