4aa328d7c1
Update to v2.8.0, including integration of SLE qemu package so we are "Factory First" again for SLE qemu. Includes some spec file tweaks/cleanups as well. A number of post v2.8.0 security fixes are also included. OBS-URL: https://build.opensuse.org/request/show/461715 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=329
54 lines
2.2 KiB
Diff
54 lines
2.2 KiB
Diff
From d1d06f7db5b44371db5dc1c559c5d8c1bda9d731 Mon Sep 17 00:00:00 2001
|
|
From: Halil Pasic <pasic@linux.vnet.ibm.com>
|
|
Date: Mon, 19 Dec 2016 16:44:44 +0100
|
|
Subject: [PATCH] virtio: fix vq->inuse recalc after migr
|
|
|
|
Correct recalculation of vq->inuse after migration for the corner case
|
|
where the avail_idx has already wrapped but used_idx not yet.
|
|
|
|
Also change the type of the VirtQueue.inuse to unsigned int. This is
|
|
done to be consistent with other members representing sizes (VRing.num),
|
|
and because C99 guarantees max ring size < UINT_MAX but does not
|
|
guarantee max ring size < INT_MAX.
|
|
|
|
Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
|
|
Fixes: bccdef6b ("virtio: recalculate vq->inuse after migration")
|
|
CC: qemu-stable@nongnu.org
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
(cherry picked from commit e66bcc408146730958d1a840bda85d7ad51e0cd7)
|
|
[BR: BSC#1020928]
|
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
|
---
|
|
hw/virtio/virtio.c | 8 +++++---
|
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
|
|
index 1af2de2714..e37641a9c9 100644
|
|
--- a/hw/virtio/virtio.c
|
|
+++ b/hw/virtio/virtio.c
|
|
@@ -92,7 +92,7 @@ struct VirtQueue
|
|
|
|
uint16_t queue_index;
|
|
|
|
- int inuse;
|
|
+ unsigned int inuse;
|
|
|
|
uint16_t vector;
|
|
VirtIOHandleOutput handle_output;
|
|
@@ -1855,9 +1855,11 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
|
|
/*
|
|
* Some devices migrate VirtQueueElements that have been popped
|
|
* from the avail ring but not yet returned to the used ring.
|
|
+ * Since max ring size < UINT16_MAX it's safe to use modulo
|
|
+ * UINT16_MAX + 1 subtraction.
|
|
*/
|
|
- vdev->vq[i].inuse = vdev->vq[i].last_avail_idx -
|
|
- vdev->vq[i].used_idx;
|
|
+ vdev->vq[i].inuse = (uint16_t)(vdev->vq[i].last_avail_idx -
|
|
+ vdev->vq[i].used_idx);
|
|
if (vdev->vq[i].inuse > vdev->vq[i].vring.num) {
|
|
error_report("VQ %d size 0x%x < last_avail_idx 0x%x - "
|
|
"used_idx 0x%x",
|