[ovs-dev] [PATCH v5 2/2] Minimize the number of time calls in time_poll()

anton.ivanov at cambridgegreys.com anton.ivanov at cambridgegreys.com
Wed Aug 4 08:34:19 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 | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/timeval.c b/lib/timeval.c
index dbfbcb9e6..45a934513 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,13 +297,12 @@ 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;
         retval = 0;
 
@@ -331,6 +330,8 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE *handles OVS_UNUSED,
          */
         if (timeout_when != LLONG_MIN) {
             retval = poll(pollfds, n_pollfds, time_left);
+        } else {
+            retval = 0;
         }
         if (retval < 0) {
             retval = -errno;
@@ -357,7 +358,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
@@ -374,7 +376,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