From patchwork Wed Sep 13 10:34:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 131385 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 A8AB542589; Wed, 13 Sep 2023 12:38:16 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2827740A89; Wed, 13 Sep 2023 12:38:07 +0200 (CEST) Received: from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com [64.147.123.21]) by mails.dpdk.org (Postfix) with ESMTP id 7092F40A7A for ; Wed, 13 Sep 2023 12:38:05 +0200 (CEST) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.west.internal (Postfix) with ESMTP id AAD483200805; Wed, 13 Sep 2023 06:38:03 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Wed, 13 Sep 2023 06:38:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to; s=fm2; t= 1694601483; x=1694687883; bh=168jX+opV7QFZxlQju1Kt6n1F9xG/ZGzZOi hmwVq0vA=; b=cFs0JmXfWgTEa4AK1B6qS+gdUH+g7+gopMyxA5EulMBfkTr/LNW i3kHYh60zZnARorAEi8j3eAtTpd/kwNuiP36/zSnuUM9fLfK8yYH3UJfwzubNVcd EzzDhFEwDhgH6tnME3lgu6hURrE/7TtpSjO789e7/uFrpWJYgGsT5B1879EXIBbz 14PS6JJomtm3TdHCFiJrECew/BZu9SZsIeYLTunf/a4iB+Y2O4zaBk0BQ0WhToQg 9f4DiYyP8Zkxqq4z8AYeLKwZ1SWeraiOBG7CnDwBMr8+KoodMqh7ocbDhq7GOGCk /9oIEu6Aj2i1Xn/IJ9gCC3bMv4X6WjN7CWg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1694601483; x=1694687883; bh=168jX+opV7QFZxlQju1Kt6n1F9xG/ZGzZOi hmwVq0vA=; b=X3oBpCGIz2XNl5zSzHOHyNaWQ2wxB8MCMCJ0ZMmeEYhzSgqYsrY 5mCJiF0rp05FN0wSa73p15qmeEmUuKI14YOwWmjlzJ3oeFMWEadI4Llnz9Peb+1R c6ld4R8C16gkWui9p92kVMGoFMg7Dl8Vx4/qDABpGfJC6eMUhtUz+FGKlSQ9Ofz6 PiPwlF0B9L4ygayR253YXkOiMjos4gRho3byVLqj2GvszTIvx7YdCSUfBYI2DsIR YssCtKLg03NOIWUNWhUaJ9WpAn7EzHoTLo199qcbPmMYZ7M0qh69VaBA/UcbVf13 Q+kRwRZ8baypfQwmZrg6vwT+tAa6ZI0EjPA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedviedrudeikedgvdelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpefvhhho mhgrshcuofhonhhjrghlohhnuceothhhohhmrghssehmohhnjhgrlhhonhdrnhgvtheqne cuggftrfgrthhtvghrnheptdeiffffgeefteelhfekueetueduffejgfelvedtieejudek gfevheetheehgeejnecuvehluhhsthgvrhfuihiivgepheenucfrrghrrghmpehmrghilh hfrhhomhepthhhohhmrghssehmohhnjhgrlhhonhdrnhgvth X-ME-Proxy: Feedback-ID: i47234305:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 13 Sep 2023 06:38:01 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: Tyler Retzlaff , David Marchand , Ferruh Yigit , =?utf-8?q?Morten_Br=C3=B8rup?= , Anatoly Burakov , Bruce Richardson , Dmitry Kozlyuk , Narcisa Ana Maria Vasile , Dmitry Malloy , Pallavi Kadam Subject: [PATCH v2 10/11] eal: remove deprecated thread functions Date: Wed, 13 Sep 2023 12:34:29 +0200 Message-ID: <20230913103600.1935292-11-thomas@monjalon.net> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230913103600.1935292-1-thomas@monjalon.net> References: <20230906162226.1618088-1-thomas@monjalon.net> <20230913103600.1935292-1-thomas@monjalon.net> 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 The deprecated functions rte_thread_setname() and rte_ctrl_thread_create() are replaced with the new rte_thread API: rte_thread_setname() can be replaced with rte_thread_set_name() or rte_thread_set_prefixed_name() rte_ctrl_thread_create() can be replaced with rte_thread_create_control() or rte_thread_create_internal_control() Signed-off-by: Thomas Monjalon Acked-by: Morten Brørup Acked-by: Tyler Retzlaff --- v2: clean control thread params struct --- .../prog_guide/env_abstraction_layer.rst | 2 +- doc/guides/rel_notes/deprecation.rst | 5 - doc/guides/rel_notes/release_23_11.rst | 4 +- lib/eal/common/eal_common_thread.c | 93 +++---------------- lib/eal/freebsd/eal_thread.c | 7 -- lib/eal/include/rte_lcore.h | 42 --------- lib/eal/linux/eal_thread.c | 16 ---- lib/eal/version.map | 2 - lib/eal/windows/eal_thread.c | 8 -- 9 files changed, 18 insertions(+), 161 deletions(-) diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst index 89014789de..6debf54efb 100644 --- a/doc/guides/prog_guide/env_abstraction_layer.rst +++ b/doc/guides/prog_guide/env_abstraction_layer.rst @@ -756,7 +756,7 @@ Control Thread API ~~~~~~~~~~~~~~~~~~ It is possible to create Control Threads using the public API -``rte_ctrl_thread_create()``. +``rte_thread_create_control()``. Those threads can be used for management/infrastructure tasks and are used internally by DPDK for multi process support and interrupt handling. diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 3e48908b51..8c8873006d 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -29,11 +29,6 @@ Deprecation Notices are renamed to ``rte_tel_data_add_array_uint`` and ``rte_tel_data_add_dict_uint`` respectively. As such, the old function names are deprecated and will be removed in a future release. -* eal: The functions ``rte_thread_setname`` and ``rte_ctrl_thread_create`` - are planned to be deprecated starting with the 23.07 release, subject to - the replacement API rte_thread_set_name and rte_thread_create_control being - marked as stable, and planned to be removed by the 23.11 release. - * eal: ``RTE_CPUFLAG_NUMFLAGS`` will be removed in DPDK 23.11 release. This is to allow new CPU features to be added without ABI breakage. diff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst index d7562fd646..9746809a66 100644 --- a/doc/guides/rel_notes/release_23_11.rst +++ b/doc/guides/rel_notes/release_23_11.rst @@ -115,7 +115,9 @@ API Changes * eal: The thread API has changed. The function ``rte_thread_create_control()`` does not take attributes anymore. - The whole thread API was promoted to stable level. + The whole thread API was promoted to stable level, + except ``rte_thread_setname()`` and ``rte_ctrl_thread_create()`` which are + replaced with ``rte_thread_set_name()`` and ``rte_thread_create_control()``. ABI Changes diff --git a/lib/eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c index cd6e00fe8a..a71142662a 100644 --- a/lib/eal/common/eal_common_thread.c +++ b/lib/eal/common/eal_common_thread.c @@ -235,25 +235,22 @@ enum __rte_ctrl_thread_status { CTRL_THREAD_ERROR /* Control thread encountered an error */ }; -struct rte_thread_ctrl_params { - union { - void *(*ctrl_start_routine)(void *arg); - rte_thread_func control_start_routine; - } u; +struct control_thread_params { + rte_thread_func start_routine; void *arg; int ret; /* Control thread status. * If the status is CTRL_THREAD_ERROR, 'ret' has the error code. */ - enum __rte_ctrl_thread_status ctrl_thread_status; + enum __rte_ctrl_thread_status status; }; -static int ctrl_thread_init(void *arg) +static int control_thread_init(void *arg) { struct internal_config *internal_conf = eal_get_internal_configuration(); rte_cpuset_t *cpuset = &internal_conf->ctrl_cpuset; - struct rte_thread_ctrl_params *params = arg; + struct control_thread_params *params = arg; __rte_thread_init(rte_lcore_id(), cpuset); /* Set control thread socket ID to SOCKET_ID_ANY @@ -262,96 +259,34 @@ static int ctrl_thread_init(void *arg) RTE_PER_LCORE(_socket_id) = SOCKET_ID_ANY; params->ret = rte_thread_set_affinity_by_id(rte_thread_self(), cpuset); if (params->ret != 0) { - __atomic_store_n(¶ms->ctrl_thread_status, + __atomic_store_n(¶ms->status, CTRL_THREAD_ERROR, __ATOMIC_RELEASE); return 1; } - __atomic_store_n(¶ms->ctrl_thread_status, + __atomic_store_n(¶ms->status, CTRL_THREAD_RUNNING, __ATOMIC_RELEASE); return 0; } -static void *ctrl_thread_start(void *arg) -{ - struct rte_thread_ctrl_params *params = arg; - void *start_arg = params->arg; - void *(*start_routine)(void *) = params->u.ctrl_start_routine; - - if (ctrl_thread_init(arg) != 0) - return NULL; - - return start_routine(start_arg); -} - static uint32_t control_thread_start(void *arg) { - struct rte_thread_ctrl_params *params = arg; + struct control_thread_params *params = arg; void *start_arg = params->arg; - rte_thread_func start_routine = params->u.control_start_routine; + rte_thread_func start_routine = params->start_routine; - if (ctrl_thread_init(arg) != 0) + if (control_thread_init(arg) != 0) return 0; return start_routine(start_arg); } -int -rte_ctrl_thread_create(pthread_t *thread, const char *name, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg) -{ - struct rte_thread_ctrl_params *params; - enum __rte_ctrl_thread_status ctrl_thread_status; - int ret; - - params = malloc(sizeof(*params)); - if (!params) - return -ENOMEM; - - params->u.ctrl_start_routine = start_routine; - params->arg = arg; - params->ret = 0; - params->ctrl_thread_status = CTRL_THREAD_LAUNCHING; - - ret = pthread_create(thread, attr, ctrl_thread_start, (void *)params); - if (ret != 0) { - free(params); - return -ret; - } - - 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 = - __atomic_load_n(¶ms->ctrl_thread_status, - __ATOMIC_ACQUIRE)) == CTRL_THREAD_LAUNCHING) { - /* Yield the CPU. Using sched_yield call requires maintaining - * another implementation for Windows as sched_yield is not - * supported on Windows. - */ - rte_delay_us_sleep(1); - } - - /* Check if the control thread encountered an error */ - if (ctrl_thread_status == CTRL_THREAD_ERROR) { - /* ctrl thread is exiting */ - rte_thread_join((rte_thread_t){(uintptr_t)*thread}, NULL); - } - - ret = params->ret; - free(params); - - return -ret; -} - int rte_thread_create_control(rte_thread_t *thread, const char *name, rte_thread_func start_routine, void *arg) { - struct rte_thread_ctrl_params *params; + struct control_thread_params *params; enum __rte_ctrl_thread_status ctrl_thread_status; int ret; @@ -359,10 +294,10 @@ rte_thread_create_control(rte_thread_t *thread, const char *name, if (params == NULL) return -ENOMEM; - params->u.control_start_routine = start_routine; + params->start_routine = start_routine; params->arg = arg; params->ret = 0; - params->ctrl_thread_status = CTRL_THREAD_LAUNCHING; + params->status = CTRL_THREAD_LAUNCHING; ret = rte_thread_create(thread, NULL, control_thread_start, params); if (ret != 0) { @@ -375,7 +310,7 @@ rte_thread_create_control(rte_thread_t *thread, const char *name, /* Wait for the control thread to initialize successfully */ while ((ctrl_thread_status = - __atomic_load_n(¶ms->ctrl_thread_status, + __atomic_load_n(¶ms->status, __ATOMIC_ACQUIRE)) == CTRL_THREAD_LAUNCHING) { rte_delay_us_sleep(1); } diff --git a/lib/eal/freebsd/eal_thread.c b/lib/eal/freebsd/eal_thread.c index ba9b25c2c0..6f97a3c2c1 100644 --- a/lib/eal/freebsd/eal_thread.c +++ b/lib/eal/freebsd/eal_thread.c @@ -42,10 +42,3 @@ void rte_thread_set_name(rte_thread_t thread_id, const char *thread_name) 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 */ - pthread_set_name_np(id, name); - return 0; -} diff --git a/lib/eal/include/rte_lcore.h b/lib/eal/include/rte_lcore.h index 6ce810b876..7deae47af3 100644 --- a/lib/eal/include/rte_lcore.h +++ b/lib/eal/include/rte_lcore.h @@ -385,20 +385,6 @@ void rte_lcore_register_usage_cb(rte_lcore_usage_cb cb); void rte_lcore_dump(FILE *f); -/** - * Set thread names. - * - * @note It fails with glibc < 2.12. - * - * @param id - * Thread id. - * @param name - * Thread name to set. - * @return - * On success, return 0; otherwise return a negative value. - */ -int rte_thread_setname(pthread_t id, const char *name); - /** * Register current non-EAL thread as a lcore. * @@ -421,34 +407,6 @@ rte_thread_register(void); void rte_thread_unregister(void); -/** - * Create a control thread. - * - * Creates a control thread with the given name and attributes. The - * affinity of the new thread is based on the CPU affinity retrieved - * at the time rte_eal_init() was called, the dataplane and service - * lcores are then excluded. If setting the name of the thread fails, - * the error is ignored and a debug message is logged. - * - * @param thread - * Filled with the thread id of the new created thread. - * @param name - * The name of the control thread (max 16 characters including '\0'). - * @param attr - * Attributes for the new thread. - * @param start_routine - * Function to be executed by the new thread. - * @param arg - * Argument passed to start_routine. - * @return - * On success, returns 0; on error, it returns a negative value - * corresponding to the error number. - */ -int -rte_ctrl_thread_create(pthread_t *thread, const char *name, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg); - #ifdef __cplusplus } #endif diff --git a/lib/eal/linux/eal_thread.c b/lib/eal/linux/eal_thread.c index b9a126f3a8..880070c627 100644 --- a/lib/eal/linux/eal_thread.c +++ b/lib/eal/linux/eal_thread.c @@ -39,19 +39,3 @@ void rte_thread_set_name(rte_thread_t thread_id, const char *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; -#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) -#if __GLIBC_PREREQ(2, 12) - char truncated[16]; - - strlcpy(truncated, name, sizeof(truncated)); - ret = pthread_setname_np(id, truncated); -#endif -#endif - RTE_SET_USED(id); - RTE_SET_USED(name); - return -ret; -} diff --git a/lib/eal/version.map b/lib/eal/version.map index 6d32c19286..915057b325 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -20,7 +20,6 @@ DPDK_24 { rte_cpu_get_flag_enabled; rte_cpu_get_flag_name; rte_cpu_is_supported; # WINDOWS_NO_EXPORT - rte_ctrl_thread_create; rte_cycles_vmware_tsc_map; # WINDOWS_NO_EXPORT rte_delay_us; rte_delay_us_block; @@ -278,7 +277,6 @@ DPDK_24 { rte_thread_set_affinity_by_id; rte_thread_set_name; rte_thread_set_priority; - rte_thread_setname; rte_thread_unregister; rte_thread_value_get; rte_thread_value_set; diff --git a/lib/eal/windows/eal_thread.c b/lib/eal/windows/eal_thread.c index 464d510838..9e3df200b9 100644 --- a/lib/eal/windows/eal_thread.c +++ b/lib/eal/windows/eal_thread.c @@ -76,11 +76,3 @@ rte_sys_gettid(void) { return GetCurrentThreadId(); } - -int -rte_thread_setname(__rte_unused pthread_t id, __rte_unused const char *name) -{ - /* TODO */ - /* This is a stub, not the expected result */ - return 0; -}