> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Wednesday, September 23, 2020 5:49 PM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; ma...@mellanox.com; > Zawadzki, Tomasz <tomasz.zawad...@intel.com>; Liu, Changpeng > <changpeng....@intel.com> > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH] vhost: fix external backends readiness > > Commit d0fcc38f5fa4 ("vhost: improve device readiness notifications") > makes the assumption that every Virtio devices are considered > ready for preocessing as soon as first queue pair is configured > and enabled. > > While this is true for Virtio-net, it isn't for Virtio-scsi > and Virtio-blk. > > This patch fixes this by only making this assumption for > the builtin Virtio-net backend, and restores back to previous > behaviour for other backends. > > Fixes: d0fcc38f5fa4 ("vhost: improve device readiness notifications") > > Reported-by: Changpeng Liu <changpeng....@intel.com> > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > Signed-off-by: Changpeng Liu <changpeng....@intel.com> > --- > lib/librte_vhost/vhost_user.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c > index 501218e192..b00e1f91dc 100644 > --- a/lib/librte_vhost/vhost_user.c > +++ b/lib/librte_vhost/vhost_user.c > @@ -1343,21 +1343,28 @@ vq_is_ready(struct virtio_net *dev, struct > vhost_virtqueue *vq) > vq->enabled; > } > > -#define VIRTIO_DEV_NUM_VQS_TO_BE_READY 2u > +#define VIRTIO_BUILTIN_NUM_VQS_TO_BE_READY 2u > > static int > virtio_is_ready(struct virtio_net *dev) > { > struct vhost_virtqueue *vq; > - uint32_t i; > + uint32_t i, nr_vring = dev->nr_vring; > > if (dev->flags & VIRTIO_DEV_READY) > return 1; > > - if (dev->nr_vring < VIRTIO_DEV_NUM_VQS_TO_BE_READY) > + if (!dev->nr_vring) > return 0; > > - for (i = 0; i < VIRTIO_DEV_NUM_VQS_TO_BE_READY; i++) { > + 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]; > > if (!vq_is_ready(dev, vq)) > -- > 2.26.2
Reviewed-by: Chenbo Xia <chenbo....@intel.com>