[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-2.7 3/4] virtio: add virtqueue_rewind()
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH for-2.7 3/4] virtio: add virtqueue_rewind() |
Date: |
Fri, 12 Aug 2016 16:32:57 +0100 |
virtqueue_discard() requires a VirtQueueElement but virtio-balloon does
not migrate its in-use element. Introduce a new function that is
similar to virtqueue_discard() but doesn't require a VirtQueueElement.
This will allow virtio-balloon to access element again after migration
with the usual proviso that the guest may have modified the vring since
last time.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/virtio/virtio.c | 22 ++++++++++++++++++++++
include/hw/virtio/virtio.h | 1 +
2 files changed, 23 insertions(+)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 00158b6..22727ba 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -272,6 +272,28 @@ void virtqueue_discard(VirtQueue *vq, const
VirtQueueElement *elem,
virtqueue_unmap_sg(vq, elem, len);
}
+/* virtqueue_rewind:
+ * @vq: The #VirtQueue
+ * @num: Number of elements to push back
+ *
+ * Pretend that elements weren't popped from the virtqueue. The next
+ * virtqueue_pop() will refetch the oldest element.
+ *
+ * Use virtqueue_discard() instead if you have a VirtQueueElement.
+ *
+ * Returns: true on success, false if @num is greater than the number of in use
+ * elements.
+ */
+bool virtqueue_rewind(VirtQueue *vq, unsigned int num)
+{
+ if (num > vq->inuse) {
+ return false;
+ }
+ vq->last_avail_idx -= num;
+ vq->inuse -= num;
+ return true;
+}
+
void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
unsigned int len, unsigned int idx)
{
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index d2490c1..f05559d 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -154,6 +154,7 @@ void virtqueue_push(VirtQueue *vq, const VirtQueueElement
*elem,
void virtqueue_flush(VirtQueue *vq, unsigned int count);
void virtqueue_discard(VirtQueue *vq, const VirtQueueElement *elem,
unsigned int len);
+bool virtqueue_rewind(VirtQueue *vq, unsigned int num);
void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
unsigned int len, unsigned int idx);
--
2.7.4
- [Qemu-devel] [PATCH for-2.7 0/4] virtio-balloon: fix stats vq migration, Stefan Hajnoczi, 2016/08/12
- [Qemu-devel] [PATCH for-2.7 2/4] virtio: decrement vq->inuse in virtqueue_discard(), Stefan Hajnoczi, 2016/08/12
- [Qemu-devel] [PATCH for-2.7 4/4] virtio-balloon: fix stats vq migration, Stefan Hajnoczi, 2016/08/12
- [Qemu-devel] [PATCH for-2.7 3/4] virtio: add virtqueue_rewind(),
Stefan Hajnoczi <=
- [Qemu-devel] [PATCH for-2.7 1/4] virtio: recalculate vq->inuse after migration, Stefan Hajnoczi, 2016/08/12
- Re: [Qemu-devel] [PATCH for-2.7 0/4] virtio-balloon: fix stats vq migration, no-reply, 2016/08/12
- Re: [Qemu-devel] [PATCH for-2.7 0/4] virtio-balloon: fix stats vq migration, Gaudenz Steinlin, 2016/08/15