From patchwork Wed Aug 18 21:19:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Narcisa Ana Maria Vasile X-Patchwork-Id: 97080 X-Patchwork-Delegate: david.marchand@redhat.com 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 01F84A0C55; Wed, 18 Aug 2021 23:19:46 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9F9DF4067E; Wed, 18 Aug 2021 23:19:46 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 468E440140 for ; Wed, 18 Aug 2021 23:19:45 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1059) id 83D0620C3344; Wed, 18 Aug 2021 14:19:44 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 83D0620C3344 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1629321584; bh=fTkgT9GzywJJ+3FBFczeYLkvATkUz/9rXe7kllHa4UM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bWcA0BsYzdIJyHNmOoXPENjtqM/3E+BJKQtrYeBugA4LImRUmW9BgRml32sdmB81b w3GJLHQt+iqPQjC31hr025vLw+COp2iZuYPpPbSsK+aRgPfIY+W14jonqFmJfYywhl lpOunKYigxE0Rjye9A5tdXT4UCNYm7sULfMb2dSA= From: Narcisa Ana Maria Vasile To: dev@dpdk.org, thomas@monjalon.net, dmitry.kozliuk@gmail.com, khot@microsoft.com, navasile@microsoft.com, dmitrym@microsoft.com, roretzla@microsoft.com, talshn@nvidia.com, ocardona@microsoft.com Cc: bruce.richardson@intel.com, david.marchand@redhat.com, pallavi.kadam@intel.com Date: Wed, 18 Aug 2021 14:19:34 -0700 Message-Id: <1629321579-10788-2-git-send-email-navasile@linux.microsoft.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1629321579-10788-1-git-send-email-navasile@linux.microsoft.com> References: <1629294247-5207-7-git-send-email-navasile@linux.microsoft.com> <1629321579-10788-1-git-send-email-navasile@linux.microsoft.com> Subject: [dpdk-dev] [PATCH v4 1/6] eal: add function that sets thread name 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 Sender: "dev" From: Narcisa Vasile Implement function that sets the name of a thread. On Windows, SetThreadDescription() is used. Use GetProcAddress() to obtain the address of the function for MinGW compatibility. Signed-off-by: Narcisa Vasile --- lib/eal/common/rte_thread.c | 17 ++++++++ lib/eal/include/rte_thread.h | 16 ++++++++ lib/eal/version.map | 1 + lib/eal/windows/rte_thread.c | 76 ++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) diff --git a/lib/eal/common/rte_thread.c b/lib/eal/common/rte_thread.c index 3fdb267337..c91ed3d433 100644 --- a/lib/eal/common/rte_thread.c +++ b/lib/eal/common/rte_thread.c @@ -373,6 +373,23 @@ rte_thread_barrier_destroy(rte_thread_barrier *barrier) return ret; } +int +rte_thread_name_set(rte_thread_t thread_id, const char *name) +{ + int ret = ENOSYS; +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2, 12) + char truncated[16]; + + memcpy(truncated, name, sizeof(truncated)); + ret = pthread_setname_np((pthread_t)thread_id.opaque_id, truncated); +#endif +#endif + RTE_SET_USED(thread_id); + RTE_SET_USED(name); + return ret; +} + int rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *)) { diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h index 40da83467b..2f6258e336 100644 --- a/lib/eal/include/rte_thread.h +++ b/lib/eal/include/rte_thread.h @@ -439,6 +439,22 @@ int rte_thread_barrier_wait(rte_thread_barrier *barrier); __rte_experimental int rte_thread_barrier_destroy(rte_thread_barrier *barrier); +/** + * Set the name of the thread represented by 'thread_id'. + * + * @param thread_id + * The id of the thread. + * + * @param name + * Thread name to set. + * + * @return + * On success, return 0. + * On failure, return a positive errno-style error number. + */ +__rte_experimental +int rte_thread_name_set(rte_thread_t thread_id, const char *name); + /** * Create a TLS data key visible to all threads in the process. * the created key is later used to get/set a value. diff --git a/lib/eal/version.map b/lib/eal/version.map index 541dc13053..7ce8dcea07 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -446,6 +446,7 @@ EXPERIMENTAL { rte_thread_barrier_init; rte_thread_barrier_wait; rte_thread_barrier_destroy; + rte_thread_name_set; }; INTERNAL { diff --git a/lib/eal/windows/rte_thread.c b/lib/eal/windows/rte_thread.c index b2ff16f51f..f30c5f0f57 100644 --- a/lib/eal/windows/rte_thread.c +++ b/lib/eal/windows/rte_thread.c @@ -556,6 +556,82 @@ rte_thread_barrier_destroy(rte_thread_barrier *barrier) return 0; } +typedef HRESULT +(*SetThreadDescription_type)(HANDLE thread_handle, PCWSTR thread_description); + +static SetThreadDescription_type SetThreadDescription_ptr; +HMODULE kernel32_handle; + +RTE_INIT(rte_thread_description_ptr_init) +{ + static const char library_name[] = "kernel32.dll"; + static const char function[] = "SetThreadDescription"; + + kernel32_handle = LoadLibraryA(library_name); + if (kernel32_handle == NULL) { + (void)thread_log_last_error("LoadLibraryA(\"kernel32.dll\")"); + return; + } + + SetThreadDescription_ptr = (SetThreadDescription_type)( + (void *)GetProcAddress(kernel32_handle, function)); + if (SetThreadDescription_ptr == NULL) { + (void)thread_log_last_error("GetProcAddress(\"kernel32.dll\", \"SetThreadDescription\")"); + FreeLibrary(kernel32_handle); + kernel32_handle = NULL; + return; + } +} + +RTE_FINI(rte_thread_description_ptr_free) +{ + if (kernel32_handle != NULL) + FreeLibrary(kernel32_handle); + kernel32_handle = NULL; + SetThreadDescription_ptr = NULL; +} + +int +rte_thread_name_set(rte_thread_t thread_id, const char *name) +{ + int ret = 0; + size_t count; + HRESULT hr; + HANDLE thread_handle = NULL; + WCHAR w_name[16]; + + thread_handle = OpenThread(THREAD_SET_LIMITED_INFORMATION, FALSE, + thread_id.opaque_id); + if (thread_handle == NULL) { + ret = thread_log_last_error("OpenThread()"); + goto cleanup; + } + + count = mbstowcs(w_name, name, RTE_DIM(w_name)); + if (count == (size_t) (-1)) { + RTE_LOG(DEBUG, EAL, "Invalid thread name!\n"); + ret = EINVAL; + goto cleanup; + } + + if (SetThreadDescription_ptr == NULL) { + RTE_LOG(DEBUG, EAL, "Invalid function pointer to SetThreadDescription()!\n"); + ret = EINVAL; + goto cleanup; + } + + hr = SetThreadDescription_ptr(thread_handle, w_name); + if (FAILED(hr)) { + ret = thread_log_last_error("SetThreadDescription()"); + goto cleanup; + } + +cleanup: + if (thread_handle != NULL) + CloseHandle(thread_handle); + return ret; +} + int rte_thread_key_create(rte_thread_key *key, __rte_unused void (*destructor)(void *))