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. Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> --- tools/kvm/virtio.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/tools/kvm/virtio.c b/tools/kvm/virtio.c index 6249521..266a1b6 100644 --- a/tools/kvm/virtio.c +++ b/tools/kvm/virtio.c @@ -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; } -- 1.7.5.rc3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html