virtio-blk: fix race between .ioeventfd_stop() and vq handler
commit1010cadf62332017648abee0d7a3dc7f2eef9632
authorStefan Hajnoczi <stefanha@redhat.com>
Wed, 7 Mar 2018 14:42:03 +0000 (7 14:42 +0000)
committerStefan Hajnoczi <stefanha@redhat.com>
Thu, 8 Mar 2018 17:38:51 +0000 (8 17:38 +0000)
tree8c4e09b21136d13a26c6d00c4b87d693781e993d
parentb89d92f3cfc0f6e6d05e146e7a5fb8c759978051
virtio-blk: fix race between .ioeventfd_stop() and vq handler

If the main loop thread invokes .ioeventfd_stop() just as the vq handler
function begins in the IOThread then the handler may lose the race for
the AioContext lock.  By the time the vq handler is able to acquire the
AioContext lock the ioeventfd has already been removed and the handler
isn't supposed to run anymore!

Use the new aio_wait_bh_oneshot() function to perform ioeventfd removal
from within the IOThread.  This way no races with the vq handler are
possible.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 20180307144205.20619-3-stefanha@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
hw/block/dataplane/virtio-blk.c