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 098206e..922f493 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 @@
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 b48f4b4..eac2c10 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 04476fe..2775743 100644
--- a/src/task.c
+++ b/src/task.c
@@ -93,7 +93,7 @@
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);