diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2013-08-12 11:08:09 +0200 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2013-08-12 12:19:04 +0300 |
commit | 6793dfd1b6a99a79b9f2e3c4d6625ccd6513f240 (patch) | |
tree | 9bb84f2c48451af01e72111e68279a3112c87262 /hw | |
parent | 4965b7f056177ddfb816319e9ff5e766898d0bc5 (diff) | |
download | hqemu-6793dfd1b6a99a79b9f2e3c4d6625ccd6513f240.zip hqemu-6793dfd1b6a99a79b9f2e3c4d6625ccd6513f240.tar.gz |
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>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/virtio/dataplane/vring.c | 1 | ||||
-rw-r--r-- | hw/virtio/virtio.c | 5 |
2 files changed, 6 insertions, 0 deletions
diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 82cc151..351a343 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -52,6 +52,7 @@ bool vring_setup(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_invalidate_signalled_used(vdev, n); hostmem_finalize(&vring->hostmem); } diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 09f62c6..706bdf4 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -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; } +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) { return vdev->vq + n; |