]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - kernel/trace/trace_sched_switch.c
sched: Introduce the 'trace_sched_waking' tracepoint
[mirror_ubuntu-jammy-kernel.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
38516ab5 19probe_sched_switch(void *ignore, struct task_struct *prev, struct task_struct *next)
35e8e302 20{
dcef788e 21 if (unlikely(!sched_ref))
b07c3f19
MD
22 return;
23
41bc8144
SR
24 tracing_record_cmdline(prev);
25 tracing_record_cmdline(next);
35e8e302
SR
26}
27
4e655519 28static void
fbd705a0 29probe_sched_wakeup(void *ignore, struct task_struct *wakee)
57422797 30{
dcef788e 31 if (unlikely(!sched_ref))
57422797
IM
32 return;
33
b07c3f19 34 tracing_record_cmdline(current);
57422797
IM
35}
36
5b82a1b0
MD
37static int tracing_sched_register(void)
38{
39 int ret;
40
38516ab5 41 ret = register_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0 42 if (ret) {
b07c3f19 43 pr_info("wakeup trace: Couldn't activate tracepoint"
5b82a1b0
MD
44 " probe to kernel_sched_wakeup\n");
45 return ret;
46 }
47
38516ab5 48 ret = register_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
5b82a1b0 49 if (ret) {
b07c3f19 50 pr_info("wakeup trace: Couldn't activate tracepoint"
5b82a1b0
MD
51 " probe to kernel_sched_wakeup_new\n");
52 goto fail_deprobe;
53 }
54
38516ab5 55 ret = register_trace_sched_switch(probe_sched_switch, NULL);
5b82a1b0 56 if (ret) {
b07c3f19 57 pr_info("sched trace: Couldn't activate tracepoint"
73d8b8bc 58 " probe to kernel_sched_switch\n");
5b82a1b0
MD
59 goto fail_deprobe_wake_new;
60 }
61
62 return ret;
63fail_deprobe_wake_new:
38516ab5 64 unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
5b82a1b0 65fail_deprobe:
38516ab5 66 unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0
MD
67 return ret;
68}
69
70static void tracing_sched_unregister(void)
71{
38516ab5
SR
72 unregister_trace_sched_switch(probe_sched_switch, NULL);
73 unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
74 unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
5b82a1b0
MD
75}
76
f2252935 77static void tracing_start_sched_switch(void)
5b82a1b0 78{
efade6e7 79 mutex_lock(&sched_register_mutex);
e168e051 80 if (!(sched_ref++))
5b82a1b0 81 tracing_sched_register();
efade6e7 82 mutex_unlock(&sched_register_mutex);
5b82a1b0
MD
83}
84
f2252935 85static void tracing_stop_sched_switch(void)
5b82a1b0 86{
efade6e7 87 mutex_lock(&sched_register_mutex);
e168e051 88 if (!(--sched_ref))
5b82a1b0 89 tracing_sched_unregister();
efade6e7 90 mutex_unlock(&sched_register_mutex);
5b82a1b0
MD
91}
92
41bc8144
SR
93void tracing_start_cmdline_record(void)
94{
95 tracing_start_sched_switch();
96}
97
98void tracing_stop_cmdline_record(void)
99{
100 tracing_stop_sched_switch();
101}