blob: 4c896a0101bdcb231581a3cced5f2ef4a3556d08 [file] [log] [blame]
Steven Rostedt35e8e302008-05-12 21:20:42 +02001/*
2 * trace context switch
3 *
4 * Copyright (C) 2007 Steven Rostedt <srostedt@redhat.com>
5 *
6 */
7#include <linux/module.h>
Steven Rostedt35e8e302008-05-12 21:20:42 +02008#include <linux/kallsyms.h>
9#include <linux/uaccess.h>
Steven Rostedt35e8e302008-05-12 21:20:42 +020010#include <linux/ftrace.h>
Steven Rostedtad8d75f2009-04-14 19:39:12 -040011#include <trace/events/sched.h>
Steven Rostedt35e8e302008-05-12 21:20:42 +020012
13#include "trace.h"
14
Frederic Weisbeckerefade6e2008-10-31 13:28:58 +010015static int sched_ref;
16static DEFINE_MUTEX(sched_register_mutex);
Frederic Weisbecker82e04af2009-07-29 18:00:29 +020017
Ingo Molnare309b412008-05-12 21:20:51 +020018static void
Peter Zijlstrac73464b2015-09-28 18:06:56 +020019probe_sched_switch(void *ignore, bool preempt,
20 struct task_struct *prev, struct task_struct *next)
Steven Rostedt35e8e302008-05-12 21:20:42 +020021{
Zhaoleidcef7882009-03-31 15:26:14 +080022 if (unlikely(!sched_ref))
Mathieu Desnoyersb07c3f12008-07-18 12:16:17 -040023 return;
24
Steven Rostedt41bc8142008-05-22 11:49:22 -040025 tracing_record_cmdline(prev);
26 tracing_record_cmdline(next);
Steven Rostedt35e8e302008-05-12 21:20:42 +020027}
28
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020029static void
Peter Zijlstrafbd705a2015-06-09 11:13:36 +020030probe_sched_wakeup(void *ignore, struct task_struct *wakee)
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020031{
Zhaoleidcef7882009-03-31 15:26:14 +080032 if (unlikely(!sched_ref))
33 return;
34
35 tracing_record_cmdline(current);
Ingo Molnar57422792008-05-12 21:20:51 +020036}
37
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020038static int tracing_sched_register(void)
39{
40 int ret;
41
Steven Rostedt38516ab2010-04-20 17:04:50 -040042 ret = register_trace_sched_wakeup(probe_sched_wakeup, NULL);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020043 if (ret) {
Mathieu Desnoyersb07c3f12008-07-18 12:16:17 -040044 pr_info("wakeup trace: Couldn't activate tracepoint"
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020045 " probe to kernel_sched_wakeup\n");
46 return ret;
47 }
48
Steven Rostedt38516ab2010-04-20 17:04:50 -040049 ret = register_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020050 if (ret) {
Mathieu Desnoyersb07c3f12008-07-18 12:16:17 -040051 pr_info("wakeup trace: Couldn't activate tracepoint"
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020052 " probe to kernel_sched_wakeup_new\n");
53 goto fail_deprobe;
54 }
55
Steven Rostedt38516ab2010-04-20 17:04:50 -040056 ret = register_trace_sched_switch(probe_sched_switch, NULL);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020057 if (ret) {
Mathieu Desnoyersb07c3f12008-07-18 12:16:17 -040058 pr_info("sched trace: Couldn't activate tracepoint"
Wenji Huang73d8b8b2009-02-17 01:10:02 -050059 " probe to kernel_sched_switch\n");
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020060 goto fail_deprobe_wake_new;
61 }
62
63 return ret;
64fail_deprobe_wake_new:
Steven Rostedt38516ab2010-04-20 17:04:50 -040065 unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020066fail_deprobe:
Steven Rostedt38516ab2010-04-20 17:04:50 -040067 unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020068 return ret;
69}
70
71static void tracing_sched_unregister(void)
72{
Steven Rostedt38516ab2010-04-20 17:04:50 -040073 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);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020076}
77
Ingo Molnarf2252932008-05-22 10:37:48 +020078static void tracing_start_sched_switch(void)
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020079{
Frederic Weisbeckerefade6e2008-10-31 13:28:58 +010080 mutex_lock(&sched_register_mutex);
Steven Rostedte168e052008-11-07 22:36:02 -050081 if (!(sched_ref++))
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020082 tracing_sched_register();
Frederic Weisbeckerefade6e2008-10-31 13:28:58 +010083 mutex_unlock(&sched_register_mutex);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020084}
85
Ingo Molnarf2252932008-05-22 10:37:48 +020086static void tracing_stop_sched_switch(void)
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020087{
Frederic Weisbeckerefade6e2008-10-31 13:28:58 +010088 mutex_lock(&sched_register_mutex);
Steven Rostedte168e052008-11-07 22:36:02 -050089 if (!(--sched_ref))
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020090 tracing_sched_unregister();
Frederic Weisbeckerefade6e2008-10-31 13:28:58 +010091 mutex_unlock(&sched_register_mutex);
Mathieu Desnoyers5b82a1b2008-05-12 21:21:10 +020092}
93
Steven Rostedt41bc8142008-05-22 11:49:22 -040094void 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}