From patchwork Thu Oct 11 19:57:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ferruh Yigit X-Patchwork-Id: 46655 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 83D0E1B54A; Thu, 11 Oct 2018 21:02:49 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 3D92B1B546 for ; Thu, 11 Oct 2018 21:02:48 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Oct 2018 12:02:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,369,1534834800"; d="scan'208";a="96723623" Received: from silpixa00399752.ir.intel.com (HELO silpixa00399752.ger.corp.intel.com) ([10.237.222.212]) by fmsmga004.fm.intel.com with ESMTP; 11 Oct 2018 11:58:08 -0700 From: Ferruh Yigit To: Cc: dev@dpdk.org, Ferruh Yigit Date: Thu, 11 Oct 2018 20:57:52 +0100 Message-Id: <20181011195753.4778-1-ferruh.yigit@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [dpdk-dev] [PATCH 1/2] eal: add API that sleeps while waiting for threads X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" It is common that sample applications call rte_eal_wait_lcore() while waiting for worker threads to be terminated. Mostly master lcore keeps waiting in this function. The waiting app for termination is not a time critical task, app can prefer a sleep version of the waiting to consume less cycles. A sleeping version of the API, rte_eal_wait_lcore_sleep(), has been added which gets sleeping interval as parameter. Sample applications will be updated later to use this API. Signed-off-by: Ferruh Yigit --- lib/librte_eal/common/eal_common_launch.c | 22 ++++++++++++++++++ lib/librte_eal/common/include/rte_launch.h | 27 ++++++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 50 insertions(+) diff --git a/lib/librte_eal/common/eal_common_launch.c b/lib/librte_eal/common/eal_common_launch.c index fe0ba3f0d..e804c70c3 100644 --- a/lib/librte_eal/common/eal_common_launch.c +++ b/lib/librte_eal/common/eal_common_launch.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,27 @@ rte_eal_wait_lcore(unsigned slave_id) return lcore_config[slave_id].ret; } +/* + * Wait until a lcore finished its job by sleeping. + * Sleep time will be times of 'usec' + */ +int +rte_eal_wait_lcore_sleep(unsigned slave_id, size_t usec) +{ + if (lcore_config[slave_id].state == WAIT) + return 0; + + while (lcore_config[slave_id].state != WAIT && + lcore_config[slave_id].state != FINISHED) + usleep(usec); + + rte_rmb(); + + /* we are in finished state, go to wait state */ + lcore_config[slave_id].state = WAIT; + return lcore_config[slave_id].ret; +} + /* * Check that every SLAVE lcores are in WAIT state, then call * rte_eal_remote_launch() for all of them. If call_master is true diff --git a/lib/librte_eal/common/include/rte_launch.h b/lib/librte_eal/common/include/rte_launch.h index 06a671752..a935fd8b5 100644 --- a/lib/librte_eal/common/include/rte_launch.h +++ b/lib/librte_eal/common/include/rte_launch.h @@ -11,6 +11,8 @@ * Launch tasks on other lcores */ +#include + #ifdef __cplusplus extern "C" { #endif @@ -129,6 +131,31 @@ enum rte_lcore_state_t rte_eal_get_lcore_state(unsigned slave_id); */ int rte_eal_wait_lcore(unsigned slave_id); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Wait until an lcore finishes its job. + * + * To be executed on the MASTER lcore only. + * + * Same as rte_eal_wait_lcore() but sleeps instead of busy wait. + * + * @param slave_id + * The identifier of the lcore. + * @param usec + * The sleep interval in microseconds + * @return + * - 0: If the lcore identified by the slave_id is in a WAIT state. + * - The value that was returned by the previous remote launch + * function call if the lcore identified by the slave_id was in a + * FINISHED or RUNNING state. In this case, it changes the state + * of the lcore to WAIT. + */ +__rte_experimental int +rte_eal_wait_lcore_sleep(unsigned slave_id, size_t usec); + /** * Wait until all lcores finish their jobs. * diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index e968edc2e..6c636a65d 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -292,6 +292,7 @@ EXPERIMENTAL { rte_devargs_remove; rte_devargs_type_count; rte_eal_cleanup; + rte_eal_wait_lcore_sleep; rte_fbarray_attach; rte_fbarray_destroy; rte_fbarray_detach;