Reviewed-by: Raphael Norwitz <raphael.norw...@nutanix.com>
On Thu, Apr 22, 2021 at 07:02:21PM +0200, Kevin Wolf wrote: > Creating a device with a number of queues that isn't supported by the > backend is pointless, the device won't work properly and the error > messages are rather confusing. > > Just fail to create the device if num-queues is higher than what the > backend supports. > > Since the relationship between num-queues and the number of virtqueues > depends on the specific device, this is an additional value that needs > to be initialised by the device. For convenience, allow leaving it 0 if > the check should be skipped. This makes sense for vhost-user-net where > separate vhost devices are used for the queues and custom initialisation > code is needed to perform the check. > > Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1935031 > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > include/hw/virtio/vhost.h | 2 ++ > hw/block/vhost-user-blk.c | 1 + > hw/virtio/vhost-user.c | 5 +++++ > 3 files changed, 8 insertions(+) > > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h > index 4a8bc75415..21a9a52088 100644 > --- a/include/hw/virtio/vhost.h > +++ b/include/hw/virtio/vhost.h > @@ -74,6 +74,8 @@ struct vhost_dev { > int nvqs; > /* the first virtqueue which would be used by this vhost dev */ > int vq_index; > + /* if non-zero, minimum required value for max_queues */ > + int num_queues; > uint64_t features; > uint64_t acked_features; > uint64_t backend_features; > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > index b6f4bb3f6f..ac2193abef 100644 > --- a/hw/block/vhost-user-blk.c > +++ b/hw/block/vhost-user-blk.c > @@ -324,6 +324,7 @@ static int vhost_user_blk_connect(DeviceState *dev, Error > **errp) > } > s->connected = true; > > + s->dev.num_queues = s->num_queues; > s->dev.nvqs = s->num_queues; > s->dev.vqs = s->vhost_vqs; > s->dev.vq_index = 0; > diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c > index ded0c10453..ee57abe045 100644 > --- a/hw/virtio/vhost-user.c > +++ b/hw/virtio/vhost-user.c > @@ -1909,6 +1909,11 @@ static int vhost_user_backend_init(struct vhost_dev > *dev, void *opaque) > return err; > } > } > + if (dev->num_queues && dev->max_queues < dev->num_queues) { > + error_report("The maximum number of queues supported by the " > + "backend is %" PRIu64, dev->max_queues); > + return -EINVAL; > + } > > if (virtio_has_feature(features, VIRTIO_F_IOMMU_PLATFORM) && > !(virtio_has_feature(dev->protocol_features, > -- > 2.30.2 >