From: Markus Armbruster <armbru@redhat.com>
To: JAEHOON KIM <jhkim@linux.ibm.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org,
pbonzini@redhat.com, stefanha@redhat.com, fam@euphon.net,
eblake@redhat.com, berrange@redhat.com, eduardo@habkost.net,
dave@treblig.org, sw@weilnetz.de, devel@lists.libvirt.org
Subject: Re: [PATCH RFC v1 3/3] qapi/iothread: introduce poll-weight parameter for aio-poll
Date: Thu, 15 Jan 2026 08:28:51 +0100 [thread overview]
Message-ID: <87ikd3xrkc.fsf@pond.sub.org> (raw)
In-Reply-To: <eb891295-5ffd-4613-bc37-56d8a07d1fff@linux.ibm.com> (JAEHOON KIM's message of "Wed, 14 Jan 2026 23:14:07 -0600")
Cc: devel@lists.libvirt.org for a possible query-iothreads change
discussed below.
JAEHOON KIM <jhkim@linux.ibm.com> writes:
> On 1/14/2026 1:48 AM, Markus Armbruster wrote:
>> Jaehoon Kim <jhkim@linux.ibm.com> writes:
>>
>>> Introduce a new poll-weight parameter for aio-poll. This parameter
>>> controls how much the most recent event interval affects the next
>>> polling duration. When set to 0, a default value of 2 is used, meaning
>>> the current interval contributes roughly 25% to the calculation. Larger
>>> values decrease the weight of the current interval, enabling more
>>> gradual adjustments to polling duration.
>>>
>>> Signed-off-by: Jaehoon Kim <jhkim@linux.ibm.com>
>> [...]
>>
>>> diff --git a/qapi/misc.json b/qapi/misc.json
>>> index 28c641fe2f..b21cc48a03 100644
>>> --- a/qapi/misc.json
>>> +++ b/qapi/misc.json
>>> @@ -85,6 +85,11 @@
>>> # @poll-shrink: how many ns will be removed from polling time, 0 means
>>> # that it's not configured (since 2.9)
>>> #
>>> +# @poll-weight: the weight factor for adaptive polling.
>>> +# Determines how much the current event interval contributes to
>>> +# the next polling time calculation. 0 means that the default
>>> +# value is used. (since 10.1)
>>
>> When the default value is used, the actual value being used remains
>> hidden. Why?
>
> Actually, I just followed the existing pattern of poll-grow, which also
> defaults to a factor of 2 when set to 0.
Yes, and consistency is always desirable. But let's have a look at the
new interface in isolation, to see whether it's actually good.
> It wasn't my intention to hide the value; I kept this because the
> previous API has been working fine without issues.
> If you think the actual value should be visible, I'll consider ways to
> make it explicit in the next version.
As is, query-iothreads tells us "the weight factor for adaptive polling
is X, and it was set by the user", or "the weight factor for adaptive
polling was not set by the user, but picked by the system."
If we returned the actual value, it would tell us "the weight factor for
adaptive polling is X".
Only the former interface tells us whether the user or the system
picked.
Only the latter interface tells us what the system picked.
Which one is useful in practice?
I'd argue the latter. A management application knows whether it set a
value without query-iothreads' help, but it doesn't know what the system
picked. The people coding it may know if a contract specifies what the
system picks (see below).
If we conclude that returning the actual value is better for new
@poll-weight, then it would surely be better for @poll-grow and
@poll-shrink, too. Could we still improve them?
Libvirt developers, any advice?
>>> +#
>>> # @aio-max-batch: maximum number of requests in a batch for the AIO
>>> # engine, 0 means that the engine will use its default (since 6.1)
>>> #
>>> @@ -96,6 +101,7 @@
>>> 'poll-max-ns': 'int',
>>> 'poll-grow': 'int',
>>> 'poll-shrink': 'int',
>>> + 'poll-weight': 'int',
>>> 'aio-max-batch': 'int' } }
>>>
>>> ##
>>> diff --git a/qapi/qom.json b/qapi/qom.json
>>> index 6f5c9de0f0..d90823478d 100644
>>> --- a/qapi/qom.json
>>> +++ b/qapi/qom.json
>>> @@ -606,6 +606,11 @@
>>> # algorithm detects it is spending too long polling without
>>> # encountering events. 0 selects a default behaviour (default: 0)
>>> #
>>> +# @poll-weight: the weight factor for adaptive polling.
>>> +# Determines how much the current event interval contributes to
>>> +# the next polling time calculation. 0 selects a default
>>> +# behaviour (default: 0) since 10.1.
>>
>> This leaves the actual default behavior unspecified. Is this a good
>> idea?
>
> I agree that the documentation should be more explicit.
> I'll update it to clarify that the default factor is 2 and explain its
> meaning.
I understand that you're mirroring how @poll-grow and @poll-shrink work,
but let's ignore that for a minute.
Compare four possible interfaces:
1. Optional @poll-weight defaults to 2. Values <= 0 are rejected.
2. Optional @poll-weight defaults to 2. Value 0 is replaced by the
default value 2. Values < 0 are rejected.
3. Optional @poll-weight defaults to 0. Values < 0 are rejected. Value
0 makes the system pick a value, namely 2.
4. Optional @poll-weight defaults to 0. Values < 0 are rejected. Value
0 makes the system pick a value. It currently picks 2.
The difference between 3. and 4. is that 3. makes "system picks 2" part
of the contract, while 4. doesn't.
1. is the simplest. Is 2.'s additional complexity worthwhile? 3.'s?
4.'s?
>>> +#
>>> # The @aio-max-batch option is available since 6.1.
>>> #
>>> # Since: 2.0
>>> @@ -614,7 +619,8 @@
>>> 'base': 'EventLoopBaseProperties',
>>> 'data': { '*poll-max-ns': 'int',
>>> '*poll-grow': 'int',
>>> - '*poll-shrink': 'int' } }
>>> + '*poll-shrink': 'int',
>>> + '*poll-weight': 'int' } }
>>>
>>> ##
>>> # @MainLoopProperties:
>>
>> [...]
next prev parent reply other threads:[~2026-01-15 7:29 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-13 17:48 [PATCH RFC v1 0/3] aio-poll: improve aio-polling efficiency Jaehoon Kim
2026-01-13 17:48 ` [PATCH RFC v1 1/3] aio-poll: avoid unnecessary polling time computation Jaehoon Kim
2026-02-16 14:58 ` Stefan Hajnoczi
2026-02-16 15:21 ` Stefan Hajnoczi
2026-02-16 20:47 ` JAEHOON KIM
2026-02-17 13:16 ` Stefan Hajnoczi
2026-02-18 13:43 ` JAEHOON KIM
2026-01-13 17:48 ` [PATCH RFC v1 2/3] aio-poll: refine iothread polling using weighted handler intervals Jaehoon Kim
2026-01-13 17:48 ` [PATCH RFC v1 3/3] qapi/iothread: introduce poll-weight parameter for aio-poll Jaehoon Kim
2026-01-14 7:48 ` Markus Armbruster
2026-01-15 5:14 ` JAEHOON KIM
2026-01-15 7:28 ` Markus Armbruster [this message]
2026-01-15 10:05 ` Halil Pasic
2026-01-15 16:00 ` JAEHOON KIM
2026-01-16 8:19 ` Markus Armbruster
2026-01-19 18:16 ` [PATCH RFC v1 0/3] aio-poll: improve aio-polling efficiency Stefan Hajnoczi
2026-01-23 19:15 ` JAEHOON KIM
2026-01-27 21:11 ` Stefan Hajnoczi
2026-02-03 21:12 ` Stefan Hajnoczi
2026-02-06 6:50 ` JAEHOON KIM
2026-02-12 18:53 ` Stefan Hajnoczi
2026-02-13 15:13 ` JAEHOON KIM
2026-02-16 12:42 ` Stefan Hajnoczi
2026-02-19 22:27 ` Stefan Hajnoczi
2026-02-20 19:00 ` JAEHOON KIM
2026-02-24 4:24 ` Stefan Hajnoczi
2026-02-26 6:03 ` JAEHOON KIM
2026-03-09 20:46 ` JAEHOON KIM
2026-03-23 14:08 ` JAEHOON KIM
2026-03-23 18:51 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ikd3xrkc.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dave@treblig.org \
--cc=devel@lists.libvirt.org \
--cc=eblake@redhat.com \
--cc=eduardo@habkost.net \
--cc=fam@euphon.net \
--cc=jhkim@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=sw@weilnetz.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.