From patchwork Thu Aug 17 04:28:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sinan Kaya X-Patchwork-Id: 130456 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 6D0164308A; Thu, 17 Aug 2023 06:29:16 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D062C43273; Thu, 17 Aug 2023 06:28:35 +0200 (CEST) Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mails.dpdk.org (Postfix) with ESMTP id 9AEB543260 for ; Thu, 17 Aug 2023 06:28:29 +0200 (CEST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2A50162E32 for ; Thu, 17 Aug 2023 04:28:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 45063C433C8; Thu, 17 Aug 2023 04:28:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692246508; bh=GzdZY5BWZC5AIM3DNvKug6teVg99pRVvPOQuNBaih7w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZGyO4JkhhVydO9gEtKXYMLr8lq+Y4VIkrL5UzFTK0wz6U/zuYhRjZrNbulEYzHe/W KuzITpAc4+sL9XFSC12fEPPAN3a0c0N8dK0lfWBEMCW9gujwLCX9lH0sMWdvHBJXct 5UT4oTwmDBSEwS2DQkF7MLGAz7r5bPWypU/zlfKo0U2bAAvjzvYpXeC2vgANqpteEU 3xSOu7lr2sdQH+qjSfjvCOryHI66vExFEHCzvHI8mHGftnLhNsov5r9wN+BGQv2Or8 sIzEf+4kyAFauZ9FP7YPbaJAiyhoGQz5Crga8AJwOt9tbT73mZiEP3QLdUh31f8OEZ VJTwjeJqOWp3Q== From: okaya@kernel.org To: Cc: dev@dpdk.org, Sinan Kaya Subject: [PATCH v5 08/10] eal: initialize worker threads once Date: Thu, 17 Aug 2023 00:28:19 -0400 Message-Id: <20230817042820.137957-9-okaya@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230817042820.137957-1-okaya@kernel.org> References: <20230817042820.137957-1-okaya@kernel.org> 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 From: Sinan Kaya Initialize worker threads once and keep a flag for other init calls. Signed-off-by: Sinan Kaya --- lib/eal/linux/eal.c | 60 ++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 584c78e640..1305e1df54 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -80,6 +80,7 @@ int rte_cycles_vmware_tsc_map; static uint32_t run_once; +static bool worker_initialized; int eal_clean_runtime_dir(void) @@ -1254,42 +1255,45 @@ rte_eal_init(int argc, char **argv) config->main_lcore, (uintptr_t)pthread_self(), cpuset, ret == 0 ? "" : "..."); - RTE_LCORE_FOREACH_WORKER(i) { + if (worker_initialized == false) { + RTE_LCORE_FOREACH_WORKER(i) { /* * create communication pipes between main thread * and children */ - if (pipe(lcore_config[i].pipe_main2worker) < 0) - rte_panic("Cannot create pipe\n"); - if (pipe(lcore_config[i].pipe_worker2main) < 0) - rte_panic("Cannot create pipe\n"); - - lcore_config[i].state = WAIT; - - /* create a thread for each lcore */ - ret = eal_worker_thread_create(i); - if (ret != 0) - rte_panic("Cannot create thread\n"); - - /* Set thread_name for aid in debugging. */ - snprintf(thread_name, sizeof(thread_name), - "rte-worker-%d", i); - rte_thread_set_name(lcore_config[i].thread_id, thread_name); + if (pipe(lcore_config[i].pipe_main2worker) < 0) + rte_panic("Cannot create pipe\n"); + if (pipe(lcore_config[i].pipe_worker2main) < 0) + rte_panic("Cannot create pipe\n"); + + lcore_config[i].state = WAIT; + + /* create a thread for each lcore */ + ret = eal_worker_thread_create(i); + if (ret != 0) + rte_panic("Cannot create thread\n"); + + /* Set thread_name for aid in debugging. */ + snprintf(thread_name, sizeof(thread_name), + "rte-worker-%d", i); + rte_thread_set_name(lcore_config[i].thread_id, thread_name); + + ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id, + &lcore_config[i].cpuset); + if (ret != 0) + rte_panic("Cannot set affinity\n"); + } - ret = rte_thread_set_affinity_by_id(lcore_config[i].thread_id, - &lcore_config[i].cpuset); - if (ret != 0) - rte_panic("Cannot set affinity\n"); + /* + * Launch a dummy function on all worker lcores, so that main lcore + * knows they are all ready when this function returns. + */ + rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MAIN); + rte_eal_mp_wait_lcore(); + worker_initialized = true; } - /* - * Launch a dummy function on all worker lcores, so that main lcore - * knows they are all ready when this function returns. - */ - rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MAIN); - rte_eal_mp_wait_lcore(); - /* initialize services so vdevs register service during bus_probe. */ ret = rte_service_init(); if (ret) {