qemu/include/block
Stefan Hajnoczi ca96ac44dc AioContext: force event loop iteration using BH
The notify_me optimization introduced in commit eabc977973
("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>
2015-07-29 10:02:06 +01:00
..
accounting.h block: add accounting for merged requests 2015-02-06 17:24:21 +01:00
aio.h AioContext: force event loop iteration using BH 2015-07-29 10:02:06 +01:00
block.h block: Introduce bdrv_unref_child() 2015-07-14 17:15:23 +02:00
block_int.h block: Fix backing file child when modifying graph 2015-07-14 17:15:23 +02:00
blockjob.h blockjob: add block_job_release function 2015-07-07 14:27:14 +01:00
coroutine.h coroutine: drop qemu_coroutine_adjust_pool_size 2015-01-13 13:43:29 +00:00
coroutine_int.h coroutine: Clean up qemu_coroutine_enter() 2015-03-09 11:11:59 +01:00
nbd.h nbd: Set block size to BDRV_SECTOR_SIZE 2015-03-18 12:07:01 +01:00
qapi.h qmp: fill in the image field in BlockDeviceInfo 2015-04-28 15:36:09 +02:00
scsi.h scsi: Print command name in debug 2014-06-18 08:47:10 +02:00
snapshot.h qemu-nbd: support internal snapshot export 2013-12-04 15:19:00 +01:00
thread-pool.h block: Rename BlockDriverCompletionFunc to BlockCompletionFunc 2014-10-20 13:41:27 +02:00
throttle-groups.h throttle: acquire the ThrottleGroup lock in bdrv_swap() 2015-06-12 14:00:00 +01:00
write-threshold.h block: add event when disk usage exceeds threshold 2015-02-06 17:24:21 +01:00