]> git.proxmox.com Git - mirror_qemu.git/commit - util/async.c
AioContext: force event loop iteration using BH
authorStefan Hajnoczi <stefanha@redhat.com>
Tue, 28 Jul 2015 16:34:09 +0000 (18:34 +0200)
committerStefan Hajnoczi <stefanha@redhat.com>
Wed, 29 Jul 2015 09:02:06 +0000 (10:02 +0100)
commitca96ac44dcd290566090b2435bc828fded356ad9
treebdf284e97b877f7a9941ac6dd8537ba047677b70
parenta076972a4d36381d610a854f0c336507650a1d34
AioContext: force event loop iteration using BH

The notify_me optimization introduced in commit eabc97797310
("AioContext: fix broken ctx->dispatching optimization") skips
event_notifier_set() calls when the event loop thread is not blocked in
ppoll(2).

This optimization causes a deadlock if two aio_context_acquire() calls
race.  notify_me = 0 during the race so the winning thread can enter
ppoll(2) unaware that the other thread is waiting its turn to acquire
the AioContext.

This patch forces ppoll(2) to return by scheduling a BH instead of
calling aio_notify().

The following deadlock with virtio-blk dataplane is fixed:

  qemu ... -object iothread,id=iothread0 \
           -drive if=none,id=drive0,file=test.img,... \
           -device virtio-blk-pci,iothread=iothread0,drive=drive0

This command-line results in a hang early on without this patch.

Thanks to Paolo Bonzini <pbonzini@redhat.com> for investigating this bug
with me.

Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1438101249-25166-4-git-send-email-pbonzini@redhat.com
Message-Id: <1438014819-18125-3-git-send-email-stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
async.c
include/block/aio.h