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.
This commit is contained in:
Willy Tarreau 2019-04-25 08:57:41 +02:00
parent d636675137
commit d9add3acc8
3 changed files with 11 additions and 1 deletions

View File

@ -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);
}
}

View File

@ -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))) = { };

View File

@ -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);