summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Marchand <david.marchand@redhat.com>2023-01-18 16:23:55 +0000
committerIlya Maximets <i.maximets@ovn.org>2023-01-23 17:23:20 +0100
commitf62629a55894546ff043e8a116c3c57aff73c285 (patch)
tree6adcfb99ef6ba80c218d17741976b0ad40cd74f6
parente24b68fa708c1c31388bee24ebe781dc49b284da (diff)
downloadopenvswitch-f62629a55894546ff043e8a116c3c57aff73c285.tar.gz
dpif-netdev: Set timer slack for PMD threads.
The default Linux timer slack groups timer expires into 50 uS intervals. With some traffic patterns this can mean that returning to process packets after a sleep takes too long and packets are dropped. Add a helper to util.c and set use it to reduce the timer slack for PMD threads, so that sleeps with smaller resolutions can be done to prevent sleeping for too long. Fixes: de3bbdc479a9 ("dpif-netdev: Add PMD load based sleeping.") Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2023-January/401121.html Reported-by: Ilya Maximets <i.maximets@ovn.org> Signed-off-by: David Marchand <david.marchand@redhat.com> Co-authored-by: Kevin Traynor <ktraynor@redhat.com> Signed-off-by: Kevin Traynor <ktraynor@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-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);