From patchwork Wed Oct 10 14:12:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 46502 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 761DB1B698; Wed, 10 Oct 2018 16:10:07 +0200 (CEST) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id B4FFF1B682 for ; Wed, 10 Oct 2018 16:10:05 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20181010141004euoutp0105bcd8a3614f67ac6e6272eadf24a7cd~cRJrzQyEX2708327083euoutp01c; Wed, 10 Oct 2018 14:10:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20181010141004euoutp0105bcd8a3614f67ac6e6272eadf24a7cd~cRJrzQyEX2708327083euoutp01c DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1539180605; bh=X8CmXXORlfiviaDgBMXkic9YMS6neK1dtBinPRK5QDc=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=PttfUKRrp7KY2qMoTT617AkHvLvPyqgG1KagOPL4esJpt2bdeB9w6DTvnmzijCLrj hucmJ0j/Z8+1ZE0263idOUFpaqY+csZz4XNT1aTYxr1I6CHcrrDLDRT5kiHtn/mdlg b1Nuf3XUAdBALe/t0DtqmTKpF/fClVQBCzeP0ZTk= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181010141004eucas1p15f67c2e76de75f8a199587f1a2eb052d~cRJrZVfGw2011120111eucas1p1L; Wed, 10 Oct 2018 14:10:04 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 8A.18.04294.C380EBB5; Wed, 10 Oct 2018 15:10:04 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20181010141003eucas1p23e7bdfaad8cd676549f1cae42b6a8e40~cRJqldVyD1112711127eucas1p2L; Wed, 10 Oct 2018 14:10:03 +0000 (GMT) X-AuditID: cbfec7f4-835ff700000010c6-5e-5bbe083c7082 Received: from eusync1.samsung.com ( [203.254.199.211]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id C9.DC.04284.B380EBB5; Wed, 10 Oct 2018 15:10:03 +0100 (BST) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0PGD006H4ZCG2A40@eusync1.samsung.com>; Wed, 10 Oct 2018 15:10:03 +0100 (BST) From: Ilya Maximets To: dev@dpdk.org Cc: Jingjing Wu , Konstantin Ananyev , Wenzhuo Lu , Beilei Xing , Qi Zhang , Xiao Wang , Bruce Richardson , Stephen Hemminger , Keith Wiles , Wei Zhao1 , Ilya Maximets Date: Wed, 10 Oct 2018 17:12:19 +0300 Message-id: <20181010141220.26907-2-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-reply-to: <20181010141220.26907-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDIsWRmVeSWpSXmKPExsWy7djPc7o2HPuiDVZ+5LHo/tDCZHFjlb3F u0/bmSyutP9kt5i54DOjxdXj35kt3v9ZxGIxfUM/m8XiO3IWa75eZLbYeuYvo8X+54fZHXg8 fi1YyuqxeM9LJo+ek/OYPPq2rGIMYInisklJzcksSy3St0vgyth3egNrwQvdijdzm1kbGN+r dDFyckgImEg8fH+DuYuRi0NIYAWjxNulZ1ghnM+MEh9vbWOEqZr7aS87RGIZo8SHrsMsEE4z k8TMs3PZQarYBHQkTq0+AtYhIiAg8blzMRtIEbPAfmaJ8ysvMoEkhAXsJS69u8QMYrMIqEps u7gSaB8HB6+AtcTkJToQ2+QlVm84wAwS5hSwkZjySwtkjITACjaJo42zWSBqXCTmbLjPDmEL S7w6vgXKlpHo7DjIBGHXS9xveckI0dzBKDH90D+ohL3EltfnwBqYBfgkJm2bDrZMQoBXoqNN CKLEQ+LJ5L9QHx9klDg96wXrBEbJBYwMqxjFU0uLc9NTi43yUsv1ihNzi0vz0vWS83M3MQLj 9PS/4192MO76k3SIUYCDUYmHt+HCnmgh1sSy4srcQ4wSHMxKIry3Du+NFuJNSaysSi3Kjy8q zUktPsQozcGiJM67bN7GaCGB9MSS1OzU1ILUIpgsEwenVAOjiMOfuRy9RsFZCmeycrP7Hp84 /+xA/lf+xW5z93/8aOQUED7jzecqwdsW8beO7eUQlk2TbPPs9sqd0NGmH958MDbzxDonZYnZ SpP1i6Y91pYuYWCePcX7w7SffEIFUx+q9K+78p7tvxiLd+DXuf8f+N235FYNZ1V/7iNSbKe4 x6yLQSPg9xslluKMREMt5qLiRACpavNYzwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprJLMWRmVeSWpSXmKPExsVy+t/xy7rWHPuiDRb8UbHo/tDCZHFjlb3F u0/bmSyutP9kt5i54DOjxdXj35kt3v9ZxGIxfUM/m8XiO3IWa75eZLbYeuYvo8X+54fZHXg8 fi1YyuqxeM9LJo+ek/OYPPq2rGIMYInisklJzcksSy3St0vgyth3egNrwQvdijdzm1kbGN+r dDFyckgImEjM/bSXvYuRi0NIYAmjxOntyxkhnFYmiR8HJ7KAVLEJ6EicWn2EEcQWERCQ+Ny5 mA2kiFngILPE2idzwBLCAvYSl95dYgaxWQRUJbZdXMnaxcjBwStgLTF5iQ7ENnmJ1RsOMIOE OQVsJKb80gIJCwnkSqy7todxAiPPAkaGVYwiqaXFuem5xYZ6xYm5xaV56XrJ+bmbGIEBtu3Y z807GC9tDD7EKMDBqMTD23BhT7QQa2JZcWXuIUYJDmYlEd5bh/dGC/GmJFZWpRblxxeV5qQW H2KU5mBREuc9b1AZJSSQnliSmp2aWpBaBJNl4uCUamAM2Z3Hmiak/fdzu6RoZtyqw9tbtd/1 yxezGbi8EtB4mD/ntXDZrMNGq6dybPm36+Zei83vdG6cO/n8wUZ+A2eH2wsrX5r+8I78FfT0 ecvCgrXVXzb9WfPx0qLr3CyHjGe9dBO8u/rDz3jOfKGHJtf7W0s85h7Ke7X4/SqrvqrwIo59 K3ieCcu6K7EUZyQaajEXFScCAFaWONcsAgAA X-CMS-MailID: 20181010141003eucas1p23e7bdfaad8cd676549f1cae42b6a8e40 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181010141003eucas1p23e7bdfaad8cd676549f1cae42b6a8e40 References: <20181004143550.23077-1-i.maximets@samsung.com> <20181010141220.26907-1-i.maximets@samsung.com> Subject: [dpdk-dev] [PATCH v4 1/2] eal: add nanosleep based delay function 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" Add a new rte_delay_us_sleep() function that uses nanosleep(). This function can be used by applications to not implement their own nanosleep() based callback and by internal DPDK code if CPU non-blocking delay needed. Signed-off-by: Ilya Maximets --- lib/librte_eal/common/eal_common_timer.c | 24 +++++++++ .../common/include/generic/rte_cycles.h | 11 ++++ lib/librte_eal/rte_eal_version.map | 1 + test/test/autotest_data.py | 6 +++ test/test/meson.build | 1 + test/test/test_cycles.c | 51 ++++++++++++++----- 6 files changed, 80 insertions(+), 14 deletions(-) diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/librte_eal/common/eal_common_timer.c index 2e2b770fb..dcf26bfea 100644 --- a/lib/librte_eal/common/eal_common_timer.c +++ b/lib/librte_eal/common/eal_common_timer.c @@ -7,9 +7,11 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -31,6 +33,28 @@ rte_delay_us_block(unsigned int us) rte_pause(); } +void __rte_experimental +rte_delay_us_sleep(unsigned int us) +{ + struct timespec wait[2]; + int ind = 0; + + wait[0].tv_sec = 0; + if (us >= US_PER_S) { + wait[0].tv_sec = us / US_PER_S; + us -= wait[0].tv_sec * US_PER_S; + } + wait[0].tv_nsec = 1000 * us; + + while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) { + /* + * Sleep was interrupted. Flip the index, so the 'remainder' + * will become the 'request' for a next call. + */ + ind = 1 - ind; + } +} + uint64_t rte_get_tsc_hz(void) { diff --git a/lib/librte_eal/common/include/generic/rte_cycles.h b/lib/librte_eal/common/include/generic/rte_cycles.h index 0ff1af504..ac379e878 100644 --- a/lib/librte_eal/common/include/generic/rte_cycles.h +++ b/lib/librte_eal/common/include/generic/rte_cycles.h @@ -13,6 +13,7 @@ */ #include +#include #include #include @@ -157,6 +158,16 @@ rte_delay_ms(unsigned ms) */ void rte_delay_us_block(unsigned int us); +/** + * Delay function that uses system sleep. + * Does not block the CPU core. + * + * @param us + * Number of microseconds to wait. + */ +void __rte_experimental +rte_delay_us_sleep(unsigned int us); + /** * Replace rte_delay_us with user defined function. * diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 73282bbb0..56a1a0520 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -277,6 +277,7 @@ EXPERIMENTAL { rte_class_register; rte_class_unregister; rte_ctrl_thread_create; + rte_delay_us_sleep; rte_dev_event_callback_register; rte_dev_event_callback_unregister; rte_dev_event_monitor_start; diff --git a/test/test/autotest_data.py b/test/test/autotest_data.py index f68d9b111..874d0cb53 100644 --- a/test/test/autotest_data.py +++ b/test/test/autotest_data.py @@ -278,6 +278,12 @@ "Func": default_autotest, "Report": None, }, + { + "Name": "Sleep delay", + "Command": "delay_us_sleep_autotest", + "Func": default_autotest, + "Report": None, + }, { "Name": "Rawdev autotest", "Command": "rawdev_autotest", diff --git a/test/test/meson.build b/test/test/meson.build index bacb5b144..9eb15d21a 100644 --- a/test/test/meson.build +++ b/test/test/meson.build @@ -147,6 +147,7 @@ test_names = [ 'cryptodev_dpaa_sec_autotest', 'cycles_autotest', 'debug_autotest', + 'delay_us_sleep_autotest', 'devargs_autotest', 'distributor_autotest', 'distributor_perf_autotest', diff --git a/test/test/test_cycles.c b/test/test/test_cycles.c index 149f60b07..c78e6a5b1 100644 --- a/test/test/test_cycles.c +++ b/test/test/test_cycles.c @@ -23,6 +23,30 @@ * of cycles is correct with regard to the frequency of the timer. */ +static int +check_wait_one_second(void) +{ + uint64_t cycles, prev_cycles; + uint64_t hz = rte_get_timer_hz(); + uint64_t max_inc = (hz / 100); /* 10 ms max between 2 reads */ + + /* check that waiting 1 second is precise */ + prev_cycles = rte_get_timer_cycles(); + rte_delay_us(1000000); + cycles = rte_get_timer_cycles(); + + if ((uint64_t)(cycles - prev_cycles) > (hz + max_inc)) { + printf("delay_us is not accurate: too long\n"); + return -1; + } + if ((uint64_t)(cycles - prev_cycles) < (hz - max_inc)) { + printf("delay_us is not accurate: too short\n"); + return -1; + } + + return 0; +} + static int test_cycles(void) { @@ -43,24 +67,23 @@ test_cycles(void) prev_cycles = cycles; } - /* check that waiting 1 second is precise */ - prev_cycles = rte_get_timer_cycles(); - rte_delay_us(1000000); - cycles = rte_get_timer_cycles(); + return check_wait_one_second(); +} - if ((uint64_t)(cycles - prev_cycles) > (hz + max_inc)) { - printf("delay_us is not accurate: too long\n"); - return -1; - } - if ((uint64_t)(cycles - prev_cycles) < (hz - max_inc)) { - printf("delay_us is not accurate: too short\n"); - return -1; - } +REGISTER_TEST_COMMAND(cycles_autotest, test_cycles); - return 0; +/* + * One second precision test with rte_delay_us_sleep. + */ + +static int +test_delay_us_sleep(void) +{ + rte_delay_us_callback_register(rte_delay_us_sleep); + return check_wait_one_second(); } -REGISTER_TEST_COMMAND(cycles_autotest, test_cycles); +REGISTER_TEST_COMMAND(delay_us_sleep_autotest, test_delay_us_sleep); /* * rte_delay_us_callback test