From patchwork Wed Sep 13 11:28:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 131396 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 8043242588; Wed, 13 Sep 2023 13:46:11 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 37BDF40A76; Wed, 13 Sep 2023 13:46:08 +0200 (CEST) Received: from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com [64.147.123.21]) by mails.dpdk.org (Postfix) with ESMTP id 1714140A73 for ; Wed, 13 Sep 2023 13:46:06 +0200 (CEST) Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 3CE13320089C; Wed, 13 Sep 2023 07:46:04 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Wed, 13 Sep 2023 07:46:05 -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= 1694605563; x=1694691963; bh=ykJ7Jc1rH/sYRZK/B1po32no8K1dVbl7Dvi 4J4W50vw=; b=Nx0lgR+Jm5PJB3kDhwRf+Zb/TeNv3hlVE/x7jRKGAhpE7vQAxXL BzMUIjw8Pfu1aNCopjjF30kVyCnt9JlJPpqsTMMkrCEuFNhsPUhGuEUiXRhV+QyA 29gQ777bVlyLuJouDz9J7qt2p13UyZ6wg2NSVRgTPID+mQv6aDVfH4AUp3w4fbvW ScLl4IiAK3u+zQXdNIJUCmfIjE51n53XOW7k58QuUc7hWBdyjCCiqX7qrHWmF8K4 B79wpk4KfOdUwLiE/3LKnpBYtmJYphIYa38ixnWAApF7mXlOPLnphlCKBgRk2Ltu a4u7Hd8yW/WwNAIFEWrc1Psx2+JgJjAtHCA== 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= 1694605563; x=1694691963; bh=ykJ7Jc1rH/sYRZK/B1po32no8K1dVbl7Dvi 4J4W50vw=; b=UgPYYATCTptB5sD8k9miuMtYAk6jBotLhzs2eO+z1AbPbd7W6uP g4QV1aJ8Iz0lvhiTNb19NL7y50oQLh2d69ZLDuYl/xAk9X7+D2JGzlF63alJrtUX cLTLLA+HOG8y2uVX7a0oUnBsrl0jtSHof+uf7vjCr9NptPySINYG44EOJzxTCLN+ ANK9gQOjnuWuMULiZshX71HyU313ZCikYpHqBdw/DeGCoyXDkt1KiQQ5I/EuS9Ez F+5OoQWgRpzLymbIz5bt2JVCNArQ2ovtzEQwei5LaJuHaMFRlsOSRLQptjyxBY5t qicIv7T3MELuuZKQw/NyFc6e9SGdKKDz5bA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedviedrudeikedggeegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvvefufffkofgjfhggtgfgsehtkeertdertdejnecuhfhrohhmpefvhhho mhgrshcuofhonhhjrghlohhnuceothhhohhmrghssehmohhnjhgrlhhonhdrnhgvtheqne cuggftrfgrthhtvghrnheptdeiffffgeefteelhfekueetueduffejgfelvedtieejudek gfevheetheehgeejnecuvehluhhsthgvrhfuihiivgepvdenucfrrghrrghmpehmrghilh hfrhhomhepthhhohhmrghssehmohhnjhgrlhhonhdrnhgvth X-ME-Proxy: Feedback-ID: i47234305:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 13 Sep 2023 07:46:02 -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 v3 10/11] eal: remove deprecated thread functions Date: Wed, 13 Sep 2023 13:28:23 +0200 Message-ID: <20230913114351.1940459-11-thomas@monjalon.net> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230913114351.1940459-1-thomas@monjalon.net> References: <20230906162226.1618088-1-thomas@monjalon.net> <20230913114351.1940459-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 830273813f..668b1ed96b 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; -}