On Fri, Feb 6, 2026 at 12:25 AM Stefan Hajnoczi <[email protected]> wrote:
>
> On Mon, Jan 26, 2026 at 4:52 AM Zhang Chen <[email protected]> wrote:
> >
> > The attached flag depends on struct IOThreadInfo's
> > 'attached': 'bool'. It can show whether the iothread
> > is attached to an actual device. Show in the qmp/hmp
> > CMD with "attached": true/false.
>
> I mentioned that a ref/unref API is needed in my reply to Patch 2/3.
> The API could look like:
>
> void iothread_ref(IOThread *iothread, const char *holder);
>
> And the holder string is added to a list inside iothread. That way the
> monitor commands can report an actual list of holders rather than just
> true/false:
>
>   attached = ["/qom/path/to/virtio-blk-0", "/qom/path/to/block/export/nbd-0"]
>
> The QOM path would be a useful string to use as a unique identifier.

OK, this looks more specific.
I will try to add it next version.

>
> >
> > Signed-off-by: Zhang Chen <[email protected]>
> > ---
> >  iothread.c         |  1 +
> >  monitor/hmp-cmds.c |  2 ++
> >  qapi/misc.json     | 12 ++++++++++++
> >  3 files changed, 15 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 5a673cddb2..7463f34bf5 100644
> > --- a/monitor/hmp-cmds.c
> > +++ b/monitor/hmp-cmds.c
> > @@ -202,6 +202,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, "  attached=%s" "\n",
> > +                       value->attached ? "true" : "false");
> >          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 1f5062df2a..cb865d6e48 100644
> > --- a/qapi/misc.json
> > +++ b/qapi/misc.json
> > @@ -76,6 +76,15 @@
> >  #
> >  # @thread-id: ID of the underlying host thread
> >  #
> > +# @attached: The attached parameter is a flag indicating whether
> > +#     the IOThread is currently associated with an active device
> > +#     (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 12.0)
>
> How is this supposed to work since Patch 2 does not support hot unplug
> (attached remains true)?

Will fix it next version.

>
> I'm also curious what the use case for this property is. First I
> thought it's for debugging, but based on this documentation it sounds
> like maybe you want to use it to avoid having to keep track of which
> IOThreads are used in a management tool?

Debugging is a use case, but more is for some cloud-native use
cases(like kata container).
The VM life cycle may not sync with the real workload(container
running in the VM),
As we know, elastic computing focuses on the dynamic management of resources.
So this series try to optimize hotplug/unplug path by keep the iothread pool.
After the previous task, the management tool need to unplug a virtio-blk device,
When the next task comes, the managent tool need API to check which
iothread in idle state,
and attach some iothreads to another hot plug virtio-blk device.

Thanks
Chen

>
> > +#
> >  # @poll-max-ns: maximum polling time in ns, 0 means polling is
> >  #     disabled (since 2.9)
> >  #
> > @@ -93,6 +102,7 @@
> >  { 'struct': 'IOThreadInfo',
> >    'data': {'id': 'str',
> >             'thread-id': 'int',
> > +           'attached': 'bool',
> >             'poll-max-ns': 'int',
> >             'poll-grow': 'int',
> >             'poll-shrink': 'int',
> > @@ -118,6 +128,7 @@
> >  #              {
> >  #                 "id":"iothread0",
> >  #                 "thread-id":3134,
> > +#                 "attached":false,
> >  #                 "poll-max-ns":32768,
> >  #                 "poll-grow":0,
> >  #                 "poll-shrink":0,
> > @@ -126,6 +137,7 @@
> >  #              {
> >  #                 "id":"iothread1",
> >  #                 "thread-id":3135,
> > +#                 "attached":true,
> >  #                 "poll-max-ns":32768,
> >  #                 "poll-grow":0,
> >  #                 "poll-shrink":0,
> > --
> > 2.49.0
> >
> >

Reply via email to