[ovs-dev] [PATCH v2 2/2] Minimize the number of time calls in time_poll()
anton.ivanov at cambridgegreys.com
anton.ivanov at cambridgegreys.com
Mon Jul 12 17:15:29 UTC 2021
From: Anton Ivanov <anton.ivanov at cambridgegreys.com>
time_poll() makes an excessive number of time_msec() calls
which incur a performance penalty.
1. Avoid time_msec() call for timeout calculation when time_poll()
is asked to skip poll()
2. Reuse the time_msec() result from deadline calculation for
last_wakeup and timeout calculation.
Signed-off-by: Anton Ivanov <anton.ivanov at cambridgegreys.com>
---
lib/timeval.c | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/lib/timeval.c b/lib/timeval.c
index c6ac87376..64ab22e05 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -287,7 +287,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
long long int timeout_when, int *elapsed)
{
long long int *last_wakeup = last_wakeup_get();
- long long int start;
+ long long int start, now;
bool quiescent;
int retval = 0;
@@ -297,28 +297,31 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
if (*last_wakeup && !thread_is_pmd()) {
log_poll_interval(*last_wakeup);
}
- start = time_msec();
+ now = start = time_msec();
timeout_when = MIN(timeout_when, deadline);
quiescent = ovsrcu_is_quiescent();
for (;;) {
- long long int now = time_msec();
int time_left;
- if (now >= timeout_when) {
+ if (n_pollfds == 0) {
time_left = 0;
- } else if ((unsigned long long int) timeout_when - now > INT_MAX) {
- time_left = INT_MAX;
} else {
- time_left = timeout_when - now;
- }
-
- if (!quiescent) {
- if (!time_left) {
- ovsrcu_quiesce();
+ if (now >= timeout_when) {
+ time_left = 0;
+ } else if ((unsigned long long int) timeout_when - now > INT_MAX) {
+ time_left = INT_MAX;
} else {
- ovsrcu_quiesce_start();
+ time_left = timeout_when - now;
+ }
+
+ if (!quiescent) {
+ if (!time_left) {
+ ovsrcu_quiesce();
+ } else {
+ ovsrcu_quiesce_start();
+ }
}
}
@@ -329,6 +332,8 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
*/
if (n_pollfds != 0) {
retval = poll(pollfds, n_pollfds, time_left);
+ } else {
+ retval = 0;
}
if (retval < 0) {
retval = -errno;
@@ -355,7 +360,8 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
ovsrcu_quiesce_end();
}
- if (deadline <= time_msec()) {
+ now = time_msec();
+ if (deadline <= now) {
#ifndef _WIN32
fatal_signal_handler(SIGALRM);
#else
@@ -372,7 +378,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
break;
}
}
- *last_wakeup = time_msec();
+ *last_wakeup = now;
refresh_rusage();
*elapsed = *last_wakeup - start;
return retval;
--
2.20.1
More information about the dev
mailing list