Couldn't actually wrap around the vring.
authorKyle Milka <kmilka1995@gmail.com>
Mon, 8 Aug 2016 18:28:38 +0000 (11:28 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 9 Aug 2016 15:48:19 +0000 (11:48 -0400)
This check didn't allow the vring to actually wrap around, if the next
available index was less than the last index, it caused the error to be
triggered.

Change-Id: I90c26cfd894a9b729e44937e1894ce5bfbf1d144
Signed-off-by: Kyle Milka <kmilka@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/virtio_lguest_helpers.c

index 4d8585f..00a8fd6 100644 (file)
@@ -191,10 +191,10 @@ uint32_t virtio_next_avail_vq_desc(struct virtio_vq *vq, struct iovec iov[],
        // we last incremented vq->last_avail, because it would have run out of
        // places to put descriptors after incrementing exactly vring.num times
        // (prior to our next vq->last_avail++)
-       if ((vq->vring.avail->idx - vq->last_avail) > vq->vring.num)
+       if ((uint16_t)(vq->vring.avail->idx - vq->last_avail) > vq->vring.num)
                VIRTIO_DRI_ERRX(vq->vqdev,
-                       "The driver advanced vq->vring.avail->idx from %u to %u, which have a difference greater than the capacity of a queue. The idx is supposed to increase by 1 for each descriptor chain added to the available ring; the driver should have run out of room and thus been forced to wait for us to catch up!",
-                       vq->last_avail, vq->vring.avail);
+                               "vq index increased from %u to %u, exceeded capacity %u\n",
+                               vq->last_avail, vq->vring.avail->idx, vq->vring.num);
 
        // lguest says here:
        /*