From: Willy Tarreau Date: Thu, 30 Sep 2021 06:52:11 +0000 (+0200) Subject: MINOR: time: uninline report_idle() and move it to task.c X-Git-Tag: v2.5-dev9~126 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6136989a2272d9b4422de6486f9b9d492f2c8488;p=thirdparty%2Fhaproxy.git MINOR: time: uninline report_idle() and move it to task.c I don't know why I inlined this one, this makes no sense given that it's only used for stats, and it starts a circular dependency on tinfo.h which can be problematic in the future. In addition, all the stuff related to idle time calculation should be with the rest of the scheduler, which currently is in task.{c,h}, so let's move it there. --- diff --git a/include/haproxy/task.h b/include/haproxy/task.h index 7b9b4e625b..f7aebedf49 100644 --- a/include/haproxy/task.h +++ b/include/haproxy/task.h @@ -110,6 +110,9 @@ void task_kill(struct task *t); void tasklet_kill(struct tasklet *t); void __task_wakeup(struct task *t); void __task_queue(struct task *task, struct eb_root *wq); + +uint sched_report_idle(); + unsigned int run_tasks_from_lists(unsigned int budgets[]); /* diff --git a/include/haproxy/time.h b/include/haproxy/time.h index e9baab418b..ad3a1dbfd1 100644 --- a/include/haproxy/time.h +++ b/include/haproxy/time.h @@ -581,22 +581,6 @@ static inline void measure_idle() idle_time = samp_time = 0; } -/* report the average CPU idle percentage over all running threads, between 0 and 100 */ -static inline uint report_idle() -{ - uint total = 0; - uint rthr = 0; - uint thr; - - for (thr = 0; thr < MAX_THREADS; thr++) { - if (!(all_threads_mask & (1UL << thr))) - continue; - total += HA_ATOMIC_LOAD(&ha_thread_info[thr].idle_pct); - rthr++; - } - return rthr ? total / rthr : 0; -} - /* 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. */ diff --git a/src/stats.c b/src/stats.c index 99efac0b39..8cc3bad692 100644 --- a/src/stats.c +++ b/src/stats.c @@ -3446,7 +3446,7 @@ static void stats_dump_html_info(struct stream_interface *si, struct uri_auth *u actconn, pipes_used, pipes_used+pipes_free, read_freq_ctr(&global.conn_per_sec), bps >= 1000000000UL ? (bps / 1000000000.0) : bps >= 1000000UL ? (bps / 1000000.0) : (bps / 1000.0), bps >= 1000000000UL ? 'G' : bps >= 1000000UL ? 'M' : 'k', - total_run_queues(), total_allocated_tasks(), report_idle() + total_run_queues(), total_allocated_tasks(), sched_report_idle() ); /* scope_txt = search query, appctx->ctx.stats.scope_len is always <= STAT_SCOPE_TXT_MAXLEN */ @@ -4479,7 +4479,7 @@ int stats_fill_info(struct field *info, int len, uint flags) #endif info[INF_TASKS] = mkf_u32(0, total_allocated_tasks()); info[INF_RUN_QUEUE] = mkf_u32(0, total_run_queues()); - info[INF_IDLE_PCT] = mkf_u32(FN_AVG, report_idle()); + info[INF_IDLE_PCT] = mkf_u32(FN_AVG, sched_report_idle()); info[INF_NODE] = mkf_str(FO_CONFIG|FN_OUTPUT|FS_SERVICE, global.node); if (global.desc) info[INF_DESCRIPTION] = mkf_str(FO_CONFIG|FN_OUTPUT|FS_SERVICE, global.desc); diff --git a/src/task.c b/src/task.c index 2d063d91b0..ce544c12de 100644 --- a/src/task.c +++ b/src/task.c @@ -859,6 +859,22 @@ void process_runnable_tasks() activity[tid].long_rq++; } +/* report the average CPU idle percentage over all running threads, between 0 and 100 */ +uint sched_report_idle() +{ + uint total = 0; + uint rthr = 0; + uint thr; + + for (thr = 0; thr < MAX_THREADS; thr++) { + if (!(all_threads_mask & (1UL << thr))) + continue; + total += HA_ATOMIC_LOAD(&ha_thread_info[thr].idle_pct); + rthr++; + } + return rthr ? total / rthr : 0; +} + /* * Delete every tasks before running the master polling loop */