Message ID | 20220726072225.19884-23-xuanzhuo@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio pci support VIRTIO_F_RING_RESET | expand |
在 2022/7/26 15:22, 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 | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > index 00b18cf3b4d9..7d4c444b5a9d 100644 > --- a/drivers/virtio/virtio_ring.c > +++ b/drivers/virtio/virtio_ring.c > @@ -1957,6 +1957,27 @@ static void virtqueue_vring_attach_packed(struct vring_virtqueue *vq, > vq->packed = *vring_packed; > } > > +static void virtqueue_reinit_packed(struct vring_virtqueue *vq) > +{ > + 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; > + > + virtqueue_init(vq, vq->packed.vring.num); > + virtqueue_vring_init_packed(&vq->packed, !!vq->vq.callback); > +} > + > static struct virtqueue *vring_create_virtqueue_packed( > unsigned int index, > unsigned int num,
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 00b18cf3b4d9..7d4c444b5a9d 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -1957,6 +1957,27 @@ static void virtqueue_vring_attach_packed(struct vring_virtqueue *vq, vq->packed = *vring_packed; } +static void virtqueue_reinit_packed(struct vring_virtqueue *vq) +{ + 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; + + virtqueue_init(vq, vq->packed.vring.num); + virtqueue_vring_init_packed(&vq->packed, !!vq->vq.callback); +} + static struct virtqueue *vring_create_virtqueue_packed( unsigned int index, unsigned int num,
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 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)