[PATCH v5 0/3] improve aio-polling efficiency

Jaehoon Kim posted 3 patches 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260423195918.661299-1-jhkim@linux.ibm.com
Maintainers: Stefan Hajnoczi <stefanha@redhat.com>, Fam Zheng <fam@euphon.net>, "Dr. David Alan Gilbert" <dave@treblig.org>, Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, Stefan Weil <sw@weilnetz.de>
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(-)
[PATCH v5 0/3] improve aio-polling efficiency
Posted by Jaehoon Kim 1 month ago
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
Re: [PATCH v5 0/3] improve aio-polling efficiency
Posted by Stefan Hajnoczi 1 month ago
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