]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: clock: split local and global date updates
authorWilly Tarreau <w@1wt.eu>
Wed, 21 Sep 2022 05:37:27 +0000 (07:37 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 21 Sep 2022 07:06:28 +0000 (09:06 +0200)
Pollers that support busy polling spend a lot of time (and cause
contention) updating the global date when they're looping over themselves
while it serves no purpose: what's needed is only an update on the local
date to know when to stop looping.

This patch splits clock_pudate_date() into a pair of local and global
update functions, so that pollers can be easily improved.

include/haproxy/clock.h
src/clock.c

index dedcacb248329513927420c7e97cc5f61409384b..22bb2c9471710a77b7224dfb56cf00176c583faa 100644 (file)
@@ -35,7 +35,8 @@ uint64_t now_cpu_time_thread(int thr);
 uint64_t now_mono_time(void);
 uint64_t now_cpu_time(void);
 void clock_set_local_source(void);
-void clock_update_date(int max_wait, int interrupted);
+void clock_update_local_date(int max_wait, int interrupted);
+void clock_update_global_date();
 void clock_init_process_date(void);
 void clock_init_thread_date(void);
 int clock_setup_signal_timer(void *timer, int sig, int val);
@@ -44,4 +45,10 @@ uint clock_report_idle(void);
 void clock_leaving_poll(int timeout, int interrupted);
 void clock_entering_poll(void);
 
+static inline void clock_update_date(int max_wait, int interrupted)
+{
+       clock_update_local_date(max_wait, interrupted);
+       clock_update_global_date();
+}
+
 #endif
index 099057f7df9112551ee852caea2b36820d8b513f..c00243faf6b9abc35df174c08470ea2adf2a8903 100644 (file)
@@ -147,14 +147,10 @@ int clock_setup_signal_timer(void *tmr, int sig, int val)
  * values for the tv_sec and tv_usec parts. The offset is made of two signed
  * ints so that the clock can be adjusted in the two directions.
  */
-void clock_update_date(int max_wait, int interrupted)
+void clock_update_local_date(int max_wait, int interrupted)
 {
-       struct timeval min_deadline, max_deadline, tmp_now;
-       uint old_now_ms;
-       ullong old_now;
-       ullong new_now;
-       ullong ofs, ofs_new;
-       uint sec_ofs, usec_ofs;
+       struct timeval min_deadline, max_deadline;
+       ullong ofs;
 
        gettimeofday(&date, NULL);
 
@@ -194,6 +190,19 @@ void clock_update_date(int max_wait, int interrupted)
                        now.tv_sec  += 1;
                }
        }
+       now_ms = __tv_to_ms(&now);
+}
+
+void clock_update_global_date()
+{
+       struct timeval tmp_now;
+       uint old_now_ms;
+       ullong old_now;
+       ullong new_now;
+       ullong ofs, ofs_new;
+       uint sec_ofs, usec_ofs;
+
+       ofs = HA_ATOMIC_LOAD(&now_offset);
 
        /* now that we have bounded the local time, let's check if it's
         * realistic regarding the global date, which only moves forward,