From patchwork Tue Jul 19 12:42:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: jozmarti@cisco.com X-Patchwork-Id: 14897 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id A4D1C2B9A; Tue, 19 Jul 2016 14:42:27 +0200 (CEST) Received: from aer-iport-3.cisco.com (aer-iport-3.cisco.com [173.38.203.53]) by dpdk.org (Postfix) with ESMTP id 1EC462B86 for ; Tue, 19 Jul 2016 14:42:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3578; q=dns/txt; s=iport; t=1468932146; x=1470141746; h=from:to:cc:subject:date:message-id; bh=A/RPZT91hq0F/aEgi++lp3GjwlxWKhDRbycPadTBc6I=; b=NozXUU0CyicU7yEucie4Id44yONaQocXKb0IiEv56ocKPoBTq5sJKv37 A4iLc4V/Af8rinFUzlBHlzwJGtD9JjnFygDVSq2wXo1YbZzW80qZR0PwY fiKmXSEsfdIE5iiiC13wkb8jrDXJ5brsunTrH9hczxild0AmF2sz5ei+i A=; X-IronPort-AV: E=Sophos;i="5.28,389,1464652800"; d="scan'208";a="636819980" Received: from aer-iport-nat.cisco.com (HELO aer-core-1.cisco.com) ([173.38.203.22]) by aer-iport-3.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jul 2016 12:42:25 +0000 Received: from localhost.localdomain ([10.61.201.239]) by aer-core-1.cisco.com (8.14.5/8.14.5) with ESMTP id u6JCgPrI003094; Tue, 19 Jul 2016 12:42:25 GMT From: jozmarti@cisco.com To: dev@dpdk.org Cc: Jozef Martiniak Date: Tue, 19 Jul 2016 14:42:23 +0200 Message-Id: <1468932143-9321-1-git-send-email-jozmarti@cisco.com> X-Mailer: git-send-email 2.1.4 Subject: [dpdk-dev] [PATCH] rte_delay_us can be replaced with user function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Jozef Martiniak when running single-core, some drivers tend to call rte_delay_us for a long time, and that is causing packet drops. Attached patch introduces 2 new functions: void rte_delay_us_callback_register(void(*userfunc)(unsigned)); void rte_delay_us_callback_unregister(void); First one replaces rte_delay_us with userfunc and second one restores original rte_delay_us. Test user_delay_us is included. Signed-off-by: Jozef Martiniak --- app/test/test_cycles.c | 39 ++++++++++++++++++++++ lib/librte_eal/common/eal_common_timer.c | 19 +++++++++++ lib/librte_eal/common/include/generic/rte_cycles.h | 13 ++++++++ 3 files changed, 71 insertions(+) diff --git a/app/test/test_cycles.c b/app/test/test_cycles.c index f6c043a..2b44a53 100644 --- a/app/test/test_cycles.c +++ b/app/test/test_cycles.c @@ -90,3 +90,42 @@ test_cycles(void) } REGISTER_TEST_COMMAND(cycles_autotest, test_cycles); + +/* + * rte_delay_us_callback test + * + * - check if callback is correctly registered/unregistered + * + */ + +static int pattern; +static void my_rte_delay_us(unsigned us) +{ + pattern += us; +} + +static int +test_user_delay_us(void) +{ + pattern = 0; + + rte_delay_us_callback_register(my_rte_delay_us); + + rte_delay_us(2); + if (pattern != 2) + return -1; + + rte_delay_us(3); + if (pattern != 5) + return -1; + + rte_delay_us_callback_unregister(); + + rte_delay_us(3); + if (pattern != 5) + return -1; + + return 0; +} + +REGISTER_TEST_COMMAND(user_delay_us, test_user_delay_us); diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/librte_eal/common/eal_common_timer.c index c4227cd..a982562 100644 --- a/lib/librte_eal/common/eal_common_timer.c +++ b/lib/librte_eal/common/eal_common_timer.c @@ -47,9 +47,18 @@ /* The frequency of the RDTSC timer resolution */ static uint64_t eal_tsc_resolution_hz; +/* User function which replaces rte_delay_us function */ +static void (*rte_delay_us_override)(unsigned) = NULL; + void rte_delay_us(unsigned us) { + if (unlikely(rte_delay_us_override != NULL)) + { + rte_delay_us_override(us); + return; + } + const uint64_t start = rte_get_timer_cycles(); const uint64_t ticks = (uint64_t)us * rte_get_timer_hz() / 1E6; while ((rte_get_timer_cycles() - start) < ticks) @@ -84,3 +93,13 @@ set_tsc_freq(void) RTE_LOG(DEBUG, EAL, "TSC frequency is ~%" PRIu64 " KHz\n", freq / 1000); eal_tsc_resolution_hz = freq; } + +void rte_delay_us_callback_register(void (*userfunc)(unsigned)) +{ + rte_delay_us_override = userfunc; +} + +void rte_delay_us_callback_unregister(void) +{ + rte_delay_us_override = NULL; +} diff --git a/lib/librte_eal/common/include/generic/rte_cycles.h b/lib/librte_eal/common/include/generic/rte_cycles.h index 8cc21f2..274f798 100644 --- a/lib/librte_eal/common/include/generic/rte_cycles.h +++ b/lib/librte_eal/common/include/generic/rte_cycles.h @@ -202,4 +202,17 @@ rte_delay_ms(unsigned ms) rte_delay_us(ms * 1000); } +/** + * Replace rte_delay_us with user defined function. + * + * @param userfunc + * User function which replaces rte_delay_us. + */ +void rte_delay_us_callback_register(void(*userfunc)(unsigned)); + +/** + * Unregister user callback function. Restores original rte_delay_us. + */ +void rte_delay_us_callback_unregister(void); + #endif /* _RTE_CYCLES_H_ */