[PATCH v13 16/42] virtio_ring: split: introduce virtqueue_resize_split()

Xuan Zhuo xuanzhuo at linux.alibaba.com
Wed Jul 27 00:36:53 PDT 2022


On Wed, 27 Jul 2022 11:12:19 +0800, Jason Wang <jasowang at redhat.com> wrote:
>
> 在 2022/7/26 15:21, Xuan Zhuo 写道:
> > virtio ring split supports resize.
> >
> > Only after the new vring is successfully allocated based on the new num,
> > we will release the old vring. In any case, an error is returned,
> > indicating that the vring still points to the old vring.
> >
> > In the case of an error, re-initialize(virtqueue_reinit_split()) the
> > virtqueue to ensure that the vring can be used.
> >
> > Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
> > Acked-by: Jason Wang <jasowang at redhat.com>
> > ---
> >   drivers/virtio/virtio_ring.c | 34 ++++++++++++++++++++++++++++++++++
> >   1 file changed, 34 insertions(+)
> >
> > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> > index b6fda91c8059..58355e1ac7d7 100644
> > --- a/drivers/virtio/virtio_ring.c
> > +++ b/drivers/virtio/virtio_ring.c
> > @@ -220,6 +220,7 @@ static struct virtqueue *__vring_new_virtqueue(unsigned int index,
> >   					       void (*callback)(struct virtqueue *),
> >   					       const char *name);
> >   static struct vring_desc_extra *vring_alloc_desc_extra(unsigned int num);
> > +static void vring_free(struct virtqueue *_vq);
> >
> >   /*
> >    * Helpers.
> > @@ -1117,6 +1118,39 @@ static struct virtqueue *vring_create_virtqueue_split(
> >   	return vq;
> >   }
> >
> > +static int virtqueue_resize_split(struct virtqueue *_vq, u32 num)
> > +{
> > +	struct vring_virtqueue_split vring_split = {};
> > +	struct vring_virtqueue *vq = to_vvq(_vq);
> > +	struct virtio_device *vdev = _vq->vdev;
> > +	int err;
> > +
> > +	err = vring_alloc_queue_split(&vring_split, vdev, num,
> > +				      vq->split.vring_align,
> > +				      vq->split.may_reduce_num);
> > +	if (err)
> > +		goto err;
>
>
> I think we don't need to do anything here?

Am I missing something?

>
>
> > +
> > +	err = vring_alloc_state_extra_split(&vring_split);
> > +	if (err) {
> > +		vring_free_split(&vring_split, vdev);
> > +		goto err;
>
>
> I suggest to move vring_free_split() into a dedicated error label.

Will change.

Thanks.


>
> Thanks
>
>
> > +	}
> > +
> > +	vring_free(&vq->vq);
> > +
> > +	virtqueue_vring_init_split(&vring_split, vq);
> > +
> > +	virtqueue_init(vq, vring_split.vring.num);
> > +	virtqueue_vring_attach_split(vq, &vring_split);
> > +
> > +	return 0;
> > +
> > +err:
> > +	virtqueue_reinit_split(vq);
> > +	return -ENOMEM;
> > +}
> > +
> >
> >   /*
> >    * Packed ring specific functions - *_packed().
>



More information about the linux-um mailing list