aboutsummaryrefslogtreecommitdiffstats
path: root/samples/trace_events/trace_custom_sched.h
blob: 951388334a3fa01d8c2ac23b0a4a2c69d5712dfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* SPDX-License-Identifier: GPL-2.0 */

/*
 * Like the headers that use TRACE_EVENT(), the TRACE_CUSTOM_EVENT()
 * needs a header that allows for multiple inclusions.
 *
 * Test for a unique name (here we have _TRACE_CUSTOM_SCHED_H),
 * also allowing to continue if TRACE_CUSTOM_MULTI_READ is defined.
 */
#if !defined(_TRACE_CUSTOM_SCHED_H) || defined(TRACE_CUSTOM_MULTI_READ)
#define _TRACE_CUSTOM_SCHED_H

/* Include linux/trace_events.h for initial defines of TRACE_CUSTOM_EVENT() */
#include <linux/trace_events.h>

/*
 * TRACE_CUSTOM_EVENT() is just like TRACE_EVENT(). The first parameter
 * is the event name of an existing event where the TRACE_EVENT has been included
 * in the C file before including this file.
 */
TRACE_CUSTOM_EVENT(sched_switch,

	/*
	 * The TP_PROTO() and TP_ARGS must match the trace event
	 * that the custom event is using.
	 */
	TP_PROTO(bool preempt,
		 struct task_struct *prev,
		 struct task_struct *next,
		 unsigned int prev_state),

	TP_ARGS(preempt, prev, next, prev_state),

	/*
	 * The next fields are where the customization happens.
	 * The TP_STRUCT__entry() defines what will be recorded
	 * in the ring buffer when the custom event triggers.
	 *
	 * The rest is just like the TRACE_EVENT() macro except that
	 * it uses the custom entry.
	 */
	TP_STRUCT__entry(
		__field(	unsigned short,		prev_prio	)
		__field(	unsigned short,		next_prio	)
		__field(	pid_t,	next_pid			)
	),

	TP_fast_assign(
		__entry->prev_prio	= prev->prio;
		__entry->next_pid	= next->pid;
		__entry->next_prio	= next->prio;
	),

	TP_printk("prev_prio=%d next_pid=%d next_prio=%d",
		  __entry->prev_prio, __entry->next_pid, __entry->next_prio)
)


TRACE_CUSTOM_EVENT(sched_waking,

	TP_PROTO(struct task_struct *p),

	TP_ARGS(p),

	TP_STRUCT__entry(
		__field(	pid_t,			pid	)
		__field(	unsigned short,		prio	)
	),

	TP_fast_assign(
		__entry->pid	= p->pid;
		__entry->prio	= p->prio;
	),

	TP_printk("pid=%d prio=%d", __entry->pid, __entry->prio)
)
#endif
/*
 * Just like the headers that create TRACE_EVENTs, the below must
 * be outside the protection of the above #if block.
 */

/*
 * It is required that the Makefile includes:
 *    CFLAGS_<c_file>.o := -I$(src)
 */
#undef TRACE_INCLUDE_PATH
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_PATH .

/*
 * It is requred that the TRACE_INCLUDE_FILE be the same
 * as this file without the ".h".
 */
#define TRACE_INCLUDE_FILE trace_custom_sched
#include <trace/define_custom_trace.h>