Message ID | b6b5ceb2a099537731c130a4ed44d7e108e88a1d.1658141552.git.kangjie.xu@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support VIRTIO_F_RING_RESET for virtio-net and vhost-user in virtio pci | expand |
在 2022/7/18 19:17, Kangjie Xu 写道: > From: Xuan Zhuo <xuanzhuo@linux.alibaba.com> > > Separate the logic of vq reset. This logic will be called directly > later. > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > hw/virtio/virtio.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index 5d607aeaa0..67d54832a9 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -2019,6 +2019,26 @@ static enum virtio_device_endian virtio_current_cpu_endian(void) > } > } > > +static void __virtio_queue_reset(VirtIODevice *vdev, uint32_t i) > +{ > + vdev->vq[i].vring.desc = 0; > + vdev->vq[i].vring.avail = 0; > + vdev->vq[i].vring.used = 0; > + vdev->vq[i].last_avail_idx = 0; > + vdev->vq[i].shadow_avail_idx = 0; > + vdev->vq[i].used_idx = 0; > + vdev->vq[i].last_avail_wrap_counter = true; > + vdev->vq[i].shadow_avail_wrap_counter = true; > + vdev->vq[i].used_wrap_counter = true; > + virtio_queue_set_vector(vdev, i, VIRTIO_NO_VECTOR); > + vdev->vq[i].signalled_used = 0; > + vdev->vq[i].signalled_used_valid = false; > + vdev->vq[i].notification = true; > + vdev->vq[i].vring.num = vdev->vq[i].vring.num_default; > + vdev->vq[i].inuse = 0; > + virtio_virtqueue_reset_region_cache(&vdev->vq[i]); > +} > + > void virtio_reset(void *opaque) > { > VirtIODevice *vdev = opaque; > @@ -2050,22 +2070,7 @@ void virtio_reset(void *opaque) > virtio_notify_vector(vdev, vdev->config_vector); > > for(i = 0; i < VIRTIO_QUEUE_MAX; i++) { > - vdev->vq[i].vring.desc = 0; > - vdev->vq[i].vring.avail = 0; > - vdev->vq[i].vring.used = 0; > - vdev->vq[i].last_avail_idx = 0; > - vdev->vq[i].shadow_avail_idx = 0; > - vdev->vq[i].used_idx = 0; > - vdev->vq[i].last_avail_wrap_counter = true; > - vdev->vq[i].shadow_avail_wrap_counter = true; > - vdev->vq[i].used_wrap_counter = true; > - virtio_queue_set_vector(vdev, i, VIRTIO_NO_VECTOR); > - vdev->vq[i].signalled_used = 0; > - vdev->vq[i].signalled_used_valid = false; > - vdev->vq[i].notification = true; > - vdev->vq[i].vring.num = vdev->vq[i].vring.num_default; > - vdev->vq[i].inuse = 0; > - virtio_virtqueue_reset_region_cache(&vdev->vq[i]); > + __virtio_queue_reset(vdev, i); > } > } >
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 5d607aeaa0..67d54832a9 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -2019,6 +2019,26 @@ static enum virtio_device_endian virtio_current_cpu_endian(void) } } +static void __virtio_queue_reset(VirtIODevice *vdev, uint32_t i) +{ + vdev->vq[i].vring.desc = 0; + vdev->vq[i].vring.avail = 0; + vdev->vq[i].vring.used = 0; + vdev->vq[i].last_avail_idx = 0; + vdev->vq[i].shadow_avail_idx = 0; + vdev->vq[i].used_idx = 0; + vdev->vq[i].last_avail_wrap_counter = true; + vdev->vq[i].shadow_avail_wrap_counter = true; + vdev->vq[i].used_wrap_counter = true; + virtio_queue_set_vector(vdev, i, VIRTIO_NO_VECTOR); + vdev->vq[i].signalled_used = 0; + vdev->vq[i].signalled_used_valid = false; + vdev->vq[i].notification = true; + vdev->vq[i].vring.num = vdev->vq[i].vring.num_default; + vdev->vq[i].inuse = 0; + virtio_virtqueue_reset_region_cache(&vdev->vq[i]); +} + void virtio_reset(void *opaque) { VirtIODevice *vdev = opaque; @@ -2050,22 +2070,7 @@ void virtio_reset(void *opaque) virtio_notify_vector(vdev, vdev->config_vector); for(i = 0; i < VIRTIO_QUEUE_MAX; i++) { - vdev->vq[i].vring.desc = 0; - vdev->vq[i].vring.avail = 0; - vdev->vq[i].vring.used = 0; - vdev->vq[i].last_avail_idx = 0; - vdev->vq[i].shadow_avail_idx = 0; - vdev->vq[i].used_idx = 0; - vdev->vq[i].last_avail_wrap_counter = true; - vdev->vq[i].shadow_avail_wrap_counter = true; - vdev->vq[i].used_wrap_counter = true; - virtio_queue_set_vector(vdev, i, VIRTIO_NO_VECTOR); - vdev->vq[i].signalled_used = 0; - vdev->vq[i].signalled_used_valid = false; - vdev->vq[i].notification = true; - vdev->vq[i].vring.num = vdev->vq[i].vring.num_default; - vdev->vq[i].inuse = 0; - virtio_virtqueue_reset_region_cache(&vdev->vq[i]); + __virtio_queue_reset(vdev, i); } }