blk-mq: really fix plug list flushing for nomerge queues
[linux-2.6-block.git] / kernel / trace / trace_sched_switch.c
CommitLineData
35e8e302
SR
1/*
2 * trace context switch
3 *
4 * Copyright (C) 2007 Steven Rostedt <srostedt@redhat.com>
5 *
6 */
7#include <linux/module.h>
35e8e302
SR
8#include <linux/kallsyms.h>
9#include <linux/uaccess.h>
35e8e302 10#include <linux/ftrace.h>
ad8d75ff 11#include <trace/events/sched.h>
35e8e302
SR
12
13#include "trace.h"
14
efade6e7
FW
15static int sched_ref;
16static DEFINE_MUTEX(sched_register_mutex);
82e04af4 17
e309b41d 18static void
c73464b1
PZ
19probe_sched_switch(void *ignore, bool preempt,
20 struct task_struct *prev, struct task_struct *next)
35e8e302 21{
dcef788e 22 if (unlikely(!sched_ref))
b07c3f19
MD
23 return;
24
41bc8144
SR
25 tracing_record_cmdline(prev);
26 tracing_record_cmdline(next);
35e8e302
SR
27}
28
4e655519 29static void
fbd705a0 30probe_sched_wakeup(void *ignore, struct task_struct *wakee)
57422797 31{
dcef788e 32 if (unlikely(!sched_ref))
57422797
IM
33 return;
34
b07c3f19 35 tracing_record_cmdline(current);
57422797
IM
36}
37
5b82a1b0
MD
38static int tracing_sched_register(void)
39{
40 int ret;
41
38516ab5 42 ret = register_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0 43 if (ret) {
b07c3f19 44 pr_info("wakeup trace: Couldn't activate tracepoint"
5b82a1b0
MD
45 " probe to kernel_sched_wakeup\n");
46 return ret;
47 }
48
38516ab5 49 ret = register_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
5b82a1b0 50 if (ret) {
b07c3f19 51 pr_info("wakeup trace: Couldn't activate tracepoint"
5b82a1b0
MD
52 " probe to kernel_sched_wakeup_new\n");
53 goto fail_deprobe;
54 }
55
38516ab5 56 ret = register_trace_sched_switch(probe_sched_switch, NULL);
5b82a1b0 57 if (ret) {
b07c3f19 58 pr_info("sched trace: Couldn't activate tracepoint"
73d8b8bc 59 " probe to kernel_sched_switch\n");
5b82a1b0
MD
60 goto fail_deprobe_wake_new;
61 }
62
63 return ret;
64fail_deprobe_wake_new:
38516ab5 65 unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
5b82a1b0 66fail_deprobe:
38516ab5 67 unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0
MD
68 return ret;
69}
70
71static void tracing_sched_unregister(void)
72{
38516ab5
SR
73 unregister_trace_sched_switch(probe_sched_switch, NULL);
74 unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
75 unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0
MD
76}
77
f2252935 78static void tracing_start_sched_switch(void)
5b82a1b0 79{
efade6e7 80 mutex_lock(&sched_register_mutex);
e168e051 81 if (!(sched_ref++))
5b82a1b0 82 tracing_sched_register();
efade6e7 83 mutex_unlock(&sched_register_mutex);
5b82a1b0
MD
84}
85
f2252935 86static void tracing_stop_sched_switch(void)
5b82a1b0 87{
efade6e7 88 mutex_lock(&sched_register_mutex);
e168e051 89 if (!(--sched_ref))
5b82a1b0 90 tracing_sched_unregister();
efade6e7 91 mutex_unlock(&sched_register_mutex);
5b82a1b0
MD
92}
93
41bc8144
SR
94void tracing_start_cmdline_record(void)
95{
96 tracing_start_sched_switch();
97}
98
99void tracing_stop_cmdline_record(void)
100{
101 tracing_stop_sched_switch();
102}