On Tue, Feb 24, 2026 at 4:42 PM Markus Armbruster <[email protected]> wrote:
>
> Zhang Chen <[email protected]> writes:
>
> > On Tue, Feb 17, 2026 at 3:51 PM Markus Armbruster <[email protected]> wrote:
> >>
> >> Zhang Chen <[email protected]> writes:
> >>
> >> > Extend the 'IOThreadInfo' structure to include attachment metrics.
> >> > This allows users to monitor how many devices are associated with
> >> > a specific IOThread and identify them by their QOM paths.
> >> >
> >> > New fields added to IOThreadInfo:
> >> > - @attached-cnt: An integer representing the number of devices
> >> >   currently using this IOThread's AioContext.
> >> > - @attached-dev: A string containing a delimited list ("|") of
> >> >   QOM paths for the attached devices.
> >> >
> >> > These fields are also exposed via the Human Monitor Interface (HMP)
> >> > command 'info iothreads' to assist with manual debugging and
> >> > performance tuning.
> >> >
> >> > Example QMP output:
> >> > {
> >> >     "id": "iothread0",
> >> >     "thread-id": 3134,
> >> >     "attached-cnt": 2,
> >> >     "attached-dev": "/machine/peripheral/blk1/virtio-backend | 
> >> > /machine/peripheral/blk0/virtio-backend",
> >> >     ...
> >> > }
> >> >
> >> > Signed-off-by: Zhang Chen <[email protected]>
> >>
> >> [...]
> >>
> >> > diff --git a/qapi/misc.json b/qapi/misc.json
> >> > index 1f5062df2a..ca53638684 100644
> >> > --- a/qapi/misc.json
> >> > +++ b/qapi/misc.json
> >> > @@ -76,6 +76,19 @@
> >> >  #
> >> >  # @thread-id: ID of the underlying host thread
> >> >  #
> >> > +# @attached-cnt: The parameter is a counter indicating how many
> >> > +#     active devices are currently associated with this iothread
> >> > +#     (e.g. virtio-blk).  In hotplug scenarios, users can
> >> > +#     pre-allocate multiple iothread objects to serve as a persistent
> >> > +#     thread pool.  When a device is hot-unplugged, the corresponding
> >> > +#     IOThread is released but remains available, allowing subsequent
> >> > +#     hot-plugged devices to attach to and reuse the existing thread.
> >> > +#     (since 11.0)
> >> > +#
> >> > +# @attached-dev: A list of QOM paths for the devices currently
> >> > +#     associated with this IOThread, delimited by " | ".
> >> > +#     Returns "none" if no devices are attached. (since 11.0)
>
> Does not compile:
>
>     In file included from ../qapi/qapi-schema.json:66:
>     ../qapi/misc.json:90:49: Use two spaces between sentences
>     If this not the end of a sentence, please report a bug.
>
> This error has been in master for almost three months.  Is your tree
> that far behind?
>

Oh, my mistake, this version has undergone some minor description
improvements after testing.
Will cleanup it for full test.

> >>
> >> QAPI schema design maxim: do not encode structured data as strings.
> >> @attached-devs should be an array of QOM paths instead.
> >
> > OK, will fix in next version.
>
> Thanks!
>
> >> Unless I misunderstand your docs, @attached-cnt is the number of QOM
> >> paths in @attached-dev, i.e. @attached-dev is redundant.  If this is the
> >> case, drop it.  If it isn't, educate me :)
> >
> > As Stefan's comments, I try to address more specific needs:
> > https://mail.gnu.org/archive/html/qemu-devel/2026-02/msg01892.html
>
> As far as I can tell, Stefan asked for the QOM paths of attached
> devices.  @attached-dev provides it.  Good.  Why have @attached-cnt as
> well?
>

Users can obtain the quantity more conveniently, avoiding the need to
count the number of @attached-dev.
If you think the @attached-cnt is redundant, I will remove it in next version.


> >> We generally avoid abbreviations in the QAPI schema: @attached-count,
> >> @attached-devices.
> >>
> >> > +#
> >> >  # @poll-max-ns: maximum polling time in ns, 0 means polling is
> >> >  #     disabled (since 2.9)
> >> >  #
> >> > @@ -93,6 +106,8 @@
> >> >  { 'struct': 'IOThreadInfo',
> >> >    'data': {'id': 'str',
> >> >             'thread-id': 'int',
> >> > +           'attached-cnt': 'int',
> >> > +           'attached-dev': 'str',
> >> >             'poll-max-ns': 'int',
> >> >             'poll-grow': 'int',
> >> >             'poll-shrink': 'int',
> >> > @@ -118,6 +133,8 @@
> >> >  #              {
> >> >  #                 "id":"iothread0",
> >> >  #                 "thread-id":3134,
> >> > +#                 "attached-cnt":2,
> >> > +#                 
> >> > "attached-dev":/machine/peripheral/blk1/virtio-backend | 
> >> > /machine/peripheral/blk0/virtio-backend,
> >>
> >> Once again, the example is syntactically incorrect (the value lacks
> >> double quotes), and once again I recommend to create example I/O by
> >> actually running a test.  Getting tired of this, to be frank.
> >
> > Sorry for that again. Will fix in next version.
> > And I tested this series before send the mail like this:
> >
> > (qemu) info iothreads
> > iothread2:
> >   thread_id=434428
> >   attached-cnt=0
> >   attached-dev=none
> >   poll-max-ns=32768
> >   poll-grow=0
> >   poll-shrink=0
> >   aio-max-batch=0
> > iothread1:
> >   thread_id=434427
> >   attached-cnt=2
> >   attached-dev=/machine/peripheral/blk1/virtio-backend |
> > /machine/peripheral/blk0/virtio-backend
> >   poll-max-ns=32768
> >   poll-grow=0
> >   poll-shrink=0
> >   aio-max-batch=0
>
> You can manually test QMP like this:
>
>     $ qemu-system-x86_64 -S -display none -chardev 
> socket,id=qmp,path=test-qmp,server=on,wait=off -mon mode=control,chardev=qmp 
> -object iothread,id=iot0
>
> In another terminal:
>
>     $ socat "READLINE,history=$HOME/.qmp_history,prompt=QMP> " 
> UNIX-CONNECT:test-qmp
>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 2, "major": 10}, 
> "package": "v10.2.0-1533-g627cf8d1ed-dirty"}, "capabilities": ["oob"]}}
>     QMP> {"execute": "qmp_capabilities", "arguments": {"enable": ["oob"]}}
>     {"return": {}}
>     QMP> {"execute": "query-iothreads"}
>     {"return": [{"poll-shrink": 0, "thread-id": 2140323, "aio-max-batch": 0, 
> "attached-dev": "none", "poll-grow": 0, "attached-cnt": 0, "poll-max-ns": 
> 32768, "id": "iot0"}]}
>     QMP> {"execute": "quit"}
>     {"timestamp": {"seconds": 1771922506, "microseconds": 801687}, "event": 
> "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
>     {"return": {}}
>

Got it, will double check the QMP.
Thank you for the detailed description.


Thanks
Chen

>
> >> >  #                 "poll-max-ns":32768,
> >> >  #                 "poll-grow":0,
> >> >  #                 "poll-shrink":0,
> >> > @@ -126,6 +143,8 @@
> >> >  #              {
> >> >  #                 "id":"iothread1",
> >> >  #                 "thread-id":3135,
> >> > +#                 "attached-cnt":1,
> >> > +#                 
> >> > "attached-dev":/machine/peripheral/blk3/virtio-backend,
> >>
> >> Likewise.
> >
> > Thanks
> > Chen
> >
> >>
> >> >  #                 "poll-max-ns":32768,
> >> >  #                 "poll-grow":0,
> >> >  #                 "poll-shrink":0,
> >>
>

Reply via email to