qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 1/1] virtio: fix vq->inuse recalc after migr
@ 2016-12-19 15:44 Halil Pasic
  2016-12-20  9:42 ` Stefan Hajnoczi
  0 siblings, 1 reply; 2+ messages in thread
From: Halil Pasic @ 2016-12-19 15:44 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-stable, Michael S. Tsirkin, Stefan Hajnoczi, Halil Pasic

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
---
v1 -> v2:
* Reworded comment explaining the cast. (thanks Stefan)
* Changed type of vq->inuse from signed to unsigned
* Fixed misnomer %s/vring->inuse/vq->inuse/
---
 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 1af2de2..e37641a 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",
-- 
2.8.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH v2 1/1] virtio: fix vq->inuse recalc after migr
  2016-12-19 15:44 [Qemu-devel] [PATCH v2 1/1] virtio: fix vq->inuse recalc after migr Halil Pasic
@ 2016-12-20  9:42 ` Stefan Hajnoczi
  0 siblings, 0 replies; 2+ messages in thread
From: Stefan Hajnoczi @ 2016-12-20  9:42 UTC (permalink / raw)
  To: Halil Pasic; +Cc: qemu-devel, qemu-stable, Michael S. Tsirkin

[-- Attachment #1: Type: text/plain, Size: 949 bytes --]

On Mon, Dec 19, 2016 at 04:44:44PM +0100, Halil Pasic wrote:
> 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
> ---
> v1 -> v2:
> * Reworded comment explaining the cast. (thanks Stefan)
> * Changed type of vq->inuse from signed to unsigned
> * Fixed misnomer %s/vring->inuse/vq->inuse/
> ---
>  hw/virtio/virtio.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-12-20  9:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-12-19 15:44 [Qemu-devel] [PATCH v2 1/1] virtio: fix vq->inuse recalc after migr Halil Pasic
2016-12-20  9:42 ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).