qemu-irix/tests
Fam Zheng e92f0e1910 block: Use bdrv_coroutine_enter to start I/O coroutines
BDRV_POLL_WHILE waits for the started I/O by releasing bs's ctx then polling
the main context, which relies on the yielded coroutine continuing on bs->ctx
before notifying qemu_aio_context with bdrv_wakeup().

Thus, using qemu_coroutine_enter to start I/O is wrong because if the coroutine
is entered from main loop, co->ctx will be qemu_aio_context, as a result of the
"release, poll, acquire" loop of BDRV_POLL_WHILE, race conditions happen when
both main thread and the iothread access the same BDS:

  main loop                                iothread
-----------------------------------------------------------------------
  blockdev_snapshot
    aio_context_acquire(bs->ctx)
                                           virtio_scsi_data_plane_handle_cmd
    bdrv_drained_begin(bs->ctx)
    bdrv_flush(bs)
      bdrv_co_flush(bs)                      aio_context_acquire(bs->ctx).enter
        ...
        qemu_coroutine_yield(co)
      BDRV_POLL_WHILE()
        aio_context_release(bs->ctx)
                                             aio_context_acquire(bs->ctx).return
                                               ...
                                                 aio_co_wake(co)
        aio_poll(qemu_aio_context)               ...
          co_schedule_bh_cb()                    ...
            qemu_coroutine_enter(co)             ...

              /* (A) bdrv_co_flush(bs)           /* (B) I/O on bs */
                      continues... */
                                             aio_context_release(bs->ctx)
        aio_context_acquire(bs->ctx)

Note that in above case, bdrv_drained_begin() doesn't do the "release,
poll, acquire" in BDRV_POLL_WHILE, because bs->in_flight == 0.

Fix this by using bdrv_coroutine_enter and enter coroutine in the right
context.

iotests 109 output is updated because the coroutine reenter flow during
mirror job complete is different (now through co_queue_wakeup, instead
of the unconditional qemu_coroutine_switch before), making the end job
len different.

Signed-off-by: Fam Zheng <famz@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
2017-04-11 20:07:15 +08:00
..
acpi-test-data
data
docker
guest-debug
image-fuzzer
libqos
migration
multiboot
qapi-schema qapi2texi: Fix translation of *strong* and _emphasized_ 2017-03-21 10:42:58 +01:00
qemu-iotests block: Use bdrv_coroutine_enter to start I/O coroutines 2017-04-11 20:07:15 +08:00
rocker
tcg
vmstate-static-checker-data
.gitignore
Makefile.include tests/qapi-schema: Systematic positive doc comment tests 2017-03-21 10:42:55 +01:00
ac97-test.c
acpi-utils.c
acpi-utils.h tests/acpi: don't pack a structure 2017-03-30 19:12:44 +03:00
ahci-test.c
atomic_add-bench.c
bios-tables-test.c
boot-order-test.c
boot-sector.c
boot-sector.h
boot-serial-test.c boot-serial-test: use -no-shutdown 2017-03-24 13:39:50 +00:00
check-block.sh
check-qdict.c
check-qfloat.c
check-qint.c
check-qjson.c
check-qlist.c
check-qnull.c
check-qom-interface.c
check-qom-proplist.c
check-qstring.c
crypto-tls-x509-helpers.c
crypto-tls-x509-helpers.h
device-introspect-test.c
display-vga-test.c
drive_del-test.c
ds1338-test.c
e1000-test.c
e1000e-test.c
eepro100-test.c
endianness-test.c
es1370-test.c
fdc-test.c
fw_cfg-test.c
hd-geo-test.c
i440fx-test.c
i82801b11-test.c
ide-test.c
intel-hda-test.c
io-channel-helpers.c
io-channel-helpers.h
ioh3420-test.c
iothread.c
iothread.h
ipmi-bt-test.c
ipmi-kcs-test.c
ipoctal232-test.c
ivshmem-test.c
libqtest.c tests/libqtest.c: Delete possible stale unix sockets 2017-04-03 19:05:38 +01:00
libqtest.h
m25p80-test.c
m48t59-test.c
ne2000-test.c
nvme-test.c
pc-cpu-test.c
pcnet-test.c
pkix_asn1_tab.c
pnv-xscom-test.c
postcopy-test.c
prom-env-test.c
ptimer-test-stubs.c
ptimer-test.c
ptimer-test.h
pvpanic-test.c
pxe-test.c
q35-test.c
qemu-iotests-quick.sh
qht-bench.c
qmp-test.c
qom-test.c
rcutorture.c
rtas-test.c
rtc-test.c
rtl8139-test.c
spapr-phb-test.c
tco-test.c
test-aio-multithread.c
test-aio.c
test-arm-mptimer.c
test-base64.c
test-bitcnt.c
test-bitops.c
test-blockjob-txn.c tests/block-job-txn: Don't start block job before adding to txn 2017-04-11 20:07:15 +08:00
test-blockjob.c
test-bufferiszero.c
test-char.c
test-clone-visitor.c
test-coroutine.c
test-crypto-afsplit.c
test-crypto-block.c
test-crypto-cipher.c
test-crypto-hash.c
test-crypto-hmac.c
test-crypto-ivgen.c
test-crypto-pbkdf.c
test-crypto-secret.c
test-crypto-tlscredsx509.c
test-crypto-tlssession.c
test-crypto-xts.c
test-cutils.c
test-filter-mirror.c
test-filter-redirector.c
test-hbitmap.c
test-int128.c
test-io-channel-buffer.c
test-io-channel-command.c
test-io-channel-file.c
test-io-channel-socket.c io: fix incoming client socket initialization 2017-04-04 16:17:03 +01:00
test-io-channel-tls.c
test-io-task.c
test-iov.c
test-keyval.c test-keyval: Cover alternate and 'any' type 2017-03-21 10:42:06 +01:00
test-logging.c
test-mul64.c
test-netfilter.c
test-opts-visitor.c qapi: Fix QemuOpts visitor regression on unvisited input 2017-03-22 19:24:34 +01:00
test-qapi-util.c
test-qdev-global-props.c
test-qdist.c
test-qemu-opts.c tests: Use error_free_or_abort() where appropriate 2017-03-15 08:52:09 +01:00
test-qga.c
test-qht-par.c
test-qht.c
test-qmp-commands.c
test-qmp-event.c
test-qobject-input-visitor.c test-qobject-input-visitor: Cover visit_type_uint64() 2017-03-21 20:01:39 +01:00
test-qobject-output-visitor.c tests: Use error_free_or_abort() where appropriate 2017-03-15 08:52:09 +01:00
test-rcu-list.c
test-replication.c
test-shift128.c
test-string-input-visitor.c qapi: Fix string input visitor regression for empty lists 2017-03-21 10:43:01 +01:00
test-string-output-visitor.c
test-thread-pool.c
test-throttle.c
test-timed-average.c
test-uuid.c
test-visitor-serialization.c
test-vmstate.c
test-write-threshold.c
test-x86-cpuid-compat.c
test-x86-cpuid.c
test-xbzrle.c
tmp105-test.c
tpci200-test.c
usb-hcd-ehci-test.c
usb-hcd-ohci-test.c
usb-hcd-uhci-test.c
usb-hcd-xhci-test.c
vhost-user-bridge.c
vhost-user-test.c
virtio-9p-test.c tests/virtio-9p-test: Don't call le*_to_cpus on fields of packed struct 2017-03-27 21:15:31 +02:00
virtio-balloon-test.c
virtio-blk-test.c
virtio-console-test.c
virtio-net-test.c
virtio-rng-test.c
virtio-scsi-test.c
virtio-serial-test.c
vmxnet3-test.c
wdt_ib700-test.c