From: Willy Tarreau Date: Thu, 25 Apr 2019 06:57:41 +0000 (+0200) Subject: MINOR: activity: make the profiling status per thread and not global X-Git-Tag: v2.0-dev3~170 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d9add3acc815f56408a4c8ba0c45baf42745f718;p=thirdparty%2Fhaproxy.git MINOR: activity: make the profiling status per thread and not global In order to later support automatic profiling turn on/off, we need to have it per-thread. We're keeping the global option to know whether to turn it or on off, but the profiling status is now set per thread. We're updating the status in activity_count_runtime() which is called before entering poll(). The reason is that we'll extend this with run time measurement when deciding to automatically turn it on or off. --- diff --git a/include/proto/activity.h b/include/proto/activity.h index 098206e182..922f493924 100644 --- a/include/proto/activity.h +++ b/include/proto/activity.h @@ -32,6 +32,7 @@ #define HA_PROF_TASKS 0x00000001 /* enable per-task CPU profiling */ extern unsigned int profiling; +extern unsigned long task_profiling_mask; extern struct activity activity[MAX_THREADS]; @@ -67,6 +68,14 @@ static inline void activity_count_runtime() run_time = (before_poll.tv_sec - after_poll.tv_sec) * 1000000U + (before_poll.tv_usec - after_poll.tv_usec); swrate_add(&activity[tid].avg_loop_us, TIME_STATS_SAMPLES, run_time); + + if (!(task_profiling_mask & tid_bit)) { + if (unlikely(profiling & HA_PROF_TASKS)) + _HA_ATOMIC_OR(&task_profiling_mask, tid_bit); + } else { + if (unlikely(!(profiling & HA_PROF_TASKS))) + _HA_ATOMIC_AND(&task_profiling_mask, ~tid_bit); + } } diff --git a/src/activity.c b/src/activity.c index b48f4b43b2..eac2c10c34 100644 --- a/src/activity.c +++ b/src/activity.c @@ -24,6 +24,7 @@ /* bit field of profiling options. Beware, may be modified at runtime! */ unsigned int profiling = 0; +unsigned long task_profiling_mask = 0; /* One struct per thread containing all collected measurements */ struct activity activity[MAX_THREADS] __attribute__((aligned(64))) = { }; diff --git a/src/task.c b/src/task.c index 04476fe5aa..27757436d7 100644 --- a/src/task.c +++ b/src/task.c @@ -93,7 +93,7 @@ void __task_wakeup(struct task *t, struct eb_root *root) t->rq.key += offset; } - if (profiling & HA_PROF_TASKS) + if (task_profiling_mask & tid_bit) t->call_date = now_mono_time(); eb32sc_insert(root, &t->rq, t->thread_mask);