From patchwork Wed Jan 18 19:54:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tyler Retzlaff X-Patchwork-Id: 122322 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BACF942411; Wed, 18 Jan 2023 20:54:36 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 95D0142D81; Wed, 18 Jan 2023 20:54:16 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 2B8FC41144 for ; Wed, 18 Jan 2023 20:54:11 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id 5369220E0A07; Wed, 18 Jan 2023 11:54:10 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5369220E0A07 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1674071650; bh=ie6Y0IkgtFymkx4Yv0Dou+aGiyei/lep94bl/uRRioI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ndlk/ltiP4FQzXTtbwvO3gvEDDH5P2IwG96JOrWqMiNP0N747D648mvLmY75pmbTR PgstRA6ENfmx5+ZJnAsW3+9FGf0D4nOt0k3UCpHtY8uQpoURE5A7brIDUq9lrc48y9 9kux6GhE8EjLpcOQUmHkH9Vap9/isnAYzy+5Gn0Y= From: Tyler Retzlaff To: dev@dpdk.org Cc: thomas@monjalon.net, david.marchand@redhat.com, jerinjacobk@gmail.com, mb@smartsharesystems.com, Tyler Retzlaff Subject: [PATCH v6 1/5] eal: add thread set name API operating on rte thread Date: Wed, 18 Jan 2023 11:54:02 -0800 Message-Id: <1674071646-6854-2-git-send-email-roretzla@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1674071646-6854-1-git-send-email-roretzla@linux.microsoft.com> References: <1670439617-9054-1-git-send-email-roretzla@linux.microsoft.com> <1674071646-6854-1-git-send-email-roretzla@linux.microsoft.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add a rte_thread_set_name that sets the name of an rte_thread_t thread. This is a replacement for the rte_thread_setname(pthread_t, ...) which exposes platform-specific details. Signed-off-by: Tyler Retzlaff Series-acked-by: Morten Brørup --- lib/eal/common/eal_common_thread.c | 8 ++----- lib/eal/freebsd/eal.c | 3 +-- lib/eal/freebsd/eal_thread.c | 11 +++++++++ lib/eal/include/rte_thread.h | 17 ++++++++++++++ lib/eal/linux/eal.c | 6 +---- lib/eal/linux/eal_thread.c | 22 ++++++++++++++++++ lib/eal/version.map | 3 +++ lib/eal/windows/rte_thread.c | 46 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 103 insertions(+), 13 deletions(-) diff --git a/lib/eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c index 38d83a6..3181515 100644 --- a/lib/eal/common/eal_common_thread.c +++ b/lib/eal/common/eal_common_thread.c @@ -288,12 +288,8 @@ static void *ctrl_thread_init(void *arg) return -ret; } - if (name != NULL) { - ret = rte_thread_setname(*thread, name); - if (ret < 0) - RTE_LOG(DEBUG, EAL, - "Cannot set name for ctrl thread\n"); - } + if (name != NULL) + rte_thread_set_name((rte_thread_t){(uintptr_t)*thread}, name); /* Wait for the control thread to initialize successfully */ while ((ctrl_thread_status = diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index 8db5007..9303401 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -817,8 +817,7 @@ static void rte_eal_init_alert(const char *msg) /* Set thread_name for aid in debugging. */ snprintf(thread_name, sizeof(thread_name), "rte-worker-%d", i); - rte_thread_setname((pthread_t)lcore_config[i].thread_id.opaque_id, - thread_name); + rte_thread_set_name(lcore_config[i].thread_id, thread_name); ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id, &lcore_config[i].cpuset); diff --git a/lib/eal/freebsd/eal_thread.c b/lib/eal/freebsd/eal_thread.c index ab81b52..b69f5d3 100644 --- a/lib/eal/freebsd/eal_thread.c +++ b/lib/eal/freebsd/eal_thread.c @@ -32,6 +32,17 @@ int rte_sys_gettid(void) return (int)lwpid; } +void rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) +{ + char truncated[RTE_MAX_THREAD_NAME_LEN]; + const size_t truncatedsz = sizeof(truncated); + + if (strlcpy(truncated, thread_name, truncatedsz) >= truncatedsz) + RTE_LOG(DEBUG, EAL, "Truncated thread name\n"); + + pthread_set_name_np((pthread_t)thread_id.opaque_id, truncated); +} + int rte_thread_setname(pthread_t id, const char *name) { /* this BSD function returns no error */ diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h index b9edf70..8a63a52 100644 --- a/lib/eal/include/rte_thread.h +++ b/lib/eal/include/rte_thread.h @@ -146,6 +146,23 @@ int rte_thread_create(rte_thread_t *thread_id, * @warning * @b EXPERIMENTAL: this API may change without prior notice. * + * Set the name of the thread. + * + * @param thread_id + * The id of the thread to set name. + * + * @param thread_name + * The name to set. Truncated to RTE_MAX_THREAD_NAME_LEN, + * including terminating NUL if necessary. + */ +__rte_experimental +void +rte_thread_set_name(rte_thread_t thread_id, const char *thread_name); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * * Check if 2 thread ids are equal. * * @param t1 diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 60298c0..d4c3507 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1261,11 +1261,7 @@ static void rte_eal_init_alert(const char *msg) /* Set thread_name for aid in debugging. */ snprintf(thread_name, sizeof(thread_name), "rte-worker-%d", i); - ret = rte_thread_setname((pthread_t)lcore_config[i].thread_id.opaque_id, - thread_name); - if (ret != 0) - RTE_LOG(DEBUG, EAL, - "Cannot set name for lcore thread\n"); + rte_thread_set_name(lcore_config[i].thread_id, thread_name); ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id, &lcore_config[i].cpuset); diff --git a/lib/eal/linux/eal_thread.c b/lib/eal/linux/eal_thread.c index 625bde6..d5fddab 100644 --- a/lib/eal/linux/eal_thread.c +++ b/lib/eal/linux/eal_thread.c @@ -10,6 +10,7 @@ #include #include +#include #include /* require calling thread tid by gettid() */ @@ -18,6 +19,27 @@ int rte_sys_gettid(void) return (int)syscall(SYS_gettid); } +void rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) +{ + int ret = ENOSYS; +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2, 12) + char truncated[RTE_MAX_THREAD_NAME_LEN]; + const size_t truncatedsz = sizeof(truncated); + + if (strlcpy(truncated, thread_name, truncatedsz) >= truncatedsz) + RTE_LOG(DEBUG, EAL, "Truncated thread name\n"); + + ret = pthread_setname_np((pthread_t)thread_id.opaque_id, truncated); +#endif +#endif + RTE_SET_USED(thread_id); + RTE_SET_USED(thread_name); + + if (ret != 0) + RTE_LOG(DEBUG, EAL, "Failed to set thread name\n"); +} + int rte_thread_setname(pthread_t id, const char *name) { int ret = ENOSYS; diff --git a/lib/eal/version.map b/lib/eal/version.map index 7ad12a7..c98ba71 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -440,6 +440,9 @@ EXPERIMENTAL { rte_thread_detach; rte_thread_equal; rte_thread_join; + + # added in 23.03 + rte_thread_set_name; }; INTERNAL { diff --git a/lib/eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c index 1c1e9d0..c26659d 100644 --- a/lib/eal/windows/rte_thread.c +++ b/lib/eal/windows/rte_thread.c @@ -4,7 +4,9 @@ */ #include +#include +#include #include #include #include @@ -305,6 +307,50 @@ struct thread_routine_ctx { return thread_id; } +void +rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) +{ + int ret = 0; + wchar_t wname[RTE_MAX_THREAD_NAME_LEN]; + mbstate_t state = {0}; + size_t rv; + HANDLE thread_handle; + + thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, + thread_id.opaque_id); + if (thread_handle == NULL) { + ret = thread_log_last_error("OpenThread()"); + goto cleanup; + } + + memset(wname, 0, sizeof(wname)); + rv = mbsrtowcs(wname, &thread_name, RTE_DIM(wname) - 1, &state); + if (rv == (size_t)-1) { + ret = EILSEQ; + goto cleanup; + } + + if (wcslen(wname) < strlen(thread_name)) + RTE_LOG(DEBUG, EAL, "Truncated thread name\n"); + +#ifndef RTE_TOOLCHAIN_GCC + if (FAILED(SetThreadDescription(thread_handle, wname))) { + ret = EINVAL; + goto cleanup; + } +#else + ret = ENOTSUP; + goto cleanup; +#endif + +cleanup: + if (thread_handle != NULL) + CloseHandle(thread_handle); + + if (ret != 0) + RTE_LOG(DEBUG, EAL, "Failed to set thread name\n"); +} + int rte_thread_get_priority(rte_thread_t thread_id, enum rte_thread_priority *priority)