From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aer-iport-2.cisco.com (aer-iport-2.cisco.com [173.38.203.52]) by dpdk.org (Postfix) with ESMTP id D6FE32BA2 for ; Wed, 20 Jul 2016 14:10:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=4957; q=dns/txt; s=iport; t=1469016656; x=1470226256; h=from:to:cc:subject:date:message-id; bh=k/Q7ze1QvcjjL8ALdc2iOUKJ7pD7fBOu1PT6s89tnrg=; b=CgjpQGfGQejcSquD1VnVVS8p7c+BBiaWaAIy+ZavkNMlyj/WAC5YUKQf h6my5ZNWATNKZCbDhLNmf3qvpo7DlMYzgf+9zd7X2eHx5yETQG5rAgyLy IPmtS/i8BPgzqNxfpnfbFERFDl6ebc6OK/KOE/BG2IvOaqFfiH40q4Lyt Y=; X-IronPort-AV: E=Sophos;i="5.28,393,1464652800"; d="scan'208";a="635857044" Received: from aer-iport-nat.cisco.com (HELO aer-core-1.cisco.com) ([173.38.203.22]) by aer-iport-2.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jul 2016 12:10:56 +0000 Received: from localhost.localdomain ([10.61.164.133]) by aer-core-1.cisco.com (8.14.5/8.14.5) with ESMTP id u6KCAtUK006553; Wed, 20 Jul 2016 12:10:56 GMT From: jozmarti@cisco.com To: dev@dpdk.org Cc: Jozef Martiniak Date: Wed, 20 Jul 2016 14:10:44 +0200 Message-Id: <1469016644-6521-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: , X-List-Received-Date: Wed, 20 Jul 2016 12:10:57 -0000 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. To avoid this, rte_delay_us can be replaced with user-defined delay function with: void rte_delay_us_callback_register(void(*userfunc)(unsigned)); When userfunc==NULL, build-in blocking delay function is restored. Signed-off-by: Jozef Martiniak --- app/test/test_cycles.c | 45 ++++++++++++++++++++++ lib/librte_eal/bsdapp/eal/rte_eal_version.map | 7 ++++ lib/librte_eal/common/eal_common_timer.c | 22 ++++++++++- lib/librte_eal/common/include/generic/rte_cycles.h | 15 +++++++- lib/librte_eal/linuxapp/eal/rte_eal_version.map | 7 ++++ 5 files changed, 93 insertions(+), 3 deletions(-) diff --git a/app/test/test_cycles.c b/app/test/test_cycles.c index f6c043a..7415ac8 100644 --- a/app/test/test_cycles.c +++ b/app/test/test_cycles.c @@ -90,3 +90,48 @@ 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(2); + if (pattern != 0) + return -1; + + /* register custom delay function */ + 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; + + /* restore original delay function */ + rte_delay_us_callback_register(NULL); + + 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/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index a335e04..2f83ed0 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -162,3 +162,10 @@ DPDK_16.07 { rte_thread_setname; } DPDK_16.04; + +DPDK_16.11 { + global: + + rte_delay_us_callback_register; + +} DPDK_16.07; diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/librte_eal/common/eal_common_timer.c index c4227cd..ddfa9d1 100644 --- a/lib/librte_eal/common/eal_common_timer.c +++ b/lib/librte_eal/common/eal_common_timer.c @@ -47,8 +47,11 @@ /* The frequency of the RDTSC timer resolution */ static uint64_t eal_tsc_resolution_hz; -void -rte_delay_us(unsigned us) +/* Pointer to user delay function */ +void (*rte_delay_us)(unsigned) = NULL; + +static void +rte_delay_us_block(unsigned us) { const uint64_t start = rte_get_timer_cycles(); const uint64_t ticks = (uint64_t)us * rte_get_timer_hz() / 1E6; @@ -84,3 +87,18 @@ 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)) +{ + if (userfunc == NULL) + rte_delay_us = rte_delay_us_block; + else + rte_delay_us = userfunc; +} + +static void __attribute__((constructor)) +rte_timer_init(void) +{ + /* set rte_delay_us_block as a delay function */ + rte_delay_us_callback_register(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..7a45b58 100644 --- a/lib/librte_eal/common/include/generic/rte_cycles.h +++ b/lib/librte_eal/common/include/generic/rte_cycles.h @@ -182,13 +182,16 @@ rte_get_timer_hz(void) } /** + * * Wait at least us microseconds. + * This function can be replaced with user-defined function using + * rte_delay_us_callback_register * * @param us * The number of microseconds to wait. */ void -rte_delay_us(unsigned us); +(*rte_delay_us)(unsigned us); /** * Wait at least ms milliseconds. @@ -202,4 +205,14 @@ 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. NULL restores + * buildin block delay function. + */ +void rte_delay_us_callback_register(void(*userfunc)(unsigned)); + + #endif /* _RTE_CYCLES_H_ */ diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map index db8c984..4ba30ed 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -166,3 +166,10 @@ DPDK_16.07 { rte_thread_setname; } DPDK_16.04; + +DPDK_16.11 { + global: + + rte_delay_us_callback_register; + +} DPDK_16.07; -- 2.1.4