1*2b022e3dSXiao Guangrong #undef TRACE_SYSTEM 2*2b022e3dSXiao Guangrong #define TRACE_SYSTEM timer 3*2b022e3dSXiao Guangrong 4*2b022e3dSXiao Guangrong #if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ) 5*2b022e3dSXiao Guangrong #define _TRACE_TIMER_H 6*2b022e3dSXiao Guangrong 7*2b022e3dSXiao Guangrong #include <linux/tracepoint.h> 8*2b022e3dSXiao Guangrong #include <linux/timer.h> 9*2b022e3dSXiao Guangrong 10*2b022e3dSXiao Guangrong /** 11*2b022e3dSXiao Guangrong * timer_init - called when the timer is initialized 12*2b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 13*2b022e3dSXiao Guangrong */ 14*2b022e3dSXiao Guangrong TRACE_EVENT(timer_init, 15*2b022e3dSXiao Guangrong 16*2b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 17*2b022e3dSXiao Guangrong 18*2b022e3dSXiao Guangrong TP_ARGS(timer), 19*2b022e3dSXiao Guangrong 20*2b022e3dSXiao Guangrong TP_STRUCT__entry( 21*2b022e3dSXiao Guangrong __field( void *, timer ) 22*2b022e3dSXiao Guangrong ), 23*2b022e3dSXiao Guangrong 24*2b022e3dSXiao Guangrong TP_fast_assign( 25*2b022e3dSXiao Guangrong __entry->timer = timer; 26*2b022e3dSXiao Guangrong ), 27*2b022e3dSXiao Guangrong 28*2b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 29*2b022e3dSXiao Guangrong ); 30*2b022e3dSXiao Guangrong 31*2b022e3dSXiao Guangrong /** 32*2b022e3dSXiao Guangrong * timer_start - called when the timer is started 33*2b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 34*2b022e3dSXiao Guangrong * @expires: the timers expiry time 35*2b022e3dSXiao Guangrong */ 36*2b022e3dSXiao Guangrong TRACE_EVENT(timer_start, 37*2b022e3dSXiao Guangrong 38*2b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer, unsigned long expires), 39*2b022e3dSXiao Guangrong 40*2b022e3dSXiao Guangrong TP_ARGS(timer, expires), 41*2b022e3dSXiao Guangrong 42*2b022e3dSXiao Guangrong TP_STRUCT__entry( 43*2b022e3dSXiao Guangrong __field( void *, timer ) 44*2b022e3dSXiao Guangrong __field( void *, function ) 45*2b022e3dSXiao Guangrong __field( unsigned long, expires ) 46*2b022e3dSXiao Guangrong __field( unsigned long, now ) 47*2b022e3dSXiao Guangrong ), 48*2b022e3dSXiao Guangrong 49*2b022e3dSXiao Guangrong TP_fast_assign( 50*2b022e3dSXiao Guangrong __entry->timer = timer; 51*2b022e3dSXiao Guangrong __entry->function = timer->function; 52*2b022e3dSXiao Guangrong __entry->expires = expires; 53*2b022e3dSXiao Guangrong __entry->now = jiffies; 54*2b022e3dSXiao Guangrong ), 55*2b022e3dSXiao Guangrong 56*2b022e3dSXiao Guangrong TP_printk("timer %p: func %pf, expires %lu, timeout %ld", 57*2b022e3dSXiao Guangrong __entry->timer, __entry->function, __entry->expires, 58*2b022e3dSXiao Guangrong (long)__entry->expires - __entry->now) 59*2b022e3dSXiao Guangrong ); 60*2b022e3dSXiao Guangrong 61*2b022e3dSXiao Guangrong /** 62*2b022e3dSXiao Guangrong * timer_expire_entry - called immediately before the timer callback 63*2b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 64*2b022e3dSXiao Guangrong * 65*2b022e3dSXiao Guangrong * Allows to determine the timer latency. 66*2b022e3dSXiao Guangrong */ 67*2b022e3dSXiao Guangrong TRACE_EVENT(timer_expire_entry, 68*2b022e3dSXiao Guangrong 69*2b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 70*2b022e3dSXiao Guangrong 71*2b022e3dSXiao Guangrong TP_ARGS(timer), 72*2b022e3dSXiao Guangrong 73*2b022e3dSXiao Guangrong TP_STRUCT__entry( 74*2b022e3dSXiao Guangrong __field( void *, timer ) 75*2b022e3dSXiao Guangrong __field( unsigned long, now ) 76*2b022e3dSXiao Guangrong ), 77*2b022e3dSXiao Guangrong 78*2b022e3dSXiao Guangrong TP_fast_assign( 79*2b022e3dSXiao Guangrong __entry->timer = timer; 80*2b022e3dSXiao Guangrong __entry->now = jiffies; 81*2b022e3dSXiao Guangrong ), 82*2b022e3dSXiao Guangrong 83*2b022e3dSXiao Guangrong TP_printk("timer %p: now %lu", __entry->timer, __entry->now) 84*2b022e3dSXiao Guangrong ); 85*2b022e3dSXiao Guangrong 86*2b022e3dSXiao Guangrong /** 87*2b022e3dSXiao Guangrong * timer_expire_exit - called immediately after the timer callback returns 88*2b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 89*2b022e3dSXiao Guangrong * 90*2b022e3dSXiao Guangrong * When used in combination with the timer_expire_entry tracepoint we can 91*2b022e3dSXiao Guangrong * determine the runtime of the timer callback function. 92*2b022e3dSXiao Guangrong * 93*2b022e3dSXiao Guangrong * NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might 94*2b022e3dSXiao Guangrong * be invalid. We solely track the pointer. 95*2b022e3dSXiao Guangrong */ 96*2b022e3dSXiao Guangrong TRACE_EVENT(timer_expire_exit, 97*2b022e3dSXiao Guangrong 98*2b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 99*2b022e3dSXiao Guangrong 100*2b022e3dSXiao Guangrong TP_ARGS(timer), 101*2b022e3dSXiao Guangrong 102*2b022e3dSXiao Guangrong TP_STRUCT__entry( 103*2b022e3dSXiao Guangrong __field(void *, timer ) 104*2b022e3dSXiao Guangrong ), 105*2b022e3dSXiao Guangrong 106*2b022e3dSXiao Guangrong TP_fast_assign( 107*2b022e3dSXiao Guangrong __entry->timer = timer; 108*2b022e3dSXiao Guangrong ), 109*2b022e3dSXiao Guangrong 110*2b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 111*2b022e3dSXiao Guangrong ); 112*2b022e3dSXiao Guangrong 113*2b022e3dSXiao Guangrong /** 114*2b022e3dSXiao Guangrong * timer_cancel - called when the timer is canceled 115*2b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 116*2b022e3dSXiao Guangrong */ 117*2b022e3dSXiao Guangrong TRACE_EVENT(timer_cancel, 118*2b022e3dSXiao Guangrong 119*2b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 120*2b022e3dSXiao Guangrong 121*2b022e3dSXiao Guangrong TP_ARGS(timer), 122*2b022e3dSXiao Guangrong 123*2b022e3dSXiao Guangrong TP_STRUCT__entry( 124*2b022e3dSXiao Guangrong __field( void *, timer ) 125*2b022e3dSXiao Guangrong ), 126*2b022e3dSXiao Guangrong 127*2b022e3dSXiao Guangrong TP_fast_assign( 128*2b022e3dSXiao Guangrong __entry->timer = timer; 129*2b022e3dSXiao Guangrong ), 130*2b022e3dSXiao Guangrong 131*2b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 132*2b022e3dSXiao Guangrong ); 133*2b022e3dSXiao Guangrong 134*2b022e3dSXiao Guangrong #endif /* _TRACE_TIMER_H */ 135*2b022e3dSXiao Guangrong 136*2b022e3dSXiao Guangrong /* This part must be outside protection */ 137*2b022e3dSXiao Guangrong #include <trace/define_trace.h> 138