Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2195641/?format=api
{ "id": 2195641, "url": "http://patchwork.ozlabs.org/api/patches/2195641/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260211152508.732487-11-berrange@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "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": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260211152508.732487-11-berrange@redhat.com>", "list_archive_url": null, "date": "2026-02-11T15:24:51", "name": "[v6,10/27] util: add API to fetch the current thread name", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "74d3a1f05f624756cb53a530e6a675621361e69f", "submitter": { "id": 2694, "url": "http://patchwork.ozlabs.org/api/people/2694/?format=api", "name": "Daniel P. Berrangé", "email": "berrange@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260211152508.732487-11-berrange@redhat.com/mbox/", "series": [ { "id": 491862, "url": "http://patchwork.ozlabs.org/api/series/491862/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=491862", "date": "2026-02-11T15:24:41", "name": "util: sync error_report & qemu_log output more closely", "version": 6, "mbox": "http://patchwork.ozlabs.org/series/491862/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2195641/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2195641/checks/", "tags": {}, "related": [], "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 (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=UnJtGZJq;\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 (lists.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 4fB2QG72dPz1xtr\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 12 Feb 2026 02:28:38 +1100 (AEDT)", "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 1vqC6l-0006VF-NV; Wed, 11 Feb 2026 10:26:27 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <berrange@redhat.com>)\n id 1vqC6j-0006Qj-IK\n for qemu-devel@nongnu.org; Wed, 11 Feb 2026 10:26:25 -0500", "from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <berrange@redhat.com>)\n id 1vqC6g-0005s3-7z\n for qemu-devel@nongnu.org; Wed, 11 Feb 2026 10:26:25 -0500", "from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-161-1secoa4ANraGNLIINQv5Dg-1; Wed,\n 11 Feb 2026 10:26:16 -0500", "from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 8294B180025F; Wed, 11 Feb 2026 15:26:13 +0000 (UTC)", "from toolbx.redhat.com (unknown [10.45.227.9])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 6DD2A30001A8; Wed, 11 Feb 2026 15:26:08 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1770823581;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=U4ooj0qoTlbTdZFthN2E2JErDMdhjQ9nsu3y5uVtROg=;\n b=UnJtGZJqdqN6iqugxXJkUgFczO9VE0a1OWlD9OfpfLI8FUOcfj/ckRamUpta21KmBEhsNn\n sTUSA7GTI/c/C5HaerSL6tvQomNOz+mG2YBOilEfSXvMroivD3A+rSIBdlMlQdbUGqtWX2\n mxkYHGTd3hpC1kuYC5IUh8FNuZ1VBGY=", "X-MC-Unique": "1secoa4ANraGNLIINQv5Dg-1", "X-Mimecast-MFC-AGG-ID": "1secoa4ANraGNLIINQv5Dg_1770823573", "From": "=?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= <berrange@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "Manos Pitsidianakis <manos.pitsidianakis@linaro.org>,\n Stefan Weil <sw@weilnetz.de>, \"Dr. David Alan Gilbert\" <dave@treblig.org>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>, devel@lists.libvirt.org,\n\t=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>, =?utf-8?q?Marc?=\n\t=?utf-8?q?-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Hanna Reitz <hreitz@redhat.com>, Kevin Wolf <kwolf@redhat.com>,\n qemu-block@nongnu.org, qemu-rust@nongnu.org,\n Paolo Bonzini <pbonzini@redhat.com>, Markus Armbruster <armbru@redhat.com>,\n Gerd Hoffmann <kraxel@redhat.com>,\n =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= <berrange@redhat.com>,\n Christian Schoenebeck <qemu_oss@crudebyte.com>,\n Richard Henderson <richard.henderson@linaro.org>", "Subject": "[PATCH v6 10/27] util: add API to fetch the current thread name", "Date": "Wed, 11 Feb 2026 15:24:51 +0000", "Message-ID": "<20260211152508.732487-11-berrange@redhat.com>", "In-Reply-To": "<20260211152508.732487-1-berrange@redhat.com>", "References": "<20260211152508.732487-1-berrange@redhat.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.4", "Received-SPF": "pass client-ip=170.10.129.124;\n envelope-from=berrange@redhat.com;\n helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=unavailable 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": "This will be used to include the thread name in error reports\nin a later patch. It returns a const string stored in a thread\nlocal to avoid memory allocation when it is called repeatedly\nin a single thread. The thread name should be set at the very\nstart of the thread execution, which is the case when using\nqemu_thread_create.\n\nThis uses the official thread APIs for fetching thread names,\nso that it captures names of threads spawned by code in 3rd\nparty libraries, not merely QEMU spawned thrads.\n\nThis also addresses the gap from the previous patch for setting\nthe name of the main thread. A constructor is used to initialize\nthe 'namebuf' thread-local in the main thread only.\n\nSigned-off-by: Daniel P. Berrangé <berrange@redhat.com>\n---\n include/qemu/thread.h | 1 +\n meson.build | 21 ++++++++++++++++\n util/qemu-thread-posix.c | 53 +++++++++++++++++++++++++++++++++++++++-\n util/qemu-thread-win32.c | 49 ++++++++++++++++++++++++++++++++++---\n 4 files changed, 119 insertions(+), 5 deletions(-)", "diff": "diff --git a/include/qemu/thread.h b/include/qemu/thread.h\nindex 27b888ab0a..98cc5c41ac 100644\n--- a/include/qemu/thread.h\n+++ b/include/qemu/thread.h\n@@ -216,6 +216,7 @@ void qemu_thread_get_self(QemuThread *thread);\n bool qemu_thread_is_self(QemuThread *thread);\n G_NORETURN void qemu_thread_exit(void *retval);\n void qemu_thread_set_name(const char *name);\n+const char *qemu_thread_get_name(void);\n \n struct Notifier;\n /**\ndiff --git a/meson.build b/meson.build\nindex 9ad16d1998..710aa2ed83 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -2845,6 +2845,27 @@ config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(osdep_prefix + '''\n pthread_set_name_np(thread, \"QEMU\");\n return 0;\n }''', dependencies: threads))\n+\n+config_host_data.set('CONFIG_PTHREAD_GETNAME_NP', cc.links(osdep_prefix + '''\n+ #include <pthread.h>\n+\n+ int main(void)\n+ {\n+ char buf[16];\n+ pthread_getname_np(pthread_self(), buf, sizeof(buf));\n+ return 0;\n+ }''', dependencies: threads))\n+config_host_data.set('CONFIG_PTHREAD_GET_NAME_NP', cc.links(osdep_prefix + '''\n+ #include <pthread.h>\n+ #include <pthread_np.h>\n+\n+ int main(void)\n+ {\n+ char buf[16];\n+ pthread_get_name_np(pthread_self(), buf, sizeof(buf));\n+ return 0;\n+ }''', dependencies: threads))\n+\n config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(osdep_prefix + '''\n #include <pthread.h>\n \ndiff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c\nindex b1c127dbe3..2b180d99ae 100644\n--- a/util/qemu-thread-posix.c\n+++ b/util/qemu-thread-posix.c\n@@ -18,10 +18,41 @@\n #include \"qemu/tsan.h\"\n #include \"qemu/bitmap.h\"\n \n-#ifdef CONFIG_PTHREAD_SET_NAME_NP\n+#if defined(CONFIG_PTHREAD_SET_NAME_NP) || defined(CONFIG_PTHREAD_GET_NAME_NP)\n #include <pthread_np.h>\n #endif\n \n+/*\n+ * This is not defined on Linux, but the man page indicates\n+ * the buffer must be at least 16 bytes, including the NUL\n+ * terminator\n+ */\n+#ifndef PTHREAD_MAX_NAMELEN_NP\n+#define PTHREAD_MAX_NAMELEN_NP 16\n+#endif\n+\n+static __thread char namebuf[PTHREAD_MAX_NAMELEN_NP];\n+\n+static void __attribute__((__constructor__(QEMU_CONSTRUCTOR_EARLY)))\n+qemu_thread_init(void)\n+{\n+ /*\n+ * Initialize the main thread name. We must not use\n+ * qemu_thread_setname(), since on some platforms (at least Linux)\n+ * this can change the process name that is reported by tools like\n+ * 'ps'.\n+ *\n+ * This workaround suffices to ensure QEMU log/error messages\n+ * get the main thread name, but at the cost of external tools\n+ * like GDB not seeing it.\n+ *\n+ * NB using a constructor instead of static initializing namebuf,\n+ * to ensure it only initializes the thread-local in the main\n+ * thread\n+ */\n+ g_strlcpy(namebuf, \"main\", sizeof(namebuf));\n+}\n+\n static void error_exit(int err, const char *msg)\n {\n fprintf(stderr, \"qemu: %s: %s\\n\", msg, strerror(err));\n@@ -526,3 +557,23 @@ void *qemu_thread_join(QemuThread *thread)\n }\n return ret;\n }\n+\n+const char *qemu_thread_get_name(void)\n+{\n+ int rv;\n+ if (namebuf[0] != '\\0') {\n+ return namebuf;\n+ }\n+\n+# if defined(CONFIG_PTHREAD_GETNAME_NP)\n+ rv = pthread_getname_np(pthread_self(), namebuf, sizeof(namebuf));\n+# elif defined(CONFIG_PTHREAD_GET_NAME_NP)\n+ rv = pthread_get_name_np(pthread_self(), namebuf, sizeof(namebuf));\n+# else\n+ rv = -1;\n+# endif\n+ if (rv != 0) {\n+ g_strlcpy(namebuf, \"unnamed\", G_N_ELEMENTS(namebuf));\n+ }\n+ return namebuf;\n+}\ndiff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c\nindex c330d924af..272afc3385 100644\n--- a/util/qemu-thread-win32.c\n+++ b/util/qemu-thread-win32.c\n@@ -19,7 +19,10 @@\n \n typedef HRESULT (WINAPI *pSetThreadDescription) (HANDLE hThread,\n PCWSTR lpThreadDescription);\n+typedef HRESULT (WINAPI *pGetThreadDescription) (HANDLE hThread,\n+ PWSTR *lpThreadDescription);\n static pSetThreadDescription SetThreadDescriptionFunc;\n+static pGetThreadDescription GetThreadDescriptionFunc;\n static HMODULE kernel32_module;\n \n static void __attribute__((__constructor__(QEMU_CONSTRUCTOR_EARLY)))\n@@ -28,7 +31,7 @@ qemu_thread_init(void)\n qemu_thread_set_name(\"main\");\n }\n \n-static bool load_set_thread_description(void)\n+static bool load_thread_description(void)\n {\n static gsize _init_once = 0;\n \n@@ -38,14 +41,17 @@ static bool load_set_thread_description(void)\n SetThreadDescriptionFunc =\n (pSetThreadDescription)GetProcAddress(kernel32_module,\n \"SetThreadDescription\");\n- if (!SetThreadDescriptionFunc) {\n+ GetThreadDescriptionFunc =\n+ (pGetThreadDescription)GetProcAddress(kernel32_module,\n+ \"GetThreadDescription\");\n+ if (!SetThreadDescriptionFunc || !GetThreadDescriptionFunc) {\n FreeLibrary(kernel32_module);\n }\n }\n g_once_init_leave(&_init_once, 1);\n }\n \n- return !!SetThreadDescriptionFunc;\n+ return (SetThreadDescriptionFunc && GetThreadDescriptionFunc);\n }\n \n static void error_exit(int err, const char *msg)\n@@ -331,7 +337,7 @@ void qemu_thread_set_name(const char *name)\n {\n g_autofree wchar_t *namew = NULL;\n \n- if (!load_set_thread_description()) {\n+ if (!load_thread_description()) {\n return;\n }\n \n@@ -415,3 +421,38 @@ bool qemu_thread_is_self(QemuThread *thread)\n {\n return GetCurrentThreadId() == thread->tid;\n }\n+\n+static __thread char namebuf[64];\n+\n+const char *qemu_thread_get_name(void)\n+{\n+ HRESULT hr;\n+ wchar_t *namew = NULL;\n+ g_autofree char *name = NULL;\n+\n+ if (namebuf[0] != '\\0') {\n+ return namebuf;\n+ }\n+\n+ if (!load_thread_description()) {\n+ goto error;\n+ }\n+\n+ hr = GetThreadDescriptionFunc(GetCurrentThread(), &namew);\n+ if (!SUCCEEDED(hr)) {\n+ goto error;\n+ }\n+\n+ name = g_utf16_to_utf8(namew, -1, NULL, NULL, NULL);\n+ LocalFree(namew);\n+ if (!name) {\n+ goto error;\n+ }\n+\n+ g_strlcpy(namebuf, name, G_N_ELEMENTS(namebuf));\n+ return namebuf;\n+\n+ error:\n+ g_strlcpy(namebuf, \"unnamed\", G_N_ELEMENTS(namebuf));\n+ return namebuf;\n+}\n", "prefixes": [ "v6", "10/27" ] }