From 1cdb531ec8833cdd7ee8c0dcb7a8de4e8ee29f25 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 30 Sep 2021 18:20:30 +0200 Subject: [PATCH] REORG: sched: move the stolen CPU time detection to sched_entering_poll() That's where that code initially was but it had been moved to activity_count_runtime() for pure reasons of dependency loops. These ones are no longer true so we can move that code back to the scheduler and keep it where the information are updated and checked. --- include/haproxy/activity.h | 19 ------------------- include/haproxy/task.h | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/include/haproxy/activity.h b/include/haproxy/activity.h index 66a5f3b..28f8689 100644 --- a/include/haproxy/activity.h +++ b/include/haproxy/activity.h @@ -42,9 +42,6 @@ void report_stolen_time(uint64_t stolen); */ static inline void activity_count_runtime() { - uint64_t new_mono_time; - uint64_t new_cpu_time; - int64_t stolen; uint32_t run_time; uint32_t up, down; @@ -54,22 +51,6 @@ static inline void activity_count_runtime() up = 1000; down = up * 99 / 100; - new_cpu_time = now_cpu_time(); - new_mono_time = now_mono_time(); - - if (ti->prev_cpu_time && ti->prev_mono_time) { - new_cpu_time -= ti->prev_cpu_time; - new_mono_time -= ti->prev_mono_time; - stolen = new_mono_time - new_cpu_time; - if (unlikely(stolen >= 500000)) { - stolen /= 500000; - /* more than half a millisecond difference might - * indicate an undesired preemption. - */ - report_stolen_time(stolen); - } - } - run_time = (before_poll.tv_sec - after_poll.tv_sec) * 1000000U + (before_poll.tv_usec - after_poll.tv_usec); run_time = swrate_add(&activity[tid].avg_loop_us, TIME_STATS_SAMPLES, run_time); diff --git a/include/haproxy/task.h b/include/haproxy/task.h index a385737..1020eea 100644 --- a/include/haproxy/task.h +++ b/include/haproxy/task.h @@ -658,10 +658,33 @@ static inline void sched_leaving_poll(int timeout, int interrupted) /* Collect date and time information before calling poll(). This will be used * to count the run time of the past loop and the sleep time of the next poll. + * It also compares the elasped and cpu times during the activity period to + * estimate the amount of stolen time, which is reported if higher than half + * a millisecond. */ static inline void sched_entering_poll() { + uint64_t new_mono_time; + uint64_t new_cpu_time; + int64_t stolen; + gettimeofday(&before_poll, NULL); + + new_cpu_time = now_cpu_time(); + new_mono_time = now_mono_time(); + + if (ti->prev_cpu_time && ti->prev_mono_time) { + new_cpu_time -= ti->prev_cpu_time; + new_mono_time -= ti->prev_mono_time; + stolen = new_mono_time - new_cpu_time; + if (unlikely(stolen >= 500000)) { + stolen /= 500000; + /* more than half a millisecond difference might + * indicate an undesired preemption. + */ + report_stolen_time(stolen); + } + } } /* This function register a new signal. "lua" is the current lua -- 1.7.10.4