summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/topics/dpdk/pmd.rst5
-rw-r--r--lib/dpif-netdev.c4
-rw-r--r--lib/util.c16
-rw-r--r--lib/util.h1
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);