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@xxxxxxxxxxxxxxxxx> --- drivers/virtio/virtio_ring.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index c783eb272468..9a4f2db718bd 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -1971,6 +1971,27 @@ static void vring_virtqueue_init_packed(struct vring_virtqueue *vq, } } +static void virtqueue_reinit_packed(struct vring_virtqueue *vq) +{ + struct virtio_device *vdev = vq->vq.vdev; + int size, i; + + memset(vq->packed.vring.device, 0, vq->packed.event_size_in_bytes); + memset(vq->packed.vring.driver, 0, vq->packed.event_size_in_bytes); + memset(vq->packed.vring.desc, 0, vq->packed.ring_size_in_bytes); + + size = sizeof(struct vring_desc_state_packed) * vq->packed.vring.num; + memset(vq->packed.desc_state, 0, size); + + size = sizeof(struct vring_desc_extra) * vq->packed.vring.num; + memset(vq->packed.desc_extra, 0, size); + + for (i = 0; i < vq->packed.vring.num - 1; i++) + vq->packed.desc_extra[i].next = i + 1; + + vring_virtqueue_init_packed(vq, vdev); +} + static struct virtqueue *vring_create_virtqueue_packed( unsigned int index, unsigned int num, -- 2.31.0