On Fri, Jan 16, 2026 at 4:18 PM Markus Armbruster <[email protected]> wrote:
>
> Zhang Chen <[email protected]> writes:
>
> > On Thu, Jan 8, 2026 at 8:12 PM Markus Armbruster <[email protected]> wrote:
> >>
> >> Zhang Chen <[email protected]> writes:
> >>
> >> > The thread_status depends on struct IOThreadInfo's
> >> > 'attached': 'bool'. Show in the qmp/hmp CMD with
> >> > 'attached' or 'detached'.
> >> >
> >> > Signed-off-by: Zhang Chen <[email protected]>
> >> > ---
> >> > iothread.c | 1 +
> >> > monitor/hmp-cmds.c | 2 ++
> >> > qapi/misc.json | 6 ++++++
> >> > 3 files changed, 9 insertions(+)
> >> >
> >> > diff --git a/iothread.c b/iothread.c
> >> > index 38e38fb44d..fb4898e491 100644
> >> > --- a/iothread.c
> >> > +++ b/iothread.c
> >> > @@ -358,6 +358,7 @@ static int query_one_iothread(Object *object, void
> >> > *opaque)
> >> > info = g_new0(IOThreadInfo, 1);
> >> > info->id = iothread_get_id(iothread);
> >> > info->thread_id = iothread->thread_id;
> >> > + info->attached = iothread->attached;
> >> > info->poll_max_ns = iothread->poll_max_ns;
> >> > info->poll_grow = iothread->poll_grow;
> >> > info->poll_shrink = iothread->poll_shrink;
> >> > diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> >> > index 33a88ce205..84b01737cf 100644
> >> > --- a/monitor/hmp-cmds.c
> >> > +++ b/monitor/hmp-cmds.c
> >> > @@ -197,6 +197,8 @@ void hmp_info_iothreads(Monitor *mon, const QDict
> >> > *qdict)
> >> > value = info->value;
> >> > monitor_printf(mon, "%s:\n", value->id);
> >> > monitor_printf(mon, " thread_id=%" PRId64 "\n",
> >> > value->thread_id);
> >> > + monitor_printf(mon, " thread_status=%s" "\n",
> >> > + value->attached ? "attached" : "detached");
> >> > monitor_printf(mon, " poll-max-ns=%" PRId64 "\n",
> >> > value->poll_max_ns);
> >> > monitor_printf(mon, " poll-grow=%" PRId64 "\n",
> >> > value->poll_grow);
> >> > monitor_printf(mon, " poll-shrink=%" PRId64 "\n",
> >> > value->poll_shrink);
> >> > diff --git a/qapi/misc.json b/qapi/misc.json
> >> > index 6153ed3d04..2eea920bd2 100644
> >> > --- a/qapi/misc.json
> >> > +++ b/qapi/misc.json
> >> > @@ -76,6 +76,9 @@
> >> > #
> >> > # @thread-id: ID of the underlying host thread
> >> > #
> >> > +# @attached: flag to show current iothread attached status
> >>
> >> What does "attached status" actually mean?
> >
> > This flag means weather the "-object iothread" already been used by a
> > real device.
> > In hotplug scenario, user can add multiple "-object iothread" and
> > multiple devices (like virtio-blk).
> > When user hotunplug the devices can keep the iothreads as a thread
> > pool, following the new
> > hotplug devices can attach to the released iothread.
>
> Why would a management application or human user want to know this?
Because some usercases already been changed.
This demand comes from Cloud Native ecosystem.
User want to manage resources more flexible like containers (Kata container).
The real workload maybe changed(runc) in the VM without VM reboot,
It may need hotplug/unplug different multi disks with multi iothreads to meet
high level scheduler's needs(like K8s).
>
> The answer should lead us to better doc text.
>
OK, I will add it in next version.
> >>
> >> > +# (since 10.3.0)
> >>
> >> (since 12.0)
> >
> > OK.
> >
> >>
> >> > +#
> >> > # @poll-max-ns: maximum polling time in ns, 0 means polling is
> >> > # disabled (since 2.9)
> >> > #
> >> > @@ -93,6 +96,7 @@
> >> > { 'struct': 'IOThreadInfo',
> >> > 'data': {'id': 'str',
> >> > 'thread-id': 'int',
> >> > + 'attached': 'bool',
> >> > 'poll-max-ns': 'int',
> >> > 'poll-grow': 'int',
> >> > 'poll-shrink': 'int',
> >> > @@ -118,6 +122,7 @@
> >> > # {
> >> > # "id":"iothread0",
> >> > # "thread-id":3134,
> >> > +# 'thread_status':"attached",
> >>
> >> I believe this is actually
> >>
> >> "attached": true
> >>
> >> and ...
> >
> > No, I changed it here for readability:
> >
> >> > + monitor_printf(mon, " thread_status=%s" "\n",
> >> > + value->attached ? "attached" : "detached");
> >
> > But if you think ""attached": true" is more direct way, I can change
> > it next version.
>
> The example in the doc comment shows QMP. Here's what I see in QMP:
>
> $ qemu-system-x86_64 -S -display none -qmp stdio -object iothread,id=iot0
> -name debug-threads=on
> {"QMP": {"version": {"qemu": {"micro": 50, "minor": 2, "major": 10},
> "package": "v10.2.0-521-g05115811fa"}, "capabilities": ["oob"]}}
> {"execute": "qmp_capabilities", "arguments": {"enable": ["oob"]}}
> {"return": {}}
> {"execute": "query-iothreads"}
> {"return": [{"attached": false, "poll-shrink": 0, "thread-id": 4031494,
> "aio-max-batch": 0, "poll-grow": 0, "poll-max-ns": 32768, "id": "iot0"}]}
>
> This shows "attached": false, not 'thread_status': "attached".
>
> The code you showed applies to HMP:
>
> $ qemu-system-x86_64 -S -display none -monitor stdio -object
> iothread,id=iot0 -name debug-threads=on
> QEMU 10.2.50 monitor - type 'help' for more information
> (qemu) info iothreads
> iot0:
> thread_id=4032011
> thread_status=detached
> poll-max-ns=32768
> poll-grow=0
> poll-shrink=0
> aio-max-batch=0
>
> thread_status=detached might be slightly more readable than
> attached=false, but it could also be confusing to people working with
> both HMP and QMP. I'd avoid the difference between the two.
Make sense, I will change it to ""attached": false" style next version.
Thanks
Chen
>
> >>
> >> > # 'poll-max-ns':0,
> >> > # "poll-grow":0,
> >> > # "poll-shrink":0,
> >> > @@ -126,6 +131,7 @@
> >> > # {
> >> > # "id":"iothread1",
> >> > # "thread-id":3135,
> >> > +# 'thread_status':"detached",
> >>
> >> "attached": false
> >>
> >> Recommend to create example output by running a test instead of making
> >> it up, because making it up likely screws it up :)
> >
> > Uh.... This output print is the real test in my machine, maybe you
> > missed the previous description.
>
> I can't see how QMP could possibly show 'thread_status':"detached:.
>
> >
> > Thanks
> > Chen
> >
> >>
> >> > # 'poll-max-ns':0,
> >> > # "poll-grow":0,
> >> > # "poll-shrink":0,
> >>
>