mirror of https://github.com/xemu-project/xemu.git
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@huawei.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Gonglei <arei.gonglei@huawei.com>
This commit is contained in:
parent
453ac8835b
commit
600f5ce356
|
@ -692,8 +692,17 @@ static void virtio_crypto_dataq_bh(void *opaque)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
virtio_crypto_handle_dataq(vdev, q->dataq);
|
virtio_crypto_handle_dataq(vdev, q->dataq);
|
||||||
virtio_queue_set_notification(q->dataq, 1);
|
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
|
static void
|
||||||
|
|
Loading…
Reference in New Issue