qemu/tests/unit
Stefan Hajnoczi 826cc32423 aio-posix: split poll check from ready handler
Adaptive polling measures the execution time of the polling check plus
handlers called when a polled event becomes ready. Handlers can take a
significant amount of time, making it look like polling was running for
a long time when in fact the event handler was running for a long time.

For example, on Linux the io_submit(2) syscall invoked when a virtio-blk
device's virtqueue becomes ready can take 10s of microseconds. This
can exceed the default polling interval (32 microseconds) and cause
adaptive polling to stop polling.

By excluding the handler's execution time from the polling check we make
the adaptive polling calculation more accurate. As a result, the event
loop now stays in polling mode where previously it would have fallen
back to file descriptor monitoring.

The following data was collected with virtio-blk num-queues=2
event_idx=off using an IOThread. Before:

168k IOPS, IOThread syscalls:

  9837.115 ( 0.020 ms): IO iothread1/620155 io_submit(ctx_id: 140512552468480, nr: 16, iocbpp: 0x7fcb9f937db0)    = 16
  9837.158 ( 0.002 ms): IO iothread1/620155 write(fd: 103, buf: 0x556a2ef71b88, count: 8)                         = 8
  9837.161 ( 0.001 ms): IO iothread1/620155 write(fd: 104, buf: 0x556a2ef71b88, count: 8)                         = 8
  9837.163 ( 0.001 ms): IO iothread1/620155 ppoll(ufds: 0x7fcb90002800, nfds: 4, tsp: 0x7fcb9f1342d0, sigsetsize: 8) = 3
  9837.164 ( 0.001 ms): IO iothread1/620155 read(fd: 107, buf: 0x7fcb9f939cc0, count: 512)                        = 8
  9837.174 ( 0.001 ms): IO iothread1/620155 read(fd: 105, buf: 0x7fcb9f939cc0, count: 512)                        = 8
  9837.176 ( 0.001 ms): IO iothread1/620155 read(fd: 106, buf: 0x7fcb9f939cc0, count: 512)                        = 8
  9837.209 ( 0.035 ms): IO iothread1/620155 io_submit(ctx_id: 140512552468480, nr: 32, iocbpp: 0x7fca7d0cebe0)    = 32

174k IOPS (+3.6%), IOThread syscalls:

  9809.566 ( 0.036 ms): IO iothread1/623061 io_submit(ctx_id: 140539805028352, nr: 32, iocbpp: 0x7fd0cdd62be0)    = 32
  9809.625 ( 0.001 ms): IO iothread1/623061 write(fd: 103, buf: 0x5647cfba5f58, count: 8)                         = 8
  9809.627 ( 0.002 ms): IO iothread1/623061 write(fd: 104, buf: 0x5647cfba5f58, count: 8)                         = 8
  9809.663 ( 0.036 ms): IO iothread1/623061 io_submit(ctx_id: 140539805028352, nr: 32, iocbpp: 0x7fd0d0388b50)    = 32

Notice that ppoll(2) and eventfd read(2) syscalls are eliminated because
the IOThread stays in polling mode instead of falling back to file
descriptor monitoring.

As usual, polling is not implemented on Windows so this patch ignores
the new io_poll_read() callback in aio-win32.c.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Message-id: 20211207132336.36627-2-stefanha@redhat.com

[Fixed up aio_set_event_notifier() calls in
tests/unit/test-fdmon-epoll.c added after this series was queued.
--Stefan]

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2022-01-12 17:09:39 +00:00
..
check-block-qdict.c
check-qdict.c
check-qjson.c
check-qlist.c
check-qlit.c
check-qnull.c
check-qnum.c
check-qobject.c
check-qom-interface.c
check-qom-proplist.c qapi: Improve input_type_enum()'s error message 2021-10-27 17:17:28 +02:00
check-qstring.c
crypto-tls-psk-helpers.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
crypto-tls-psk-helpers.h tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
crypto-tls-x509-helpers.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
crypto-tls-x509-helpers.h tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
io-channel-helpers.c
io-channel-helpers.h
iothread.c async: the main AioContext is only "current" if under the BQL 2021-06-18 10:59:52 -05:00
iothread.h
meson.build meson: reenable test-fdmon-epoll 2021-12-18 10:57:36 +01:00
pkix_asn1_tab.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
ptimer-test-stubs.c util/async: add a human-readable name to BHs for debugging 2021-07-05 11:40:32 +01:00
ptimer-test.c
ptimer-test.h
rcutorture.c
socket-helpers.c
socket-helpers.h
test-aio-multithread.c
test-aio.c aio-posix: split poll check from ready handler 2022-01-12 17:09:39 +00:00
test-authz-list.c
test-authz-listfile.c
test-authz-pam.c
test-authz-simple.c
test-base64.c
test-bdrv-drain.c test-bdrv-drain: don't use BlockJob.blk 2021-12-28 15:18:56 +01:00
test-bdrv-graph-mod.c block: move supports_backing check to bdrv_set_file_or_backing_noperm() 2021-06-29 16:51:00 +02:00
test-bitcnt.c
test-bitmap.c
test-bitops.c
test-block-backend.c
test-block-iothread.c block: use int64_t instead of int in driver discard handlers 2021-09-29 13:46:32 -05:00
test-blockjob-txn.c test-blockjob-txn: don't abuse job->blk 2021-12-28 15:18:52 +01:00
test-blockjob.c job: @force parameter for job_cancel_sync() 2021-10-07 10:42:09 +02:00
test-bufferiszero.c
test-char.c char: Deprecate backend aliases 'tty' and 'parport' 2021-03-19 10:18:06 +01:00
test-clone-visitor.c test-clone-visitor: Correct an accidental rename 2021-09-27 08:23:25 +02:00
test-coroutine.c test-coroutine: Add rwlock downgrade test 2021-03-31 10:44:21 +01:00
test-crypto-afsplit.c
test-crypto-block.c
test-crypto-cipher.c crypto: replace 'des-rfb' cipher with 'des' 2021-07-14 14:15:52 +01:00
test-crypto-hash.c crypto: use &error_fatal in crypto tests 2021-07-14 14:15:52 +01:00
test-crypto-hmac.c crypto: use &error_fatal in crypto tests 2021-07-14 14:15:52 +01:00
test-crypto-ivgen.c crypto: skip essiv ivgen tests if AES+ECB isn't available 2021-07-14 14:15:52 +01:00
test-crypto-pbkdf.c crypto: remove obsolete crypto test condition 2021-07-14 14:15:52 +01:00
test-crypto-secret.c
test-crypto-tlscredsx509.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
test-crypto-tlssession.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
test-crypto-xts.c
test-cutils.c utils: Work around mingw strto*l bug with 0x 2021-03-24 14:25:41 +00:00
test-div128.c host-utils: add unit tests for divu128/divs128 2021-10-27 17:10:00 -07:00
test-fdmon-epoll.c aio-posix: split poll check from ready handler 2022-01-12 17:09:39 +00:00
test-forward-visitor.c qapi: introduce forwarding visitor 2021-07-23 18:17:17 +02:00
test-hbitmap.c
test-image-locking.c
test-int128.c
test-io-channel-buffer.c
test-io-channel-command.c
test-io-channel-file.c
test-io-channel-socket.c
test-io-channel-tls.c tests: remove QCRYPTO_HAVE_TLS_TEST_SUPPORT 2021-06-25 10:53:46 +02:00
test-io-task.c
test-iov.c tests/unit: Remove unused variable from test_io 2021-07-26 07:07:28 -10:00
test-keyval.c keyval: introduce keyval_merge 2021-07-06 08:33:51 +02:00
test-logging.c
test-mul64.c
test-opts-visitor.c
test-qapi-util.c
test-qdev-global-props.c
test-qdist.c
test-qemu-opts.c qemu-option: remove now-dead code 2021-07-06 08:33:51 +02:00
test-qga.c
test-qgraph.c tests: Remove uses of deprecated raspi2/raspi3 machine names 2021-09-01 11:08:15 +01:00
test-qht.c
test-qmp-cmds.c tests/qapi-schema: Drop simple union __org.qemu_x-Union1 2021-09-27 08:23:25 +02:00
test-qmp-event.c qapi: Enforce event naming rules 2021-03-23 22:31:05 +01:00
test-qobject-input-visitor.c test-qobject-input-visitor: Wean off UserDefListUnion 2021-09-27 08:23:25 +02:00
test-qobject-output-visitor.c test-qobject-output-visitor: Wean off UserDefListUnion 2021-09-27 08:23:25 +02:00
test-rcu-list.c
test-rcu-simpleq.c
test-rcu-slist.c
test-rcu-tailq.c
test-replication.c replication: move include out of root directory 2021-05-26 14:49:46 +02:00
test-shift128.c
test-smp-parse.c tests/unit/test-smp-parse: Keep default MIN/MAX CPUs in machine_base_class_init 2021-12-31 13:42:48 +01:00
test-string-input-visitor.c
test-string-output-visitor.c
test-thread-pool.c
test-throttle.c
test-timed-average.c
test-util-filemonitor.c
test-util-sockets.c tests/unit/test-util-sockets: Use g_file_open_tmp() to create temp file 2022-01-05 11:10:13 +01:00
test-uuid.c
test-visitor-serialization.c
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
test-xbzrle.c
test-yank.c qapi: Convert simple union SocketAddressLegacy to flat one 2021-09-27 08:23:25 +02:00