tracing/osnoise: Add OSNOISE_WORKLOAD option
The osnoise tracer is not only a tracer, and a set of tracepoints, but also a workload dispatcher. In preparation for having other workloads, e.g., in user-space, add an option to avoid dispatching the workload. By not dispatching the workload, the osnoise: tracepoints become generic events to measure the execution time of *any* task on Linux. For example: # cd /sys/kernel/tracing/ # cat osnoise/options DEFAULTS OSNOISE_WORKLOAD # echo NO_OSNOISE_WORKLOAD > osnoise/options # cat osnoise/options NO_DEFAULTS NO_OSNOISE_WORKLOAD # echo osnoise > set_event # echo osnoise > current_tracer # tail -8 trace make-94722 [002] d..3. 1371.794507: thread_noise: make:94722 start 1371.794302286 duration 200897 ns sh-121042 [020] d..3. 1371.794534: thread_noise: sh:121042 start 1371.781610976 duration 8943683 ns make-121097 [005] d..3. 1371.794542: thread_noise: make:121097 start 1371.794481522 duration 60444 ns <...>-40 [005] d..3. 1371.794550: thread_noise: migration/5:40 start 1371.794542256 duration 7154 ns <idle>-0 [018] dNh2. 1371.794554: irq_noise: reschedule:253 start 1371.794553547 duration 40 ns <idle>-0 [018] dNh2. 1371.794561: irq_noise: local_timer:236 start 1371.794556222 duration 4890 ns <idle>-0 [018] .Ns2. 1371.794563: softirq_noise: SCHED:7 start 1371.794561803 duration 992 ns <idle>-0 [018] d..3. 1371.794566: thread_noise: swapper/18:0 start 1371.781368110 duration 13191798 ns In preparation for the rtla exec_time tracer/tool and rtla osnoise --user option. Link: https://lkml.kernel.org/r/f5cfbd37aefd419eefe9243b4d2fc38ed5753fe4.1668692096.git.bristot@kernel.org Cc: Daniel Bristot de Oliveira <bristot@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
b179d48b6a
commit
30838fcd81
@ -53,12 +53,13 @@
|
|||||||
*/
|
*/
|
||||||
enum osnoise_options_index {
|
enum osnoise_options_index {
|
||||||
OSN_DEFAULTS = 0,
|
OSN_DEFAULTS = 0,
|
||||||
|
OSN_WORKLOAD,
|
||||||
OSN_MAX
|
OSN_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS" };
|
static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS", "OSNOISE_WORKLOAD" };
|
||||||
|
|
||||||
#define OSN_DEFAULT_OPTIONS 0
|
#define OSN_DEFAULT_OPTIONS 0x2
|
||||||
unsigned long osnoise_options = OSN_DEFAULT_OPTIONS;
|
unsigned long osnoise_options = OSN_DEFAULT_OPTIONS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1186,11 +1187,12 @@ trace_sched_switch_callback(void *data, bool preempt,
|
|||||||
unsigned int prev_state)
|
unsigned int prev_state)
|
||||||
{
|
{
|
||||||
struct osnoise_variables *osn_var = this_cpu_osn_var();
|
struct osnoise_variables *osn_var = this_cpu_osn_var();
|
||||||
|
int workload = test_bit(OSN_WORKLOAD, &osnoise_options);
|
||||||
|
|
||||||
if (p->pid != osn_var->pid)
|
if ((p->pid != osn_var->pid) || !workload)
|
||||||
thread_exit(osn_var, p);
|
thread_exit(osn_var, p);
|
||||||
|
|
||||||
if (n->pid != osn_var->pid)
|
if ((n->pid != osn_var->pid) || !workload)
|
||||||
thread_entry(osn_var, n);
|
thread_entry(osn_var, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1723,9 +1725,16 @@ static void stop_kthread(unsigned int cpu)
|
|||||||
struct task_struct *kthread;
|
struct task_struct *kthread;
|
||||||
|
|
||||||
kthread = per_cpu(per_cpu_osnoise_var, cpu).kthread;
|
kthread = per_cpu(per_cpu_osnoise_var, cpu).kthread;
|
||||||
if (kthread)
|
if (kthread) {
|
||||||
kthread_stop(kthread);
|
kthread_stop(kthread);
|
||||||
per_cpu(per_cpu_osnoise_var, cpu).kthread = NULL;
|
per_cpu(per_cpu_osnoise_var, cpu).kthread = NULL;
|
||||||
|
} else {
|
||||||
|
if (!test_bit(OSN_WORKLOAD, &osnoise_options)) {
|
||||||
|
per_cpu(per_cpu_osnoise_var, cpu).sampling = false;
|
||||||
|
barrier();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1759,6 +1768,13 @@ static int start_kthread(unsigned int cpu)
|
|||||||
snprintf(comm, 24, "timerlat/%d", cpu);
|
snprintf(comm, 24, "timerlat/%d", cpu);
|
||||||
main = timerlat_main;
|
main = timerlat_main;
|
||||||
} else {
|
} else {
|
||||||
|
/* if no workload, just return */
|
||||||
|
if (!test_bit(OSN_WORKLOAD, &osnoise_options)) {
|
||||||
|
per_cpu(per_cpu_osnoise_var, cpu).sampling = true;
|
||||||
|
barrier();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
snprintf(comm, 24, "osnoise/%d", cpu);
|
snprintf(comm, 24, "osnoise/%d", cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user