kvm tools: Fix virt_queue__set_used_elem

Increase idx only after updating the used element.
Not doing so may mark a buffer as used without having
it's head and length updated.

Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
Sasha Levin
2011-05-03 23:28:07 +03:00
committed by Will Deacon
parent ab9e4f1c87
commit 9490278221
+18 -1
View File
@@ -1,15 +1,32 @@
#include <linux/virtio_ring.h>
#include <stdint.h>
#include <sys/uio.h>
#include <asm/system.h>
#include "kvm/kvm.h"
#include "kvm/virtio.h"
struct vring_used_elem *virt_queue__set_used_elem(struct virt_queue *queue, uint32_t head, uint32_t len)
{
struct vring_used_elem *used_elem;
used_elem = &queue->vring.used->ring[queue->vring.used->idx++ % queue->vring.num];
used_elem = &queue->vring.used->ring[queue->vring.used->idx % queue->vring.num];
used_elem->id = head;
used_elem->len = len;
/*
* Use wmb to assure that used elem was updated with head and len.
* We need a wmb here since we can't advance idx unless we're ready
* to pass the used element to the guest.
*/
wmb();
queue->vring.used->idx++;
/*
* Use wmb to assure used idx has been increased before we signal the guest.
* Without a wmb here the guest may ignore the queue since it won't see
* an updated idx.
*/
wmb();
return used_elem;
}