{"id":2221993,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2221993/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410150457.85190-14-zhangckid@gmail.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260410150457.85190-14-zhangckid@gmail.com>","date":"2026-04-10T15:04:56","name":"[V6,13/14] qapi: examine IOThread attachment status via query-iothreads","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"d7be204b2f60eefb3fc4c7d1045d9d756a993e8c","submitter":{"id":72278,"url":"http://patchwork.ozlabs.org/api/1.1/people/72278/?format=json","name":"Zhang Chen","email":"zhangckid@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410150457.85190-14-zhangckid@gmail.com/mbox/","series":[{"id":499477,"url":"http://patchwork.ozlabs.org/api/1.1/series/499477/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499477","date":"2026-04-10T15:04:43","name":"iothread: Support tracking and querying IOThread holders","version":6,"mbox":"http://patchwork.ozlabs.org/series/499477/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221993/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221993/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=OIJBjZn5;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsg9X3dVvz20HT\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 11 Apr 2026 01:06:08 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wBDQp-0007xW-G5; Fri, 10 Apr 2026 11:06:03 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhangckid@gmail.com>)\n id 1wBDQo-0007x0-1N\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 11:06:02 -0400","from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <zhangckid@gmail.com>)\n id 1wBDQm-0002b7-8E\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 11:06:01 -0400","by mail-pj1-x102e.google.com with SMTP id\n 98e67ed59e1d1-35da01fc0baso1410096a91.2\n for <qemu-devel@nongnu.org>; Fri, 10 Apr 2026 08:05:59 -0700 (PDT)","from ZBMac-LWN10QXKQ0.taila0cd24.ts.net ([104.168.88.121])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35e4131cfacsm3565785a91.10.2026.04.10.08.05.55\n (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256);\n Fri, 10 Apr 2026 08:05:57 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775833558; x=1776438358; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=RQnCW2Bu1yv/B7cGDrJMYN0CGO9ZnuxGzsyVppnfZAU=;\n b=OIJBjZn5kfXeiuqcp4cwfONmtQi1QlAJJqhrgIFjChCIY+pTU+/cIpville1z9twoj\n 4uyFihNryUz8vCXP7ftR6rxlhuDEgmSX0A/w3qbDnNKeHrkvFV2W10+Dhr1weDsWpMh+\n 2zlG0r09WqxJGaOyXeqjahmqQZqxuQ+OjPvwASzSGIVOuODO2IQnNjocZoTx5U65C4yA\n Q3l6I70sp7nnudb+CbfmJAaniz6tnnra7z2+uBcNq84aAVMF/K9ZBwOVsiK5gJz/nmx7\n ra2TpaK3HtLRYkP7IKSGE7g+4RN1T6Is6EhbSLQ6GoojmJ2O+eFbWSLAIJzpjJAY7IPQ\n ia5w==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775833558; x=1776438358;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=RQnCW2Bu1yv/B7cGDrJMYN0CGO9ZnuxGzsyVppnfZAU=;\n b=ePViVxhmfT28mFkOx/jH4RW5tZ4CFWpO7WSmTZGh1mdHFVqLXvzjavPRANkG0fgl6S\n oK4nTt7U8BgUvUEE+ugP1Huz6Fx/+lHZMrt5tbeqn6WOeK5dp1WOLz4XxvAowmYH6uP/\n Ur34rdHpA+osWpw43s+IQseGG8vpw3dNaS/xN3ij8JFKPy/CEwcredodRgn/HTumpyOe\n 0O6adWFIbzNCtOW4SvbBsawMuLUVo91dCHo1hki5Rgar1g92pErSV/VSrlNhUZYNPzS8\n 45+cgmqteyR8p63+FV0GmRi0AJwkTbl5kwwqY42hb/FlZHKGvrDfIf1+SamgZxdimbcO\n AAZQ==","X-Gm-Message-State":"AOJu0YxR22gStdrTxRnT/Ibgfs8lmCB36dnqRhntyKdw3hujASdjoWDl\n xcec6YBHnBkKXgv+6Gv7QaLucnX4iZYBR5LbOuRBpWY9JX5oKLCr/SmpjG4nN5CF","X-Gm-Gg":"AeBDiesArshEtvIUWJKUIF/Dimu9eqoljTgeyyLhxWJzbRhx0j6QKjs28HghV79s1L1\n PnXwVHQozysbAVsp0YVbKtmvXSww8HbF9WSTvOYF2PJpxLIGT7XDJmIL3Xk1R08SPFtVIkQlkXQ\n wPAFiHbTx5k60UJrEyUjhiS6kxGDOSjZ3MQIs+8/tssXJ9kOgnxi3tSTSErKxzpfQY19G/O3zkX\n e/pNQqwI9E/Vhwm0DkJOPXJI3k8YWMSVEj6XKpXInZ8zlted74q16uRH5ue8otBqThTDfumylkQ\n oe+AzqkIFWoeqF3tLHi3MTfGuVhcZQEP1HFqi3qHhHP3cIH4QxR+tql6mByUGyzFyBmeCETo4Jv\n hh5+hGgFjktXT+whTGCOOje53hBWDzuH6ygAFNGU3oMmsVh5ZyeXbrA9qL9R89ftpdlPUtjrhxq\n +oC6zoUViz45a0TxMotY0XIc+FKoElQiWOQ2BSvz5QZ6wRktN1mha6","X-Received":"by 2002:a17:90b:3dcb:b0:35d:997c:8ec0 with SMTP id\n 98e67ed59e1d1-35e4282bdb6mr3792959a91.18.1775833558292;\n Fri, 10 Apr 2026 08:05:58 -0700 (PDT)","From":"Zhang Chen <zhangckid@gmail.com>","To":"qemu-devel <qemu-devel@nongnu.org>,\n \"Dr . David Alan Gilbert\" <dave@treblig.org>,\n Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>,\n \"Michael S . Tsirkin\" <mst@redhat.com>,\n Stefan Hajnoczi <stefanha@redhat.com>","Cc":"Zhang Chen <zhangckid@gmail.com>","Subject":"[PATCH V6 13/14] qapi: examine IOThread attachment status via\n query-iothreads","Date":"Fri, 10 Apr 2026 23:04:56 +0800","Message-ID":"<20260410150457.85190-14-zhangckid@gmail.com>","X-Mailer":"git-send-email 2.49.0","In-Reply-To":"<20260410150457.85190-1-zhangckid@gmail.com>","References":"<20260410150457.85190-1-zhangckid@gmail.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2607:f8b0:4864:20::102e;\n envelope-from=zhangckid@gmail.com; helo=mail-pj1-x102e.google.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Extend the 'IOThreadInfo' structure to include attachment metrics.\nThis allows users to monitor the associated devices by identify them\nby their QOM paths.\n\nNew fields added to IOThreadInfo:\n- @holders: IoThreadHolder(QOM path or block node name) of the devices\n            currently associated with this iothread.\n\nThese fields are also exposed via the Human Monitor Interface (HMP)\ncommand 'info iothreads' to assist with manual debugging and\nperformance tuning.\n\nSigned-off-by: Zhang Chen <zhangckid@gmail.com>\n---\n iothread.c         | 22 ++++++++++++++++++++++\n monitor/hmp-cmds.c | 22 ++++++++++++++++++++++\n qapi/misc.json     | 16 ++++++++++++++--\n 3 files changed, 58 insertions(+), 2 deletions(-)","diff":"diff --git a/iothread.c b/iothread.c\nindex 60a024f770..70bc5fb62a 100644\n--- a/iothread.c\n+++ b/iothread.c\n@@ -24,6 +24,8 @@\n #include \"qemu/error-report.h\"\n #include \"qemu/rcu.h\"\n #include \"qemu/main-loop.h\"\n+#include \"qapi/clone-visitor.h\"\n+#include \"qapi/qapi-visit-misc.h\"\n \n \n #ifdef CONFIG_POSIX\n@@ -93,6 +95,25 @@ static void iothread_unref(IOThread *iothread, const char *holder)\n     object_unref(OBJECT(iothread));\n }\n \n+static IoThreadHolderList *iothread_get_holders_list(IOThread *iothread)\n+{\n+    IoThreadHolderList *head = NULL;\n+    IoThreadHolderList **prev = &head;\n+    GList *l;\n+\n+    for (l = iothread->holders; l; l = l->next) {\n+        IoThreadHolder *src = l->data;\n+        IoThreadHolderList *entry = g_new0(IoThreadHolderList, 1);\n+\n+        entry->value = QAPI_CLONE(IoThreadHolder, src);\n+\n+        *prev = entry;\n+        prev = &entry->next;\n+    }\n+\n+    return head;\n+}\n+\n static void *iothread_run(void *opaque)\n {\n     IOThread *iothread = opaque;\n@@ -434,6 +455,7 @@ static int query_one_iothread(Object *object, void *opaque)\n     info = g_new0(IOThreadInfo, 1);\n     info->id = iothread_get_id(iothread);\n     info->thread_id = iothread->thread_id;\n+    info->holders = iothread_get_holders_list(iothread);\n     info->poll_max_ns = iothread->poll_max_ns;\n     info->poll_grow = iothread->poll_grow;\n     info->poll_shrink = iothread->poll_shrink;\ndiff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c\nindex bc26b39d70..344eaf330b 100644\n--- a/monitor/hmp-cmds.c\n+++ b/monitor/hmp-cmds.c\n@@ -198,11 +198,33 @@ void hmp_info_iothreads(Monitor *mon, const QDict *qdict)\n     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);\n     IOThreadInfoList *info;\n     IOThreadInfo *value;\n+    IoThreadHolderList *h;\n \n     for (info = info_list; info; info = info->next) {\n         value = info->value;\n         monitor_printf(mon, \"%s:\\n\", value->id);\n         monitor_printf(mon, \"  thread_id=%\" PRId64 \"\\n\", value->thread_id);\n+        monitor_printf(mon, \"  holders=\");\n+        if (value->holders) {\n+            for (h = value->holders; h; h = h->next) {\n+                IoThreadHolder *holder = h->value;\n+\n+                switch (holder->type) {\n+                case IO_THREAD_HOLDER_KIND_BLOCK_NODE:\n+                    monitor_printf(mon, \"[block-node: %s]\",\n+                                   holder->u.block_node.data);\n+                    break;\n+                case IO_THREAD_HOLDER_KIND_QOM_OBJECT:\n+                    monitor_printf(mon, \"[qom: %s]\",\n+                                   holder->u.qom_object.data);\n+                    break;\n+                default:\n+                    monitor_printf(mon, \"[unknown]\");\n+                    break;\n+                }\n+            }\n+            monitor_printf(mon, \"\\n\");\n+        }\n         monitor_printf(mon, \"  poll-max-ns=%\" PRId64 \"\\n\", value->poll_max_ns);\n         monitor_printf(mon, \"  poll-grow=%\" PRId64 \"\\n\", value->poll_grow);\n         monitor_printf(mon, \"  poll-shrink=%\" PRId64 \"\\n\", value->poll_shrink);\ndiff --git a/qapi/misc.json b/qapi/misc.json\nindex d65d8012b2..e173d54a5e 100644\n--- a/qapi/misc.json\n+++ b/qapi/misc.json\n@@ -94,7 +94,8 @@\n # @IoThreadHolderKind:\n #\n # @block-node: Block node name.\n-# @qom-object: Standard QOM path.\n+#\n+# @qom-object: QOM path.\n #\n # Since: 11.0\n ##\n@@ -104,7 +105,7 @@\n ##\n # @IoThreadHolder:\n #\n-# @type: Current IoThread holder type support QOM path and Block node.\n+# @type: Current IoThread holder type support QOM path and block node.\n #\n # Since: 11.0\n ##\n@@ -124,6 +125,13 @@\n #\n # @thread-id: ID of the underlying host thread\n #\n+# @holders: IoThreadHolder(QOM path or block node name) of the devices\n+#     currently associated with this iothread.  Users can pre-allocate\n+#     multiple iothread objects to serve as a persistent thread pool.\n+#     When a device is hot-unplugged, it is detached from its\n+#     iothread, but the iothread remains available, allowing future\n+#     hot-plugged devices to attach to it.\n+#\n # @poll-max-ns: maximum polling time in ns, 0 means polling is\n #     disabled (since 2.9)\n #\n@@ -141,6 +149,7 @@\n { 'struct': 'IOThreadInfo',\n   'data': {'id': 'str',\n            'thread-id': 'int',\n+           'holders': ['IoThreadHolder'],\n            'poll-max-ns': 'int',\n            'poll-grow': 'int',\n            'poll-shrink': 'int',\n@@ -166,6 +175,8 @@\n #              {\n #                 \"id\":\"iothread0\",\n #                 \"thread-id\":3134,\n+#                 \"holders\":[\"/machine/peripheral/blk1/virtio-backend\",\n+#                            \"/machine/peripheral/blk0/virtio-backend\"],\n #                 \"poll-max-ns\":32768,\n #                 \"poll-grow\":0,\n #                 \"poll-shrink\":0,\n@@ -174,6 +185,7 @@\n #              {\n #                 \"id\":\"iothread1\",\n #                 \"thread-id\":3135,\n+#                 \"holders\":[\"/machine/peripheral/blk2/virtio-backend\"],\n #                 \"poll-max-ns\":32768,\n #                 \"poll-grow\":0,\n #                 \"poll-shrink\":0,\n","prefixes":["V6","13/14"]}