diff options
Diffstat (limited to 'driver/gator_trace_sched.c')
-rw-r--r-- | driver/gator_trace_sched.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/driver/gator_trace_sched.c b/driver/gator_trace_sched.c index 9ddb822..d0336f9 100644 --- a/driver/gator_trace_sched.c +++ b/driver/gator_trace_sched.c @@ -13,7 +13,7 @@ #define SCHED_SWITCH 1 #define SCHED_PROCESS_EXIT 2 -#define TASK_MAP_ENTRIES 1024 /* must be power of 2 */ +#define TASK_MAP_ENTRIES 1024 /* must be power of 2 */ #define TASK_MAX_COLLISIONS 2 static DEFINE_PER_CPU(uint64_t *, taskname_keys); @@ -26,14 +26,14 @@ enum { STATE_WAIT_ON_MUTEX, }; -void emit_pid_name(struct task_struct* task) +void emit_pid_name(struct task_struct *task) { bool found = false; char taskcomm[TASK_COMM_LEN + 3]; unsigned long x, cpu = smp_processor_id(); uint64_t *keys = &(per_cpu(taskname_keys, cpu)[(task->pid & 0xFF) * TASK_MAX_COLLISIONS]); uint64_t value; - + value = gator_chksum_crc32(task->comm); value = (value << 32) | (uint32_t)task->pid; @@ -64,7 +64,6 @@ void emit_pid_name(struct task_struct* task) } } - static void collect_counters(void) { int *buffer, len; @@ -84,7 +83,7 @@ static void collect_counters(void) } } -static void probe_sched_write(int type, struct task_struct* task, struct task_struct* old_task) +static void probe_sched_write(int type, struct task_struct *task, struct task_struct *old_task) { int cookie = 0, state = 0; int cpu = smp_processor_id(); @@ -141,7 +140,14 @@ GATOR_DEFINE_PROBE(sched_process_exit, TP_PROTO(struct task_struct *p)) probe_sched_write(SCHED_PROCESS_EXIT, p, 0); } -static int register_scheduler_tracepoints(void) { +static void do_nothing(void *info) +{ + // Intentionally do nothing + (void)info; +} + +static int register_scheduler_tracepoints(void) +{ // register tracepoints if (GATOR_REGISTER_TRACE(sched_switch)) goto fail_sched_switch; @@ -149,6 +155,10 @@ static int register_scheduler_tracepoints(void) { goto fail_sched_process_exit; pr_debug("gator: registered tracepoints\n"); + // Now that the scheduler tracepoint is registered, force a context switch + // on all cpus to capture what is currently running. + on_each_cpu(do_nothing, NULL, 0); + return 0; // unregister tracepoints on error @@ -166,7 +176,7 @@ int gator_trace_sched_start(void) for_each_present_cpu(cpu) { size = TASK_MAP_ENTRIES * TASK_MAX_COLLISIONS * sizeof(uint64_t); - per_cpu(taskname_keys, cpu) = (uint64_t*)kmalloc(size, GFP_KERNEL); + per_cpu(taskname_keys, cpu) = (uint64_t *)kmalloc(size, GFP_KERNEL); if (!per_cpu(taskname_keys, cpu)) return -1; memset(per_cpu(taskname_keys, cpu), 0, size); |