virtio: clear signalled_used_valid when switching from dataplane
When the dataplane thread stops, its vring.c implementation synchronizes vring state back to virtio.c so we can continue emulating the virtio device. This patch ensures that virtio.c's signalled_used_valid flag is reset so that we do not suppress guest notifications due to stale signalled_used values. Suggested-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
4965b7f056
commit
6793dfd1b6
@ -52,6 +52,7 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
|
|||||||
void vring_teardown(Vring *vring, VirtIODevice *vdev, int n)
|
void vring_teardown(Vring *vring, VirtIODevice *vdev, int n)
|
||||||
{
|
{
|
||||||
virtio_queue_set_last_avail_idx(vdev, n, vring->last_avail_idx);
|
virtio_queue_set_last_avail_idx(vdev, n, vring->last_avail_idx);
|
||||||
|
virtio_queue_invalidate_signalled_used(vdev, n);
|
||||||
|
|
||||||
hostmem_finalize(&vring->hostmem);
|
hostmem_finalize(&vring->hostmem);
|
||||||
}
|
}
|
||||||
|
@ -1059,6 +1059,11 @@ void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
|
|||||||
vdev->vq[n].last_avail_idx = idx;
|
vdev->vq[n].last_avail_idx = idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n)
|
||||||
|
{
|
||||||
|
vdev->vq[n].signalled_used_valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n)
|
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n)
|
||||||
{
|
{
|
||||||
return vdev->vq + n;
|
return vdev->vq + n;
|
||||||
|
@ -237,6 +237,7 @@ hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
|
|||||||
hwaddr virtio_queue_get_ring_size(VirtIODevice *vdev, int n);
|
hwaddr virtio_queue_get_ring_size(VirtIODevice *vdev, int n);
|
||||||
uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
|
uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
|
||||||
void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
|
void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
|
||||||
|
void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
|
||||||
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n);
|
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n);
|
||||||
uint16_t virtio_get_queue_index(VirtQueue *vq);
|
uint16_t virtio_get_queue_index(VirtQueue *vq);
|
||||||
int virtio_queue_get_id(VirtQueue *vq);
|
int virtio_queue_get_id(VirtQueue *vq);
|
||||||
|
Loading…
Reference in New Issue
Block a user