[v8,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>
---
lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
Comments
On 10/18/22 14:07, Andy Pei wrote:
> 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>
> ---
> lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
> 1 file changed, 17 insertions(+), 16 deletions(-)
>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks,
Maxime
HI Maxime,
Thanks for your review.
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Tuesday, October 18, 2022 10:09 PM
> To: Pei, Andy <andy.pei@intel.com>; dev@dpdk.org
> Cc: Xia, Chenbo <Chenbo.Xia@intel.com>; Xu, Rosen <rosen.xu@intel.com>;
> Huang, Wei <wei.huang@intel.com>; Cao, Gang <gang.cao@intel.com>
> Subject: Re: [PATCH v8 11/12] vhost: vDPA blk device gets ready when the
> first queue is ready
>
>
>
> On 10/18/22 14:07, Andy Pei wrote:
> > 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>
> > ---
> > lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
> > 1 file changed, 17 insertions(+), 16 deletions(-)
> >
>
> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>
> Thanks,
> Maxime
> -----Original Message-----
> From: Pei, Andy <andy.pei@intel.com>
> Sent: Tuesday, October 18, 2022 8:08 PM
> To: dev@dpdk.org
> Cc: Xia, Chenbo <chenbo.xia@intel.com>; Xu, Rosen <rosen.xu@intel.com>;
> Huang, Wei <wei.huang@intel.com>; Cao, Gang <gang.cao@intel.com>;
> maxime.coquelin@redhat.com
> Subject: [PATCH v8 11/12] vhost: vDPA blk device gets ready when the first
> queue is ready
>
> 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>
> ---
> lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
> 1 file changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c
> index cd65257..e0ff79d 100644
> --- a/lib/vhost/vhost_user.c
> +++ b/lib/vhost/vhost_user.c
> @@ -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;
>
> --
> 1.8.3.1
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
Hi Chenbo,
Thanks for your review.
> -----Original Message-----
> From: Xia, Chenbo <chenbo.xia@intel.com>
> Sent: Wednesday, October 19, 2022 5:15 PM
> To: Pei, Andy <andy.pei@intel.com>; dev@dpdk.org
> Cc: Xu, Rosen <rosen.xu@intel.com>; Huang, Wei <wei.huang@intel.com>;
> Cao, Gang <gang.cao@intel.com>; maxime.coquelin@redhat.com
> Subject: RE: [PATCH v8 11/12] vhost: vDPA blk device gets ready when the
> first queue is ready
>
> > -----Original Message-----
> > From: Pei, Andy <andy.pei@intel.com>
> > Sent: Tuesday, October 18, 2022 8:08 PM
> > To: dev@dpdk.org
> > Cc: Xia, Chenbo <chenbo.xia@intel.com>; Xu, Rosen
> > <rosen.xu@intel.com>; Huang, Wei <wei.huang@intel.com>; Cao, Gang
> > <gang.cao@intel.com>; maxime.coquelin@redhat.com
> > Subject: [PATCH v8 11/12] vhost: vDPA blk device gets ready when the
> > first queue is ready
> >
> > 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>
> > ---
> > lib/vhost/vhost_user.c | 33 +++++++++++++++++----------------
> > 1 file changed, 17 insertions(+), 16 deletions(-)
> >
> > diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index
> > cd65257..e0ff79d 100644
> > --- a/lib/vhost/vhost_user.c
> > +++ b/lib/vhost/vhost_user.c
> > @@ -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;
> >
> > --
> > 1.8.3.1
>
> Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
@@ -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;