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