Zhang Chen <[email protected]> writes: > On Thu, Aug 20, 2026 at 4:17 PM Markus Armbruster <[email protected]> wrote: >> >> Zhang Chen <[email protected]> writes: >> >> > Display holder information in info iothreads to aid manual debugging. >> > Omit the holders line when an IOThread has no holders. >> > >> > Signed-off-by: Zhang Chen <[email protected]> >> > --- >> > monitor/hmp-cmds.c | 21 +++++++++++++++++++++ >> > 1 file changed, 21 insertions(+) >> > >> > diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c >> > index e9fb8d827a..41a813e79f 100644 >> > --- a/monitor/hmp-cmds.c >> > +++ b/monitor/hmp-cmds.c >> > @@ -240,11 +240,32 @@ void hmp_info_iothreads(Monitor *mon, const QDict >> > *qdict) >> > IOThreadInfoList *info_list = qmp_query_iothreads(NULL); >> > IOThreadInfoList *info; >> > IOThreadInfo *value; >> > + IOThreadHolderList *h; >> > >> > for (info = info_list; info; info = info->next) { >> > value = info->value; >> > monitor_printf(mon, "%s:\n", value->id); >> > monitor_printf(mon, " thread_id=%" PRId64 "\n", >> > value->thread_id); >> > + monitor_printf(mon, " holders="); >> > + for (h = value->holders; h; h = h->next) { >> > + IOThreadHolder *holder = h->value; >> > + >> > + switch (holder->type) { >> > + case IO_THREAD_HOLDER_KIND_BLOCK_EXPORT: >> > + monitor_printf(mon, "[block-export: %s]", >> > + holder->u.block_export.export_id); >> > + break; >> > + case IO_THREAD_HOLDER_KIND_QOM_OBJECT: >> > + monitor_printf(mon, "[qom-path: %s]", >> > + holder->u.qom_object.qom_path); >> > + break; >> > + default: >> > + monitor_printf(mon, "[unknown]"); >> > + break; >> >> This is unreachable. Please use >> >> default: >> g_assert_not_reached(); >> >> to make it obvious. >> >> > + } >> > + } >> > + monitor_printf(mon, "\n"); >> > + >> > 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); >> >> Quick test: >> >> $ qemu-system-x86_64 -S -nodefaults -display none -chardev >> socket,id=chr-qmp,path=test-qmp,server=on,wait=off -object >> monitor-qmp,id=qmp,chardev=chr-qmp -monitor stdio >> QEMU 11.1.50 monitor - type 'help' for more information >> (qemu) info iothreads >> (qemu) q >> >> Hmm, no output? The QMP monitor should be holding the monitor I/O >> thread. To confirm that, I made monitor_complete() print things (patch >> appended), and got >> >> ### monitor qmp holding iothread mon_iothread >> ### monitor compat_monitor0 without iothread >> >> What's going on here? >> > > This is expected with the existing query-iothreads behavior. > mon_iothread is created under the internal object root, while > qmp_query_iothreads() only walks /objects, so internal IOThreads are > intentionally not exposed through QMP/HMP.
TIL about the internal object root. It's the root of a *second* QOM composition tree. I have been operating under the assumnption there is just one. Your series adds holder tracking for any I/O thread, whether it's in the externally visible QOM composition tree (the one returned by object_get_root()) or the internal one (the one returned by object_get_internal_root()). Makes sense, because at the place where we track we don't want to know / make assumptions about which tree it is. query-iothreads shows only the I/O threads in the externally visible QOM composition tree. Makes sense. Fortunately, you were able to eliminate the special case for monitors. If it was still there, the query-iothreads code to show it would be dead. Back to what got us there. My attempt to test query-iothreads showing holders failed, because monitors are not usable for this test. Please show me how to test this. Ideally, a simple command line and a few simple monitor commands ending with a query-iothreads that shows holders. > I prefer to preserve that behavior in this series, since exposing internal > IOThreads would require additional API decisions, including handling ID > collisions with user-created IOThreads. Okay! > I’ll also change the unreachable default case to > g_assert_not_reached(). > > Thanks > Chen [...]
