From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D73D3423FF; Tue, 17 Jan 2023 19:22:18 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7BFCD42D47; Tue, 17 Jan 2023 19:21:56 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 545DD410DD for ; Tue, 17 Jan 2023 19:21:51 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id 84CDD20DFE9F; Tue, 17 Jan 2023 10:21:50 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 84CDD20DFE9F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1673979710; bh=3raSiJsPCfm10k42xvlFVyrBlMUDpiN4oBHsQpP5dAI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BW773J1Qzjdf7+9z+gzQhl1mSMz2xY8yh6pWuNBBhumVJFbRozRF0XjJAiLHBsmV6 pu74PfUFmDLO5Hq3v9ZmSTAOnBRpa6YbTOrlFDP6eXcHqnQWYv2rg+xxqoxU+9gJnX dsl+8rb8c0oy7ZQ6uGudcG1mU//0YGhdUTH5CDeU= From: Tyler Retzlaff To: dev@dpdk.org Cc: thomas@monjalon.net, david.marchand@redhat.com, mb@smartsharesystems.com, jerinjacobk@gmail.com, Tyler Retzlaff Subject: [PATCH v5 1/4] eal: add thread set name API operating on rte thread Date: Tue, 17 Jan 2023 10:21:46 -0800 Message-Id: <1673979709-8613-2-git-send-email-roretzla@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1673979709-8613-1-git-send-email-roretzla@linux.microsoft.com> References: <1670439617-9054-1-git-send-email-roretzla@linux.microsoft.com> <1673979709-8613-1-git-send-email-roretzla@linux.microsoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 9 +++----- lib/eal/freebsd/eal.c | 4 +++- lib/eal/freebsd/eal_thread.c | 11 +++++++++ lib/eal/include/rte_thread.h | 17 ++++++++++++++ lib/eal/linux/eal.c | 8 +++---- lib/eal/linux/eal_thread.c | 22 ++++++++++++++++++ lib/eal/version.map | 3 +++ lib/eal/windows/rte_thread.c | 46 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 108 insertions(+), 12 deletions(-) diff --git a/lib/eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c index c5d8b43..a44023c 100644 --- a/lib/eal/common/eal_common_thread.c +++ b/lib/eal/common/eal_common_thread.c @@ -291,12 +291,9 @@ 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 607684c..2a6415e 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -817,7 +817,9 @@ 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(lcore_config[i].thread_id, thread_name); + rte_thread_set_name( + (rte_thread_t){(uintptr_t)lcore_config[i].thread_id}, + thread_name); ret = pthread_setaffinity_np(lcore_config[i].thread_id, sizeof(rte_cpuset_t), &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 8c118d0..f7a4a10 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1255,11 +1255,9 @@ 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(lcore_config[i].thread_id, - thread_name); - if (ret != 0) - RTE_LOG(DEBUG, EAL, - "Cannot set name for lcore thread\n"); + rte_thread_set_name( + (rte_thread_t){(uintptr_t)lcore_config[i].thread_id}, + thread_name); ret = pthread_setaffinity_np(lcore_config[i].thread_id, sizeof(rte_cpuset_t), &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) -- 1.8.3.1