On Thu, Apr 23, 2026 at 02:59:15PM -0500, Jaehoon Kim wrote:
> Dear all,
>
> This is v5 of the patch series to refine aio_poll adaptive polling
> logic for better CPU efficiency.
>
> v1: https://lore.kernel.org/qemu-devel/20260113174824.464720-1-jhkim@linux.ibm.com/
> v2: https://lore.kernel.org/qemu-devel/20260323135451.579655-1-jhkim@linux.ibm.com/
> v3: https://lore.kernel.org/qemu-devel/20260405200735.3075407-1-jhkim@linux.ibm.com/
> v4: https://lore.kernel.org/qemu-devel/20260412215011.326196-1-jhkim@linux.ibm.com/
>
> Changes in v5:
> - Patch 3/3: Fixed QAPI documentation based on review feedback:
> * qapi/misc.json: Removed the sentence about returning poll-weight=0
> since query-iothreads never returns 0 for this field.
> * qemu-options.hx: Enhanced poll-weight parameter documentation to
> match the detail level in qom.json, including information about
> default value and typical value examples.
>
> Changes in v4:
> - Patch 2/3: Added detailed validation tables showing poll.ns statistics
> across different poll_weight values (1-5) for SSD randread/randwrite
> workloads to demonstrate algorithm behavior and justify poll_weight=3
> as the optimal default.
>
> - Patch 3/3: Fixed commit message to correctly reference
> adjust_polling_time() instead of the removed grow_polling_time()
> and shrink_polling_time() functions from v2.
>
> Changes in v3:
> - Patch 1/3: Removed timeout check in aio_poll() as suggested by
> Stefan Hajnoczi.
>
> - Patch 2/3: Major refactoring based on review feedback:
> * Removed has_event and renamed poll_idle_timeout to
> last_dispatch_timestamp from AioHandler structure to identify
> active handlers.
> * Merged grow_polling_time() and shrink_polling_time() into single
> adjust_polling_time() function to simplify code review, with no
> functional changes.
> * Renamed adjust_block_ns() to update_handler_poll_times()
> * Modified remove_idle_poll_handlers() to use last_dispatch_timestamp
> directly instead of checking poll_idle_timeout
> * Updated commit message
>
> - Patch 3/3: Enhanced parameter handling:
> * Moved IOTHREAD_POLL_*_DEFAULT constants to iothread.h header
> * Added validation for poll-weight range [0, 63] in iothread.c
> * Added the divide-by-0 protection in aio_context_set_poll_params()
> * Updated QAPI version from 10.2 to 11.1
> * Enhanced qom.json documentation for poll-weight values
>
> This series reduces CPU usage in aio_poll adaptive polling by ~10%
> with minimal throughput impact (~2%). Tested on s390x with various
> workloads.
>
> Testing details:
>
> Initial testing (Fedora 42, 16 virtio-blk devices, FCP multipath):
> - Throughput: -3% to -8% (1 iothread), -2% to -5% (2 iothreads)
> - CPU usage: -10% to -25% (1 iothread), -7% to -12% (2 iothreads)
>
> Additional validation (RHEL 10.1 + QEMU 10.0.0, FCP/FICON, 1-8 iothreads):
> - Throughput: -2.2% (weight=3), -2.4% (weight=2)
> - CPU usage: -9.4% (weight=3), -10.9% (weight=2)
>
> Weight=3 selected for slightly better throughput while maintaining
> substantial CPU savings.
>
> Best regards,
> Jaehoon Kim
>
> Jaehoon Kim (3):
> aio-poll: avoid unnecessary polling time computation
> aio-poll: refine iothread polling using weighted handler intervals
> qapi/iothread: introduce poll-weight parameter for aio-poll
>
> include/qemu/aio.h | 7 +-
> include/system/iothread.h | 18 ++++
> iothread.c | 47 +++++++---
> monitor/hmp-cmds.c | 1 +
> qapi/misc.json | 6 ++
> qapi/qom.json | 10 +-
> qemu-options.hx | 8 +-
> tests/unit/test-nested-aio-poll.c | 2 +-
> util/aio-posix.c | 148 ++++++++++++++++++------------
> util/aio-posix.h | 2 +-
> util/aio-win32.c | 3 +-
> util/async.c | 2 +
> 12 files changed, 176 insertions(+), 78 deletions(-)
>
> --
> 2.50.1
>
Thanks, applied to my block tree:
https://gitlab.com/stefanha/qemu/commits/block
Stefan