• P
    block: avoid recursive AioContext acquire in bdrv_inactivate_all() · bd6458e4
    Paolo Bonzini 提交于
    BDRV_POLL_WHILE() does not support recursive AioContext locking.  It
    only releases the AioContext lock once regardless of how many times the
    caller has acquired it.  This results in a hang since the IOThread does
    not make progress while the AioContext is still locked.
    
    The following steps trigger the hang:
    
      $ qemu-system-x86_64 -M accel=kvm -m 1G -cpu host \
                           -object iothread,id=iothread0 \
                           -device virtio-scsi-pci,iothread=iothread0 \
                           -drive if=none,id=drive0,file=test.img,format=raw \
                           -device scsi-hd,drive=drive0 \
                           -drive if=none,id=drive1,file=test.img,format=raw \
                           -device scsi-hd,drive=drive1
      $ qemu-system-x86_64 ...same options... \
                           -incoming tcp::1234
      (qemu) migrate tcp:127.0.0.1:1234
      ...hang...
    Tested-by: NStefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Message-id: 20171207201320.19284-2-stefanha@redhat.com
    Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
    bd6458e4
block.c 151.5 KB