From patchwork Tue Mar 16 09:15:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tal Shnaiderman X-Patchwork-Id: 89204 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 8AD10A054F; Tue, 16 Mar 2021 10:18:43 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 760A02428D4; Tue, 16 Mar 2021 10:18:43 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id 312992428D3 for ; Tue, 16 Mar 2021 10:18:42 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from talshn@nvidia.com) with SMTP; 16 Mar 2021 11:18:38 +0200 Received: from nvidia.com (l-wincomp04-vm.mtl.labs.mlnx [10.237.1.5]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 12G9Ic1Z028182; Tue, 16 Mar 2021 11:18:38 +0200 From: Tal Shnaiderman To: dev@dpdk.org Cc: thomas@monjalon.net, pallavi.kadam@intel.com, dmitry.kozliuk@gmail.com, navasile@linux.microsoft.com, dmitrym@microsoft.com, david.marchand@redhat.com, anatoly.burakov@intel.com, vladimir.medvedkin@intel.com, mb@smartsharesystems.com Date: Tue, 16 Mar 2021 11:15:41 +0200 Message-Id: <20210316091542.7224-2-talshn@nvidia.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20210316091542.7224-1-talshn@nvidia.com> References: <20210310124856.8188-2-talshn@nvidia.com> <20210316091542.7224-1-talshn@nvidia.com> Subject: [dpdk-dev] [PATCH v5 1/2] eal: error number enhancement for thread TLS API 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" add error number reporting to rte_errno in all functions in the rte_thread_tls_* API. Suggested-by: Anatoly Burakov Signed-off-by: Tal Shnaiderman Acked-by: Dmitry Kozlyuk --- lib/librte_eal/include/rte_thread.h | 14 +++++++++++--- lib/librte_eal/unix/rte_thread.c | 6 ++++++ lib/librte_eal/windows/rte_thread.c | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h index e640ea1857..e8f9365953 100644 --- a/lib/librte_eal/include/rte_thread.h +++ b/lib/librte_eal/include/rte_thread.h @@ -59,7 +59,9 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: ENOMEM - Memory allocation error. + * ENOEXEC - Specific OS error. */ __rte_experimental @@ -73,7 +75,9 @@ int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental int rte_thread_tls_key_delete(rte_tls_key key); @@ -88,7 +92,9 @@ int rte_thread_tls_key_delete(rte_tls_key key); * * @return * On success, zero. - * On failure, a negative number. + * On failure, a negative number and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental int rte_thread_tls_value_set(rte_tls_key key, const void *value); @@ -102,6 +108,8 @@ int rte_thread_tls_value_set(rte_tls_key key, const void *value); * @return * On success, value data pointer (can also be NULL). * On failure, NULL and an error number is set in rte_errno. + * rte_errno can be: EINVAL - Invalid parameter passed. + * ENOEXEC - Specific OS error. */ __rte_experimental void *rte_thread_tls_value_get(rte_tls_key key); diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c index 86ffeebc95..b187c69a4c 100644 --- a/lib/librte_eal/unix/rte_thread.c +++ b/lib/librte_eal/unix/rte_thread.c @@ -24,6 +24,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) *key = malloc(sizeof(**key)); if ((*key) == NULL) { RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n"); + rte_errno = ENOMEM; return -1; } err = pthread_key_create(&((*key)->thread_index), destructor); @@ -31,6 +32,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) RTE_LOG(DEBUG, EAL, "pthread_key_create failed: %s\n", strerror(err)); free(*key); + rte_errno = ENOEXEC; return -1; } return 0; @@ -43,6 +45,7 @@ rte_thread_tls_key_delete(rte_tls_key key) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } err = pthread_key_delete(key->thread_index); @@ -50,6 +53,7 @@ rte_thread_tls_key_delete(rte_tls_key key) RTE_LOG(DEBUG, EAL, "pthread_key_delete failed: %s\n", strerror(err)); free(key); + rte_errno = ENOEXEC; return -1; } free(key); @@ -63,12 +67,14 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } err = pthread_setspecific(key->thread_index, value); if (err) { RTE_LOG(DEBUG, EAL, "pthread_setspecific failed: %s\n", strerror(err)); + rte_errno = ENOEXEC; return -1; } return 0; diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c index 2e2ab29177..fa9e360855 100644 --- a/lib/librte_eal/windows/rte_thread.c +++ b/lib/librte_eal/windows/rte_thread.c @@ -18,12 +18,14 @@ rte_thread_tls_key_create(rte_tls_key *key, *key = malloc(sizeof(**key)); if ((*key) == NULL) { RTE_LOG(DEBUG, EAL, "Cannot allocate TLS key.\n"); + rte_errno = ENOMEM; return -1; } (*key)->thread_index = TlsAlloc(); if ((*key)->thread_index == TLS_OUT_OF_INDEXES) { RTE_LOG_WIN32_ERR("TlsAlloc()"); free(*key); + rte_errno = ENOEXEC; return -1; } return 0; @@ -34,11 +36,13 @@ rte_thread_tls_key_delete(rte_tls_key key) { if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } if (!TlsFree(key->thread_index)) { RTE_LOG_WIN32_ERR("TlsFree()"); free(key); + rte_errno = ENOEXEC; return -1; } free(key); @@ -52,12 +56,14 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); + rte_errno = EINVAL; return -1; } /* discard const qualifier */ p = (char *) (uintptr_t) value; if (!TlsSetValue(key->thread_index, p)) { RTE_LOG_WIN32_ERR("TlsSetValue()"); + rte_errno = ENOEXEC; return -1; } return 0;