162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * Like the headers that use TRACE_EVENT(), the TRACE_CUSTOM_EVENT()
562306a36Sopenharmony_ci * needs a header that allows for multiple inclusions.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Test for a unique name (here we have _TRACE_CUSTOM_SCHED_H),
862306a36Sopenharmony_ci * also allowing to continue if TRACE_CUSTOM_MULTI_READ is defined.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#if !defined(_TRACE_CUSTOM_SCHED_H) || defined(TRACE_CUSTOM_MULTI_READ)
1162306a36Sopenharmony_ci#define _TRACE_CUSTOM_SCHED_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* Include linux/trace_events.h for initial defines of TRACE_CUSTOM_EVENT() */
1462306a36Sopenharmony_ci#include <linux/trace_events.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * TRACE_CUSTOM_EVENT() is just like TRACE_EVENT(). The first parameter
1862306a36Sopenharmony_ci * is the event name of an existing event where the TRACE_EVENT has been included
1962306a36Sopenharmony_ci * in the C file before including this file.
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_ciTRACE_CUSTOM_EVENT(sched_switch,
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	/*
2462306a36Sopenharmony_ci	 * The TP_PROTO() and TP_ARGS must match the trace event
2562306a36Sopenharmony_ci	 * that the custom event is using.
2662306a36Sopenharmony_ci	 */
2762306a36Sopenharmony_ci	TP_PROTO(bool preempt,
2862306a36Sopenharmony_ci		 struct task_struct *prev,
2962306a36Sopenharmony_ci		 struct task_struct *next,
3062306a36Sopenharmony_ci		 unsigned int prev_state),
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	TP_ARGS(preempt, prev, next, prev_state),
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	/*
3562306a36Sopenharmony_ci	 * The next fields are where the customization happens.
3662306a36Sopenharmony_ci	 * The TP_STRUCT__entry() defines what will be recorded
3762306a36Sopenharmony_ci	 * in the ring buffer when the custom event triggers.
3862306a36Sopenharmony_ci	 *
3962306a36Sopenharmony_ci	 * The rest is just like the TRACE_EVENT() macro except that
4062306a36Sopenharmony_ci	 * it uses the custom entry.
4162306a36Sopenharmony_ci	 */
4262306a36Sopenharmony_ci	TP_STRUCT__entry(
4362306a36Sopenharmony_ci		__field(	unsigned short,		prev_prio	)
4462306a36Sopenharmony_ci		__field(	unsigned short,		next_prio	)
4562306a36Sopenharmony_ci		__field(	pid_t,	next_pid			)
4662306a36Sopenharmony_ci	),
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	TP_fast_assign(
4962306a36Sopenharmony_ci		__entry->prev_prio	= prev->prio;
5062306a36Sopenharmony_ci		__entry->next_pid	= next->pid;
5162306a36Sopenharmony_ci		__entry->next_prio	= next->prio;
5262306a36Sopenharmony_ci	),
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	TP_printk("prev_prio=%d next_pid=%d next_prio=%d",
5562306a36Sopenharmony_ci		  __entry->prev_prio, __entry->next_pid, __entry->next_prio)
5662306a36Sopenharmony_ci)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciTRACE_CUSTOM_EVENT(sched_waking,
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	TP_PROTO(struct task_struct *p),
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	TP_ARGS(p),
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	TP_STRUCT__entry(
6662306a36Sopenharmony_ci		__field(	pid_t,			pid	)
6762306a36Sopenharmony_ci		__field(	unsigned short,		prio	)
6862306a36Sopenharmony_ci	),
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	TP_fast_assign(
7162306a36Sopenharmony_ci		__entry->pid	= p->pid;
7262306a36Sopenharmony_ci		__entry->prio	= p->prio;
7362306a36Sopenharmony_ci	),
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	TP_printk("pid=%d prio=%d", __entry->pid, __entry->prio)
7662306a36Sopenharmony_ci)
7762306a36Sopenharmony_ci#endif
7862306a36Sopenharmony_ci/*
7962306a36Sopenharmony_ci * Just like the headers that create TRACE_EVENTs, the below must
8062306a36Sopenharmony_ci * be outside the protection of the above #if block.
8162306a36Sopenharmony_ci */
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/*
8462306a36Sopenharmony_ci * It is required that the Makefile includes:
8562306a36Sopenharmony_ci *    CFLAGS_<c_file>.o := -I$(src)
8662306a36Sopenharmony_ci */
8762306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
8862306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
8962306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * It is requred that the TRACE_INCLUDE_FILE be the same
9362306a36Sopenharmony_ci * as this file without the ".h".
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_custom_sched
9662306a36Sopenharmony_ci#include <trace/define_custom_trace.h>
97