diff options
-rw-r--r-- | Documentation/topics/dpdk/pmd.rst | 5 | ||||
-rw-r--r-- | lib/dpif-netdev.c | 4 | ||||
-rw-r--r-- | lib/util.c | 16 | ||||
-rw-r--r-- | lib/util.h | 1 |
4 files changed, 21 insertions, 5 deletions
diff --git a/Documentation/topics/dpdk/pmd.rst b/Documentation/topics/dpdk/pmd.rst index 604ac3f6b..0c3bb717f 100644 --- a/Documentation/topics/dpdk/pmd.rst +++ b/Documentation/topics/dpdk/pmd.rst @@ -373,10 +373,5 @@ system configuration (e.g. enabling processor C-states) and workloads. extra latency before the PMD thread returns to processing packets at full rate. -.. note:: - - By default Linux kernel groups timer expirations and this can add an - overhead of up to 50 microseconds to a requested timer expiration. - .. _ovs-vswitchd(8): http://openvswitch.org/support/dist-docs/ovs-vswitchd.8.html diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a47d54c6f..4f06e3f4e 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -171,6 +171,9 @@ static struct odp_support dp_netdev_support = { /* Time in microseconds to try RCU quiescing. */ #define PMD_RCU_QUIESCE_INTERVAL 10000LL +/* Timer resolution for PMD threads in nanoseconds. */ +#define PMD_TIMER_RES_NS 1000 + /* Number of pkts Rx on an interface that will stop pmd thread sleeping. */ #define PMD_SLEEP_THRESH (NETDEV_MAX_BURST / 2) /* Time in uS to increment a pmd thread sleep time. */ @@ -6962,6 +6965,7 @@ pmd_thread_main(void *f_) poll_cnt = pmd_load_queues_and_ports(pmd, &poll_list); dfc_cache_init(&pmd->flow_cache); pmd_alloc_static_tx_qid(pmd); + set_timer_resolution(PMD_TIMER_RES_NS); reload: atomic_count_init(&pmd->pmd_overloaded, 0); diff --git a/lib/util.c b/lib/util.c index 7576eb06e..96a71550d 100644 --- a/lib/util.c +++ b/lib/util.c @@ -25,6 +25,9 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#ifdef __linux__ +#include <sys/prctl.h> +#endif #include <sys/stat.h> #include <unistd.h> #include "bitmap.h" @@ -2419,6 +2422,19 @@ xnanosleep_no_quiesce(uint64_t nanoseconds) xnanosleep__(nanoseconds); } +#if __linux__ +void +set_timer_resolution(unsigned long nanoseconds) +{ + prctl(PR_SET_TIMERSLACK, nanoseconds); +} +#else +void +set_timer_resolution(unsigned long nanoseconds OVS_UNUSED) +{ +} +#endif + /* Determine whether standard output is a tty or not. This is useful to decide * whether to use color output or not when --color option for utilities is set * to `auto`. diff --git a/lib/util.h b/lib/util.h index f35f33021..62801e85f 100644 --- a/lib/util.h +++ b/lib/util.h @@ -594,6 +594,7 @@ ovs_u128_is_superset(ovs_u128 super, ovs_u128 sub) void xsleep(unsigned int seconds); void xnanosleep(uint64_t nanoseconds); void xnanosleep_no_quiesce(uint64_t nanoseconds); +void set_timer_resolution(unsigned long nanoseconds); bool is_stdout_a_tty(void); |