[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [qemu-xen master] virtio-crypto: fix virtio_queue_set_notification() race



commit 600f5ce356b44d8fa5a611ff6b034eb95ecf04e7
Author:     Stefan Hajnoczi <stefanha@xxxxxxxxxx>
AuthorDate: Wed Nov 16 20:17:32 2016 +0000
Commit:     Michael S. Tsirkin <mst@xxxxxxxxxx>
CommitDate: Fri Nov 18 17:14:10 2016 +0200

    virtio-crypto: fix virtio_queue_set_notification() race
    
    We must check for new virtqueue buffers after re-enabling notifications.
    This prevents the race condition where the guest added buffers just
    after we stopped popping the virtqueue but before we re-enabled
    notifications.
    
    I think the virtio-crypto code was based on virtio-net but this crucial
    detail was missed.  virtio-net does not have the race condition because
    it processes the virtqueue one more time after re-enabling
    notifications.
    
    Cc: Gonglei <arei.gonglei@xxxxxxxxxx>
    Signed-off-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx>
    Tested-by: Alexey Kardashevskiy <aik@xxxxxxxxx>
    Reviewed-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
    Signed-off-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
    Reviewed-by: Gonglei <arei.gonglei@xxxxxxxxxx>
---
 hw/virtio/virtio-crypto.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c
index 3293843..847dc9d 100644
--- a/hw/virtio/virtio-crypto.c
+++ b/hw/virtio/virtio-crypto.c
@@ -692,8 +692,17 @@ static void virtio_crypto_dataq_bh(void *opaque)
         return;
     }
 
-    virtio_crypto_handle_dataq(vdev, q->dataq);
-    virtio_queue_set_notification(q->dataq, 1);
+    for (;;) {
+        virtio_crypto_handle_dataq(vdev, q->dataq);
+        virtio_queue_set_notification(q->dataq, 1);
+
+        /* Are we done or did the guest add more buffers? */
+        if (virtio_queue_empty(q->dataq)) {
+            break;
+        }
+
+        virtio_queue_set_notification(q->dataq, 0);
+    }
 }
 
 static void
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.