qemu/tests/unit
Paolo Bonzini 5f50be9b58 async: the main AioContext is only "current" if under the BQL
If we want to wake up a coroutine from a worker thread, aio_co_wake()
currently does not work.  In that scenario, aio_co_wake() calls
aio_co_enter(), but there is no current AioContext and therefore
qemu_get_current_aio_context() returns the main thread.  aio_co_wake()
then attempts to call aio_context_acquire() instead of going through
aio_co_schedule().

The default case of qemu_get_current_aio_context() was added to cover
synchronous I/O started from the vCPU thread, but the main and vCPU
threads are quite different.  The main thread is an I/O thread itself,
only running a more complicated event loop; the vCPU thread instead
is essentially a worker thread that occasionally calls
qemu_mutex_lock_iothread().  It is only in those critical sections
that it acts as if it were the home thread of the main AioContext.

Therefore, this patch detaches qemu_get_current_aio_context() from
iothreads, which is a useless complication.  The AioContext pointer
is stored directly in the thread-local variable, including for the
main loop.  Worker threads (including vCPU threads) optionally behave
as temporary home threads if they have taken the big QEMU lock,
but if that is not the case they will always schedule coroutines
on remote threads via aio_co_schedule().

With this change, the stub qemu_mutex_iothread_locked() must be changed
from true to false.  The previous value of true was needed because the
main thread did not have an AioContext in the thread-local variable,
but now it does have one.

Reported-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20210609122234.544153-1-pbonzini@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Tested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
[eblake: tweak commit message per Vladimir's review]
Signed-off-by: Eric Blake <eblake@redhat.com>
2021-06-18 10:59:52 -05:00
..
check-block-qdict.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qdict.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qjson.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qlist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qlit.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qnull.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qnum.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qobject.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qom-interface.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
check-qom-proplist.c tests: convert check-qom-proplist to keyval 2021-03-19 10:18:17 +01:00
check-qstring.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-psk-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-psk-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-x509-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
crypto-tls-x509-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
io-channel-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
io-channel-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
iothread.c async: the main AioContext is only "current" if under the BQL 2021-06-18 10:59:52 -05:00
iothread.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
meson.build tests: Add tests for yank with the chardev-change case 2021-04-01 15:27:44 +04:00
pkix_asn1_tab.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test-stubs.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
ptimer-test.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
rcutorture.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
socket-helpers.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
socket-helpers.h tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-aio-multithread.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-aio.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-list.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-listfile.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-pam.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-authz-simple.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-base64.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bdrv-drain.c block: bdrv_append(): don't consume reference 2021-04-30 12:27:47 +02:00
test-bdrv-graph-mod.c block: adapt bdrv_append() for inserting filters 2021-04-30 12:27:48 +02:00
test-bitcnt.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bitmap.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-bitops.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-block-backend.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-block-iothread.c block: drop BlockDriverState::read_only 2021-06-02 14:23:20 +02:00
test-blockjob-txn.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-blockjob.c test-blockjob: Test job_wait_unpaused() 2021-04-09 18:00:29 +02:00
test-bufferiszero.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-char.c char: Deprecate backend aliases 'tty' and 'parport' 2021-03-19 10:18:06 +01:00
test-clone-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-coroutine.c test-coroutine: Add rwlock downgrade test 2021-03-31 10:44:21 +01:00
test-crypto-afsplit.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-block.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-cipher.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-hash.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-hmac.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-ivgen.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-pbkdf.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-secret.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-tlscredsx509.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-tlssession.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-crypto-xts.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-cutils.c utils: Work around mingw strto*l bug with 0x 2021-03-24 14:25:41 +00:00
test-fdmon-epoll.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-hbitmap.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-image-locking.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-int128.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-buffer.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-command.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-file.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-socket.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-channel-tls.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-io-task.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-iov.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-keyval.c * Move unit and bench tests into separate directories 2021-03-14 15:13:53 +00:00
test-logging.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-mul64.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-opts-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qapi-util.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qdev-global-props.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qdist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qemu-opts.c * Move unit and bench tests into separate directories 2021-03-14 15:13:53 +00:00
test-qga.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qgraph.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qht.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qmp-cmds.c qapi: Enforce command naming rules 2021-03-23 22:31:05 +01:00
test-qmp-event.c qapi: Enforce event naming rules 2021-03-23 22:31:05 +01:00
test-qobject-input-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-qobject-output-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-list.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-simpleq.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-slist.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-rcu-tailq.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-replication.c replication: move include out of root directory 2021-05-26 14:49:46 +02:00
test-shift128.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-string-input-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-string-output-visitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-thread-pool.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-throttle.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-timed-average.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-util-filemonitor.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-util-sockets.c test-util-sockets: Add stub for monitor_set_cur() 2021-03-19 16:05:11 +01:00
test-uuid.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-visitor-serialization.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-vmstate.c tests/unit/test-vmstate: Assert that dup() and mkstemp() succeed 2021-06-03 16:43:27 +01:00
test-write-threshold.c write-threshold: deal with includes 2021-05-14 16:14:10 +02:00
test-x86-cpuid.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-xbzrle.c tests: Move unit tests into a separate directory 2021-03-12 15:46:30 +01:00
test-yank.c tests: Add tests for yank with the chardev-change case 2021-04-01 15:27:44 +04:00