From patchwork Wed Mar 10 12:06:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tal Shnaiderman X-Patchwork-Id: 88828 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 6B8E1A0567; Wed, 10 Mar 2021 13:08:23 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C176422A2E9; Wed, 10 Mar 2021 13:08:17 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id DC98F4068C for ; Wed, 10 Mar 2021 13:08:14 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from talshn@nvidia.com) with SMTP; 10 Mar 2021 14:08:12 +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 12AC8BlG026451; Wed, 10 Mar 2021 14:08:11 +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: Wed, 10 Mar 2021 14:06:31 +0200 Message-Id: <20210310120632.14464-2-talshn@nvidia.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20210310120632.14464-1-talshn@nvidia.com> References: <20210302152658.9136-2-talshn@nvidia.com> <20210310120632.14464-1-talshn@nvidia.com> Subject: [dpdk-dev] [PATCH v3 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 --- lib/librte_eal/include/rte_thread.h | 14 +++++++++++--- lib/librte_eal/unix/rte_thread.c | 6 ++++++ lib/librte_eal/windows/rte_thread.c | 8 +++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h index e640ea1857..8969b5d645 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 set to: ENOMEM - Memory allocation error. + * EOTHER - 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 set to: EINVAL - Invalid parameter passed. + * EOTHER - 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 set to: EINVAL - Invalid parameter passed. + * EOTHER - 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 set to: EINVAL - Invalid parameter passed. + * EOTHER - 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..448dbdfcfd 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 = EOTHER; 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 = EOTHER; 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 = EOTHER; return -1; } return 0; diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c index 2e2ab29177..d42f2cf62a 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 = EOTHER; 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 = EOTHER; 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 = EOTHER; return -1; } return 0; @@ -76,7 +82,7 @@ rte_thread_tls_value_get(rte_tls_key key) output = TlsGetValue(key->thread_index); if (GetLastError() != ERROR_SUCCESS) { RTE_LOG_WIN32_ERR("TlsGetValue()"); - rte_errno = ENOEXEC; + rte_errno = EOTHER; return NULL; } return output; From patchwork Wed Mar 10 12:06:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tal Shnaiderman X-Patchwork-Id: 88827 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 2467EA0567; Wed, 10 Mar 2021 13:08:17 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9D0CF4068C; Wed, 10 Mar 2021 13:08:16 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by mails.dpdk.org (Postfix) with ESMTP id D798F40687 for ; Wed, 10 Mar 2021 13:08:14 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from talshn@nvidia.com) with SMTP; 10 Mar 2021 14:08:12 +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 12AC8BlH026451; Wed, 10 Mar 2021 14:08:12 +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: Wed, 10 Mar 2021 14:06:32 +0200 Message-Id: <20210310120632.14464-3-talshn@nvidia.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20210310120632.14464-1-talshn@nvidia.com> References: <20210302152658.9136-2-talshn@nvidia.com> <20210310120632.14464-1-talshn@nvidia.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v3 2/2] eal: rename key opaque pointer and functions in 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" rename the key opaque pointer from rte_tls_key to rte_thread_key to avoid confusion with transport layer security. Also rename and remove the "_tls" term from the following functions to avoid redundancy: rte_thread_tls_key_create rte_thread_tls_key_delete rte_thread_tls_value_set rte_thread_tls_value_get Suggested-by: Vladimir Medvedkin Suggested-by: Morten Brørup Signed-off-by: Tal Shnaiderman Acked-by: Morten Brørup --- drivers/net/mlx5/linux/mlx5_flow_os.c | 10 +++++----- drivers/net/mlx5/windows/mlx5_flow_os.c | 12 ++++++------ lib/librte_eal/include/rte_thread.h | 19 ++++++++++--------- lib/librte_eal/rte_eal_exports.def | 8 ++++---- lib/librte_eal/unix/rte_thread.c | 8 ++++---- lib/librte_eal/version.map | 8 ++++---- lib/librte_eal/windows/rte_thread.c | 8 ++++---- 7 files changed, 37 insertions(+), 36 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_flow_os.c b/drivers/net/mlx5/linux/mlx5_flow_os.c index 732b1b2dd8..893f00b824 100644 --- a/drivers/net/mlx5/linux/mlx5_flow_os.c +++ b/drivers/net/mlx5/linux/mlx5_flow_os.c @@ -7,12 +7,12 @@ #include /* Key of thread specific flow workspace data. */ -static rte_tls_key key_workspace; +static rte_thread_key key_workspace; int mlx5_flow_os_init_workspace_once(void) { - if (rte_thread_tls_key_create(&key_workspace, flow_release_workspace)) { + if (rte_thread_key_create(&key_workspace, flow_release_workspace)) { DRV_LOG(ERR, "Can't create flow workspace data thread key."); return -ENOMEM; } @@ -22,17 +22,17 @@ mlx5_flow_os_init_workspace_once(void) void * mlx5_flow_os_get_specific_workspace(void) { - return rte_thread_tls_value_get(key_workspace); + return rte_thread_value_get(key_workspace); } int mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data) { - return rte_thread_tls_value_set(key_workspace, data); + return rte_thread_value_set(key_workspace, data); } void mlx5_flow_os_release_workspace(void) { - rte_thread_tls_key_delete(key_workspace); + rte_thread_key_delete(key_workspace); } diff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c index 2cc02df322..c4d5790726 100644 --- a/drivers/net/mlx5/windows/mlx5_flow_os.c +++ b/drivers/net/mlx5/windows/mlx5_flow_os.c @@ -252,7 +252,7 @@ struct mlx5_workspace_thread { */ static struct mlx5_workspace_thread *curr; static struct mlx5_workspace_thread *first; -rte_tls_key ws_tls_index; +rte_thread_key ws_tls_index; static pthread_mutex_t lock_thread_list; static bool @@ -329,7 +329,7 @@ mlx5_flow_os_release_workspace(void) flow_release_workspace(first->mlx5_ws); free(first); } - rte_thread_tls_key_delete(ws_tls_index); + rte_thread_key_delete(ws_tls_index); pthread_mutex_destroy(&lock_thread_list); } @@ -368,7 +368,7 @@ mlx5_add_workspace_to_list(struct mlx5_flow_workspace *data) int mlx5_flow_os_init_workspace_once(void) { - int err = rte_thread_tls_key_create(&ws_tls_index, NULL); + int err = rte_thread_key_create(&ws_tls_index, NULL); if (err) { DRV_LOG(ERR, "Can't create flow workspace data thread key."); @@ -381,7 +381,7 @@ mlx5_flow_os_init_workspace_once(void) void * mlx5_flow_os_get_specific_workspace(void) { - return rte_thread_tls_value_get(ws_tls_index); + return rte_thread_value_get(ws_tls_index); } int @@ -391,7 +391,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data) int old_err = rte_errno; rte_errno = 0; - if (!rte_thread_tls_value_get(ws_tls_index)) { + if (!rte_thread_value_get(ws_tls_index)) { if (rte_errno) { DRV_LOG(ERR, "Failed checking specific workspace."); rte_errno = old_err; @@ -409,7 +409,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data) return -1; } } - if (rte_thread_tls_value_set(ws_tls_index, data)) { + if (rte_thread_value_set(ws_tls_index, data)) { DRV_LOG(ERR, "Failed setting specific workspace."); err = -1; } diff --git a/lib/librte_eal/include/rte_thread.h b/lib/librte_eal/include/rte_thread.h index 8969b5d645..5fcccbce60 100644 --- a/lib/librte_eal/include/rte_thread.h +++ b/lib/librte_eal/include/rte_thread.h @@ -23,7 +23,7 @@ extern "C" { /** * TLS key type, an opaque pointer. */ -typedef struct eal_tls_key *rte_tls_key; +typedef struct eal_tls_key *rte_thread_key; /** * Set core affinity of the current thread. @@ -65,13 +65,14 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); */ __rte_experimental -int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)); +int rte_thread_key_create(rte_thread_key *key, + void (*destructor)(void *)); /** * Delete a TLS data key visible to all threads in the process. * * @param key - * The key allocated by rte_thread_tls_key_create(). + * The key allocated by rte_thread_key_create(). * * @return * On success, zero. @@ -80,15 +81,15 @@ int rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)); * EOTHER - Specific OS error. */ __rte_experimental -int rte_thread_tls_key_delete(rte_tls_key key); +int rte_thread_key_delete(rte_thread_key key); /** * Set value bound to the TLS key on behalf of the calling thread. * * @param key - * The key allocated by rte_thread_tls_key_create(). + * The key allocated by rte_thread_key_create(). * @param value - * The value bound to the rte_tls_key key for the calling thread. + * The value bound to the rte_thread_key key for the calling thread. * * @return * On success, zero. @@ -97,13 +98,13 @@ int rte_thread_tls_key_delete(rte_tls_key key); * EOTHER - Specific OS error. */ __rte_experimental -int rte_thread_tls_value_set(rte_tls_key key, const void *value); +int rte_thread_value_set(rte_thread_key key, const void *value); /** * Get value bound to the TLS key on behalf of the calling thread. * * @param key - * The key allocated by rte_thread_tls_key_create(). + * The key allocated by rte_thread_key_create(). * * @return * On success, value data pointer (can also be NULL). @@ -112,7 +113,7 @@ int rte_thread_tls_value_set(rte_tls_key key, const void *value); * EOTHER - Specific OS error. */ __rte_experimental -void *rte_thread_tls_value_get(rte_tls_key key); +void *rte_thread_value_get(rte_thread_key key); #ifdef __cplusplus } diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def index 474cf123fa..c320077547 100644 --- a/lib/librte_eal/rte_eal_exports.def +++ b/lib/librte_eal/rte_eal_exports.def @@ -325,10 +325,10 @@ EXPORTS rte_vect_get_max_simd_bitwidth rte_vect_set_max_simd_bitwidth - rte_thread_tls_key_create - rte_thread_tls_key_delete - rte_thread_tls_value_get - rte_thread_tls_value_set + rte_thread_key_create + rte_thread_key_delete + rte_thread_value_get + rte_thread_value_set rte_mem_lock rte_mem_map diff --git a/lib/librte_eal/unix/rte_thread.c b/lib/librte_eal/unix/rte_thread.c index 448dbdfcfd..cee3c131c0 100644 --- a/lib/librte_eal/unix/rte_thread.c +++ b/lib/librte_eal/unix/rte_thread.c @@ -17,7 +17,7 @@ struct eal_tls_key { }; int -rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) +rte_thread_key_create(rte_thread_key *key, void (*destructor)(void *)) { int err; @@ -39,7 +39,7 @@ rte_thread_tls_key_create(rte_tls_key *key, void (*destructor)(void *)) } int -rte_thread_tls_key_delete(rte_tls_key key) +rte_thread_key_delete(rte_thread_key key) { int err; @@ -61,7 +61,7 @@ rte_thread_tls_key_delete(rte_tls_key key) } int -rte_thread_tls_value_set(rte_tls_key key, const void *value) +rte_thread_value_set(rte_thread_key key, const void *value) { int err; @@ -81,7 +81,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) } void * -rte_thread_tls_value_get(rte_tls_key key) +rte_thread_value_get(rte_thread_key key) { if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map index fce90a112f..c07aab176c 100644 --- a/lib/librte_eal/version.map +++ b/lib/librte_eal/version.map @@ -408,10 +408,10 @@ EXPERIMENTAL { rte_power_monitor; rte_power_monitor_wakeup; rte_power_pause; - rte_thread_tls_key_create; - rte_thread_tls_key_delete; - rte_thread_tls_value_get; - rte_thread_tls_value_set; + rte_thread_key_create; + rte_thread_key_delete; + rte_thread_value_get; + rte_thread_value_set; }; INTERNAL { diff --git a/lib/librte_eal/windows/rte_thread.c b/lib/librte_eal/windows/rte_thread.c index d42f2cf62a..f5ee70e780 100644 --- a/lib/librte_eal/windows/rte_thread.c +++ b/lib/librte_eal/windows/rte_thread.c @@ -12,7 +12,7 @@ struct eal_tls_key { }; int -rte_thread_tls_key_create(rte_tls_key *key, +rte_thread_key_create(rte_thread_key *key, __rte_unused void (*destructor)(void *)) { *key = malloc(sizeof(**key)); @@ -32,7 +32,7 @@ rte_thread_tls_key_create(rte_tls_key *key, } int -rte_thread_tls_key_delete(rte_tls_key key) +rte_thread_key_delete(rte_thread_key key) { if (!key) { RTE_LOG(DEBUG, EAL, "Invalid TLS key.\n"); @@ -50,7 +50,7 @@ rte_thread_tls_key_delete(rte_tls_key key) } int -rte_thread_tls_value_set(rte_tls_key key, const void *value) +rte_thread_value_set(rte_thread_key key, const void *value) { char *p; @@ -70,7 +70,7 @@ rte_thread_tls_value_set(rte_tls_key key, const void *value) } void * -rte_thread_tls_value_get(rte_tls_key key) +rte_thread_value_get(rte_thread_key key) { void *output;