Message ID | 20220406034346.74409-11-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | virtio pci support VIRTIO_F_RING_RESET (refactor vring) | expand |
在 2022/4/6 上午11:43, Xuan Zhuo 写道: > Introduce a function to initialize vq without allocating new ring, > desc_state, desc_extra. > > Subsequent patches will call this function after reset vq to > reinitialize vq. > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > drivers/virtio/virtio_ring.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index 874f878087a3..3dc6ace2ba7a 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -953,6 +953,25 @@ static void vring_virtqueue_init_split(struct vring_virtqueue *vq, > vq->free_head = 0; > } > > +static void virtqueue_reinit_split(struct vring_virtqueue *vq) > +{ > + struct virtio_device *vdev = vq->vq.vdev; > + int size, i; > + > + memset(vq->split.vring.desc, 0, vq->split.queue_size_in_bytes); > + > + size = sizeof(struct vring_desc_state_split) * vq->split.vring.num; > + memset(vq->split.desc_state, 0, size); > + > + size = sizeof(struct vring_desc_extra) * vq->split.vring.num; > + memset(vq->split.desc_extra, 0, size); > + > + for (i = 0; i < vq->split.vring.num - 1; i++) > + vq->split.desc_extra[i].next = i + 1; > + > + vring_virtqueue_init_split(vq, vdev, true); > +} > + > static void vring_virtqueue_attach_split(struct vring_virtqueue *vq, > struct vring vring, > struct vring_desc_state_split *desc_state,
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 874f878087a3..3dc6ace2ba7a 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -953,6 +953,25 @@ static void vring_virtqueue_init_split(struct vring_virtqueue *vq, vq->free_head = 0; } +static void virtqueue_reinit_split(struct vring_virtqueue *vq) +{ + struct virtio_device *vdev = vq->vq.vdev; + int size, i; + + memset(vq->split.vring.desc, 0, vq->split.queue_size_in_bytes); + + size = sizeof(struct vring_desc_state_split) * vq->split.vring.num; + memset(vq->split.desc_state, 0, size); + + size = sizeof(struct vring_desc_extra) * vq->split.vring.num; + memset(vq->split.desc_extra, 0, size); + + for (i = 0; i < vq->split.vring.num - 1; i++) + vq->split.desc_extra[i].next = i + 1; + + vring_virtqueue_init_split(vq, vdev, true); +} + static void vring_virtqueue_attach_split(struct vring_virtqueue *vq, struct vring vring, struct vring_desc_state_split *desc_state,
Introduce a function to initialize vq without allocating new ring, desc_state, desc_extra. Subsequent patches will call this function after reset vq to reinitialize vq. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/virtio/virtio_ring.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)