• Stefan Hajnoczi's avatar
    AioContext: force event loop iteration using BH · ca96ac44
    Stefan Hajnoczi authored
    The notify_me optimization introduced in commit eabc9779
    
    
    ("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: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: default avatarPaolo 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: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    ca96ac44