12b022e3dSXiao Guangrong #undef TRACE_SYSTEM 22b022e3dSXiao Guangrong #define TRACE_SYSTEM timer 32b022e3dSXiao Guangrong 42b022e3dSXiao Guangrong #if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ) 52b022e3dSXiao Guangrong #define _TRACE_TIMER_H 62b022e3dSXiao Guangrong 72b022e3dSXiao Guangrong #include <linux/tracepoint.h> 8*c6a2a177SXiao Guangrong #include <linux/hrtimer.h> 92b022e3dSXiao Guangrong #include <linux/timer.h> 102b022e3dSXiao Guangrong 112b022e3dSXiao Guangrong /** 122b022e3dSXiao Guangrong * timer_init - called when the timer is initialized 132b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 142b022e3dSXiao Guangrong */ 152b022e3dSXiao Guangrong TRACE_EVENT(timer_init, 162b022e3dSXiao Guangrong 172b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 182b022e3dSXiao Guangrong 192b022e3dSXiao Guangrong TP_ARGS(timer), 202b022e3dSXiao Guangrong 212b022e3dSXiao Guangrong TP_STRUCT__entry( 222b022e3dSXiao Guangrong __field( void *, timer ) 232b022e3dSXiao Guangrong ), 242b022e3dSXiao Guangrong 252b022e3dSXiao Guangrong TP_fast_assign( 262b022e3dSXiao Guangrong __entry->timer = timer; 272b022e3dSXiao Guangrong ), 282b022e3dSXiao Guangrong 292b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 302b022e3dSXiao Guangrong ); 312b022e3dSXiao Guangrong 322b022e3dSXiao Guangrong /** 332b022e3dSXiao Guangrong * timer_start - called when the timer is started 342b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 352b022e3dSXiao Guangrong * @expires: the timers expiry time 362b022e3dSXiao Guangrong */ 372b022e3dSXiao Guangrong TRACE_EVENT(timer_start, 382b022e3dSXiao Guangrong 392b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer, unsigned long expires), 402b022e3dSXiao Guangrong 412b022e3dSXiao Guangrong TP_ARGS(timer, expires), 422b022e3dSXiao Guangrong 432b022e3dSXiao Guangrong TP_STRUCT__entry( 442b022e3dSXiao Guangrong __field( void *, timer ) 452b022e3dSXiao Guangrong __field( void *, function ) 462b022e3dSXiao Guangrong __field( unsigned long, expires ) 472b022e3dSXiao Guangrong __field( unsigned long, now ) 482b022e3dSXiao Guangrong ), 492b022e3dSXiao Guangrong 502b022e3dSXiao Guangrong TP_fast_assign( 512b022e3dSXiao Guangrong __entry->timer = timer; 522b022e3dSXiao Guangrong __entry->function = timer->function; 532b022e3dSXiao Guangrong __entry->expires = expires; 542b022e3dSXiao Guangrong __entry->now = jiffies; 552b022e3dSXiao Guangrong ), 562b022e3dSXiao Guangrong 572b022e3dSXiao Guangrong TP_printk("timer %p: func %pf, expires %lu, timeout %ld", 582b022e3dSXiao Guangrong __entry->timer, __entry->function, __entry->expires, 592b022e3dSXiao Guangrong (long)__entry->expires - __entry->now) 602b022e3dSXiao Guangrong ); 612b022e3dSXiao Guangrong 622b022e3dSXiao Guangrong /** 632b022e3dSXiao Guangrong * timer_expire_entry - called immediately before the timer callback 642b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 652b022e3dSXiao Guangrong * 662b022e3dSXiao Guangrong * Allows to determine the timer latency. 672b022e3dSXiao Guangrong */ 682b022e3dSXiao Guangrong TRACE_EVENT(timer_expire_entry, 692b022e3dSXiao Guangrong 702b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 712b022e3dSXiao Guangrong 722b022e3dSXiao Guangrong TP_ARGS(timer), 732b022e3dSXiao Guangrong 742b022e3dSXiao Guangrong TP_STRUCT__entry( 752b022e3dSXiao Guangrong __field( void *, timer ) 762b022e3dSXiao Guangrong __field( unsigned long, now ) 772b022e3dSXiao Guangrong ), 782b022e3dSXiao Guangrong 792b022e3dSXiao Guangrong TP_fast_assign( 802b022e3dSXiao Guangrong __entry->timer = timer; 812b022e3dSXiao Guangrong __entry->now = jiffies; 822b022e3dSXiao Guangrong ), 832b022e3dSXiao Guangrong 842b022e3dSXiao Guangrong TP_printk("timer %p: now %lu", __entry->timer, __entry->now) 852b022e3dSXiao Guangrong ); 862b022e3dSXiao Guangrong 872b022e3dSXiao Guangrong /** 882b022e3dSXiao Guangrong * timer_expire_exit - called immediately after the timer callback returns 892b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 902b022e3dSXiao Guangrong * 912b022e3dSXiao Guangrong * When used in combination with the timer_expire_entry tracepoint we can 922b022e3dSXiao Guangrong * determine the runtime of the timer callback function. 932b022e3dSXiao Guangrong * 942b022e3dSXiao Guangrong * NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might 952b022e3dSXiao Guangrong * be invalid. We solely track the pointer. 962b022e3dSXiao Guangrong */ 972b022e3dSXiao Guangrong TRACE_EVENT(timer_expire_exit, 982b022e3dSXiao Guangrong 992b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 1002b022e3dSXiao Guangrong 1012b022e3dSXiao Guangrong TP_ARGS(timer), 1022b022e3dSXiao Guangrong 1032b022e3dSXiao Guangrong TP_STRUCT__entry( 1042b022e3dSXiao Guangrong __field(void *, timer ) 1052b022e3dSXiao Guangrong ), 1062b022e3dSXiao Guangrong 1072b022e3dSXiao Guangrong TP_fast_assign( 1082b022e3dSXiao Guangrong __entry->timer = timer; 1092b022e3dSXiao Guangrong ), 1102b022e3dSXiao Guangrong 1112b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 1122b022e3dSXiao Guangrong ); 1132b022e3dSXiao Guangrong 1142b022e3dSXiao Guangrong /** 1152b022e3dSXiao Guangrong * timer_cancel - called when the timer is canceled 1162b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 1172b022e3dSXiao Guangrong */ 1182b022e3dSXiao Guangrong TRACE_EVENT(timer_cancel, 1192b022e3dSXiao Guangrong 1202b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 1212b022e3dSXiao Guangrong 1222b022e3dSXiao Guangrong TP_ARGS(timer), 1232b022e3dSXiao Guangrong 1242b022e3dSXiao Guangrong TP_STRUCT__entry( 1252b022e3dSXiao Guangrong __field( void *, timer ) 1262b022e3dSXiao Guangrong ), 1272b022e3dSXiao Guangrong 1282b022e3dSXiao Guangrong TP_fast_assign( 1292b022e3dSXiao Guangrong __entry->timer = timer; 1302b022e3dSXiao Guangrong ), 1312b022e3dSXiao Guangrong 1322b022e3dSXiao Guangrong TP_printk("timer %p", __entry->timer) 1332b022e3dSXiao Guangrong ); 1342b022e3dSXiao Guangrong 135*c6a2a177SXiao Guangrong /** 136*c6a2a177SXiao Guangrong * hrtimer_init - called when the hrtimer is initialized 137*c6a2a177SXiao Guangrong * @timer: pointer to struct hrtimer 138*c6a2a177SXiao Guangrong * @clockid: the hrtimers clock 139*c6a2a177SXiao Guangrong * @mode: the hrtimers mode 140*c6a2a177SXiao Guangrong */ 141*c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_init, 142*c6a2a177SXiao Guangrong 143*c6a2a177SXiao Guangrong TP_PROTO(struct hrtimer *timer, clockid_t clockid, 144*c6a2a177SXiao Guangrong enum hrtimer_mode mode), 145*c6a2a177SXiao Guangrong 146*c6a2a177SXiao Guangrong TP_ARGS(timer, clockid, mode), 147*c6a2a177SXiao Guangrong 148*c6a2a177SXiao Guangrong TP_STRUCT__entry( 149*c6a2a177SXiao Guangrong __field( void *, timer ) 150*c6a2a177SXiao Guangrong __field( clockid_t, clockid ) 151*c6a2a177SXiao Guangrong __field( enum hrtimer_mode, mode ) 152*c6a2a177SXiao Guangrong ), 153*c6a2a177SXiao Guangrong 154*c6a2a177SXiao Guangrong TP_fast_assign( 155*c6a2a177SXiao Guangrong __entry->timer = timer; 156*c6a2a177SXiao Guangrong __entry->clockid = clockid; 157*c6a2a177SXiao Guangrong __entry->mode = mode; 158*c6a2a177SXiao Guangrong ), 159*c6a2a177SXiao Guangrong 160*c6a2a177SXiao Guangrong TP_printk("hrtimer %p, clockid %s, mode %s", __entry->timer, 161*c6a2a177SXiao Guangrong __entry->clockid == CLOCK_REALTIME ? 162*c6a2a177SXiao Guangrong "CLOCK_REALTIME" : "CLOCK_MONOTONIC", 163*c6a2a177SXiao Guangrong __entry->mode == HRTIMER_MODE_ABS ? 164*c6a2a177SXiao Guangrong "HRTIMER_MODE_ABS" : "HRTIMER_MODE_REL") 165*c6a2a177SXiao Guangrong ); 166*c6a2a177SXiao Guangrong 167*c6a2a177SXiao Guangrong /** 168*c6a2a177SXiao Guangrong * hrtimer_start - called when the hrtimer is started 169*c6a2a177SXiao Guangrong * @timer: pointer to struct hrtimer 170*c6a2a177SXiao Guangrong */ 171*c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_start, 172*c6a2a177SXiao Guangrong 173*c6a2a177SXiao Guangrong TP_PROTO(struct hrtimer *timer), 174*c6a2a177SXiao Guangrong 175*c6a2a177SXiao Guangrong TP_ARGS(timer), 176*c6a2a177SXiao Guangrong 177*c6a2a177SXiao Guangrong TP_STRUCT__entry( 178*c6a2a177SXiao Guangrong __field( void *, timer ) 179*c6a2a177SXiao Guangrong __field( void *, function ) 180*c6a2a177SXiao Guangrong __field( s64, expires ) 181*c6a2a177SXiao Guangrong __field( s64, softexpires ) 182*c6a2a177SXiao Guangrong ), 183*c6a2a177SXiao Guangrong 184*c6a2a177SXiao Guangrong TP_fast_assign( 185*c6a2a177SXiao Guangrong __entry->timer = timer; 186*c6a2a177SXiao Guangrong __entry->function = timer->function; 187*c6a2a177SXiao Guangrong __entry->expires = hrtimer_get_expires(timer).tv64; 188*c6a2a177SXiao Guangrong __entry->softexpires = hrtimer_get_softexpires(timer).tv64; 189*c6a2a177SXiao Guangrong ), 190*c6a2a177SXiao Guangrong 191*c6a2a177SXiao Guangrong TP_printk("hrtimer %p, func %pf, expires %llu, softexpires %llu", 192*c6a2a177SXiao Guangrong __entry->timer, __entry->function, 193*c6a2a177SXiao Guangrong (unsigned long long)ktime_to_ns((ktime_t) { 194*c6a2a177SXiao Guangrong .tv64 = __entry->expires }), 195*c6a2a177SXiao Guangrong (unsigned long long)ktime_to_ns((ktime_t) { 196*c6a2a177SXiao Guangrong .tv64 = __entry->softexpires })) 197*c6a2a177SXiao Guangrong ); 198*c6a2a177SXiao Guangrong 199*c6a2a177SXiao Guangrong /** 200*c6a2a177SXiao Guangrong * htimmer_expire_entry - called immediately before the hrtimer callback 201*c6a2a177SXiao Guangrong * @timer: pointer to struct hrtimer 202*c6a2a177SXiao Guangrong * @now: pointer to variable which contains current time of the 203*c6a2a177SXiao Guangrong * timers base. 204*c6a2a177SXiao Guangrong * 205*c6a2a177SXiao Guangrong * Allows to determine the timer latency. 206*c6a2a177SXiao Guangrong */ 207*c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_expire_entry, 208*c6a2a177SXiao Guangrong 209*c6a2a177SXiao Guangrong TP_PROTO(struct hrtimer *timer, ktime_t *now), 210*c6a2a177SXiao Guangrong 211*c6a2a177SXiao Guangrong TP_ARGS(timer, now), 212*c6a2a177SXiao Guangrong 213*c6a2a177SXiao Guangrong TP_STRUCT__entry( 214*c6a2a177SXiao Guangrong __field( void *, timer ) 215*c6a2a177SXiao Guangrong __field( s64, now ) 216*c6a2a177SXiao Guangrong ), 217*c6a2a177SXiao Guangrong 218*c6a2a177SXiao Guangrong TP_fast_assign( 219*c6a2a177SXiao Guangrong __entry->timer = timer; 220*c6a2a177SXiao Guangrong __entry->now = now->tv64; 221*c6a2a177SXiao Guangrong ), 222*c6a2a177SXiao Guangrong 223*c6a2a177SXiao Guangrong TP_printk("hrtimer %p, now %llu", __entry->timer, 224*c6a2a177SXiao Guangrong (unsigned long long)ktime_to_ns((ktime_t) { 225*c6a2a177SXiao Guangrong .tv64 = __entry->now })) 226*c6a2a177SXiao Guangrong ); 227*c6a2a177SXiao Guangrong 228*c6a2a177SXiao Guangrong /** 229*c6a2a177SXiao Guangrong * hrtimer_expire_exit - called immediately after the hrtimer callback returns 230*c6a2a177SXiao Guangrong * @timer: pointer to struct hrtimer 231*c6a2a177SXiao Guangrong * 232*c6a2a177SXiao Guangrong * When used in combination with the hrtimer_expire_entry tracepoint we can 233*c6a2a177SXiao Guangrong * determine the runtime of the callback function. 234*c6a2a177SXiao Guangrong */ 235*c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_expire_exit, 236*c6a2a177SXiao Guangrong 237*c6a2a177SXiao Guangrong TP_PROTO(struct hrtimer *timer), 238*c6a2a177SXiao Guangrong 239*c6a2a177SXiao Guangrong TP_ARGS(timer), 240*c6a2a177SXiao Guangrong 241*c6a2a177SXiao Guangrong TP_STRUCT__entry( 242*c6a2a177SXiao Guangrong __field( void *, timer ) 243*c6a2a177SXiao Guangrong ), 244*c6a2a177SXiao Guangrong 245*c6a2a177SXiao Guangrong TP_fast_assign( 246*c6a2a177SXiao Guangrong __entry->timer = timer; 247*c6a2a177SXiao Guangrong ), 248*c6a2a177SXiao Guangrong 249*c6a2a177SXiao Guangrong TP_printk("hrtimer %p", __entry->timer) 250*c6a2a177SXiao Guangrong ); 251*c6a2a177SXiao Guangrong 252*c6a2a177SXiao Guangrong /** 253*c6a2a177SXiao Guangrong * hrtimer_cancel - called when the hrtimer is canceled 254*c6a2a177SXiao Guangrong * @timer: pointer to struct hrtimer 255*c6a2a177SXiao Guangrong */ 256*c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_cancel, 257*c6a2a177SXiao Guangrong 258*c6a2a177SXiao Guangrong TP_PROTO(struct hrtimer *timer), 259*c6a2a177SXiao Guangrong 260*c6a2a177SXiao Guangrong TP_ARGS(timer), 261*c6a2a177SXiao Guangrong 262*c6a2a177SXiao Guangrong TP_STRUCT__entry( 263*c6a2a177SXiao Guangrong __field( void *, timer ) 264*c6a2a177SXiao Guangrong ), 265*c6a2a177SXiao Guangrong 266*c6a2a177SXiao Guangrong TP_fast_assign( 267*c6a2a177SXiao Guangrong __entry->timer = timer; 268*c6a2a177SXiao Guangrong ), 269*c6a2a177SXiao Guangrong 270*c6a2a177SXiao Guangrong TP_printk("hrtimer %p", __entry->timer) 271*c6a2a177SXiao Guangrong ); 272*c6a2a177SXiao Guangrong 2732b022e3dSXiao Guangrong #endif /* _TRACE_TIMER_H */ 2742b022e3dSXiao Guangrong 2752b022e3dSXiao Guangrong /* This part must be outside protection */ 2762b022e3dSXiao Guangrong #include <trace/define_trace.h> 277