1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM timer 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_TIMER_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/tracepoint.h> 9*4882a593Smuzhiyun #include <linux/hrtimer.h> 10*4882a593Smuzhiyun #include <linux/timer.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun DECLARE_EVENT_CLASS(timer_class, 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer), 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun TP_ARGS(timer), 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun TP_STRUCT__entry( 19*4882a593Smuzhiyun __field( void *, timer ) 20*4882a593Smuzhiyun ), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_fast_assign( 23*4882a593Smuzhiyun __entry->timer = timer; 24*4882a593Smuzhiyun ), 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun TP_printk("timer=%p", __entry->timer) 27*4882a593Smuzhiyun ); 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /** 30*4882a593Smuzhiyun * timer_init - called when the timer is initialized 31*4882a593Smuzhiyun * @timer: pointer to struct timer_list 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun DEFINE_EVENT(timer_class, timer_init, 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer), 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TP_ARGS(timer) 38*4882a593Smuzhiyun ); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define decode_timer_flags(flags) \ 41*4882a593Smuzhiyun __print_flags(flags, "|", \ 42*4882a593Smuzhiyun { TIMER_MIGRATING, "M" }, \ 43*4882a593Smuzhiyun { TIMER_DEFERRABLE, "D" }, \ 44*4882a593Smuzhiyun { TIMER_PINNED, "P" }, \ 45*4882a593Smuzhiyun { TIMER_IRQSAFE, "I" }) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /** 48*4882a593Smuzhiyun * timer_start - called when the timer is started 49*4882a593Smuzhiyun * @timer: pointer to struct timer_list 50*4882a593Smuzhiyun * @expires: the timers expiry time 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun TRACE_EVENT(timer_start, 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer, 55*4882a593Smuzhiyun unsigned long expires, 56*4882a593Smuzhiyun unsigned int flags), 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TP_ARGS(timer, expires, flags), 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun TP_STRUCT__entry( 61*4882a593Smuzhiyun __field( void *, timer ) 62*4882a593Smuzhiyun __field( void *, function ) 63*4882a593Smuzhiyun __field( unsigned long, expires ) 64*4882a593Smuzhiyun __field( unsigned long, now ) 65*4882a593Smuzhiyun __field( unsigned int, flags ) 66*4882a593Smuzhiyun ), 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun TP_fast_assign( 69*4882a593Smuzhiyun __entry->timer = timer; 70*4882a593Smuzhiyun __entry->function = timer->function; 71*4882a593Smuzhiyun __entry->expires = expires; 72*4882a593Smuzhiyun __entry->now = jiffies; 73*4882a593Smuzhiyun __entry->flags = flags; 74*4882a593Smuzhiyun ), 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun TP_printk("timer=%p function=%ps expires=%lu [timeout=%ld] cpu=%u idx=%u flags=%s", 77*4882a593Smuzhiyun __entry->timer, __entry->function, __entry->expires, 78*4882a593Smuzhiyun (long)__entry->expires - __entry->now, 79*4882a593Smuzhiyun __entry->flags & TIMER_CPUMASK, 80*4882a593Smuzhiyun __entry->flags >> TIMER_ARRAYSHIFT, 81*4882a593Smuzhiyun decode_timer_flags(__entry->flags & TIMER_TRACE_FLAGMASK)) 82*4882a593Smuzhiyun ); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /** 85*4882a593Smuzhiyun * timer_expire_entry - called immediately before the timer callback 86*4882a593Smuzhiyun * @timer: pointer to struct timer_list 87*4882a593Smuzhiyun * 88*4882a593Smuzhiyun * Allows to determine the timer latency. 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun TRACE_EVENT(timer_expire_entry, 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer, unsigned long baseclk), 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun TP_ARGS(timer, baseclk), 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun TP_STRUCT__entry( 97*4882a593Smuzhiyun __field( void *, timer ) 98*4882a593Smuzhiyun __field( unsigned long, now ) 99*4882a593Smuzhiyun __field( void *, function) 100*4882a593Smuzhiyun __field( unsigned long, baseclk ) 101*4882a593Smuzhiyun ), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_fast_assign( 104*4882a593Smuzhiyun __entry->timer = timer; 105*4882a593Smuzhiyun __entry->now = jiffies; 106*4882a593Smuzhiyun __entry->function = timer->function; 107*4882a593Smuzhiyun __entry->baseclk = baseclk; 108*4882a593Smuzhiyun ), 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun TP_printk("timer=%p function=%ps now=%lu baseclk=%lu", 111*4882a593Smuzhiyun __entry->timer, __entry->function, __entry->now, 112*4882a593Smuzhiyun __entry->baseclk) 113*4882a593Smuzhiyun ); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /** 116*4882a593Smuzhiyun * timer_expire_exit - called immediately after the timer callback returns 117*4882a593Smuzhiyun * @timer: pointer to struct timer_list 118*4882a593Smuzhiyun * 119*4882a593Smuzhiyun * When used in combination with the timer_expire_entry tracepoint we can 120*4882a593Smuzhiyun * determine the runtime of the timer callback function. 121*4882a593Smuzhiyun * 122*4882a593Smuzhiyun * NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might 123*4882a593Smuzhiyun * be invalid. We solely track the pointer. 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun DEFINE_EVENT(timer_class, timer_expire_exit, 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer), 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun TP_ARGS(timer) 130*4882a593Smuzhiyun ); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /** 133*4882a593Smuzhiyun * timer_cancel - called when the timer is canceled 134*4882a593Smuzhiyun * @timer: pointer to struct timer_list 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun DEFINE_EVENT(timer_class, timer_cancel, 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun TP_PROTO(struct timer_list *timer), 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun TP_ARGS(timer) 141*4882a593Smuzhiyun ); 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define decode_clockid(type) \ 144*4882a593Smuzhiyun __print_symbolic(type, \ 145*4882a593Smuzhiyun { CLOCK_REALTIME, "CLOCK_REALTIME" }, \ 146*4882a593Smuzhiyun { CLOCK_MONOTONIC, "CLOCK_MONOTONIC" }, \ 147*4882a593Smuzhiyun { CLOCK_BOOTTIME, "CLOCK_BOOTTIME" }, \ 148*4882a593Smuzhiyun { CLOCK_TAI, "CLOCK_TAI" }) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define decode_hrtimer_mode(mode) \ 151*4882a593Smuzhiyun __print_symbolic(mode, \ 152*4882a593Smuzhiyun { HRTIMER_MODE_ABS, "ABS" }, \ 153*4882a593Smuzhiyun { HRTIMER_MODE_REL, "REL" }, \ 154*4882a593Smuzhiyun { HRTIMER_MODE_ABS_PINNED, "ABS|PINNED" }, \ 155*4882a593Smuzhiyun { HRTIMER_MODE_REL_PINNED, "REL|PINNED" }, \ 156*4882a593Smuzhiyun { HRTIMER_MODE_ABS_SOFT, "ABS|SOFT" }, \ 157*4882a593Smuzhiyun { HRTIMER_MODE_REL_SOFT, "REL|SOFT" }, \ 158*4882a593Smuzhiyun { HRTIMER_MODE_ABS_PINNED_SOFT, "ABS|PINNED|SOFT" }, \ 159*4882a593Smuzhiyun { HRTIMER_MODE_REL_PINNED_SOFT, "REL|PINNED|SOFT" }) 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /** 162*4882a593Smuzhiyun * hrtimer_init - called when the hrtimer is initialized 163*4882a593Smuzhiyun * @hrtimer: pointer to struct hrtimer 164*4882a593Smuzhiyun * @clockid: the hrtimers clock 165*4882a593Smuzhiyun * @mode: the hrtimers mode 166*4882a593Smuzhiyun */ 167*4882a593Smuzhiyun TRACE_EVENT(hrtimer_init, 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer, clockid_t clockid, 170*4882a593Smuzhiyun enum hrtimer_mode mode), 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun TP_ARGS(hrtimer, clockid, mode), 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun TP_STRUCT__entry( 175*4882a593Smuzhiyun __field( void *, hrtimer ) 176*4882a593Smuzhiyun __field( clockid_t, clockid ) 177*4882a593Smuzhiyun __field( enum hrtimer_mode, mode ) 178*4882a593Smuzhiyun ), 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun TP_fast_assign( 181*4882a593Smuzhiyun __entry->hrtimer = hrtimer; 182*4882a593Smuzhiyun __entry->clockid = clockid; 183*4882a593Smuzhiyun __entry->mode = mode; 184*4882a593Smuzhiyun ), 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer, 187*4882a593Smuzhiyun decode_clockid(__entry->clockid), 188*4882a593Smuzhiyun decode_hrtimer_mode(__entry->mode)) 189*4882a593Smuzhiyun ); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /** 192*4882a593Smuzhiyun * hrtimer_start - called when the hrtimer is started 193*4882a593Smuzhiyun * @hrtimer: pointer to struct hrtimer 194*4882a593Smuzhiyun */ 195*4882a593Smuzhiyun TRACE_EVENT(hrtimer_start, 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer, enum hrtimer_mode mode), 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun TP_ARGS(hrtimer, mode), 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun TP_STRUCT__entry( 202*4882a593Smuzhiyun __field( void *, hrtimer ) 203*4882a593Smuzhiyun __field( void *, function ) 204*4882a593Smuzhiyun __field( s64, expires ) 205*4882a593Smuzhiyun __field( s64, softexpires ) 206*4882a593Smuzhiyun __field( enum hrtimer_mode, mode ) 207*4882a593Smuzhiyun ), 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun TP_fast_assign( 210*4882a593Smuzhiyun __entry->hrtimer = hrtimer; 211*4882a593Smuzhiyun __entry->function = hrtimer->function; 212*4882a593Smuzhiyun __entry->expires = hrtimer_get_expires(hrtimer); 213*4882a593Smuzhiyun __entry->softexpires = hrtimer_get_softexpires(hrtimer); 214*4882a593Smuzhiyun __entry->mode = mode; 215*4882a593Smuzhiyun ), 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun TP_printk("hrtimer=%p function=%ps expires=%llu softexpires=%llu " 218*4882a593Smuzhiyun "mode=%s", __entry->hrtimer, __entry->function, 219*4882a593Smuzhiyun (unsigned long long) __entry->expires, 220*4882a593Smuzhiyun (unsigned long long) __entry->softexpires, 221*4882a593Smuzhiyun decode_hrtimer_mode(__entry->mode)) 222*4882a593Smuzhiyun ); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /** 225*4882a593Smuzhiyun * hrtimer_expire_entry - called immediately before the hrtimer callback 226*4882a593Smuzhiyun * @hrtimer: pointer to struct hrtimer 227*4882a593Smuzhiyun * @now: pointer to variable which contains current time of the 228*4882a593Smuzhiyun * timers base. 229*4882a593Smuzhiyun * 230*4882a593Smuzhiyun * Allows to determine the timer latency. 231*4882a593Smuzhiyun */ 232*4882a593Smuzhiyun TRACE_EVENT(hrtimer_expire_entry, 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer, ktime_t *now), 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun TP_ARGS(hrtimer, now), 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun TP_STRUCT__entry( 239*4882a593Smuzhiyun __field( void *, hrtimer ) 240*4882a593Smuzhiyun __field( s64, now ) 241*4882a593Smuzhiyun __field( void *, function) 242*4882a593Smuzhiyun ), 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun TP_fast_assign( 245*4882a593Smuzhiyun __entry->hrtimer = hrtimer; 246*4882a593Smuzhiyun __entry->now = *now; 247*4882a593Smuzhiyun __entry->function = hrtimer->function; 248*4882a593Smuzhiyun ), 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun TP_printk("hrtimer=%p function=%ps now=%llu", 251*4882a593Smuzhiyun __entry->hrtimer, __entry->function, 252*4882a593Smuzhiyun (unsigned long long) __entry->now) 253*4882a593Smuzhiyun ); 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun DECLARE_EVENT_CLASS(hrtimer_class, 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer), 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun TP_ARGS(hrtimer), 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun TP_STRUCT__entry( 262*4882a593Smuzhiyun __field( void *, hrtimer ) 263*4882a593Smuzhiyun ), 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun TP_fast_assign( 266*4882a593Smuzhiyun __entry->hrtimer = hrtimer; 267*4882a593Smuzhiyun ), 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun TP_printk("hrtimer=%p", __entry->hrtimer) 270*4882a593Smuzhiyun ); 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /** 273*4882a593Smuzhiyun * hrtimer_expire_exit - called immediately after the hrtimer callback returns 274*4882a593Smuzhiyun * @hrtimer: pointer to struct hrtimer 275*4882a593Smuzhiyun * 276*4882a593Smuzhiyun * When used in combination with the hrtimer_expire_entry tracepoint we can 277*4882a593Smuzhiyun * determine the runtime of the callback function. 278*4882a593Smuzhiyun */ 279*4882a593Smuzhiyun DEFINE_EVENT(hrtimer_class, hrtimer_expire_exit, 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer), 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun TP_ARGS(hrtimer) 284*4882a593Smuzhiyun ); 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /** 287*4882a593Smuzhiyun * hrtimer_cancel - called when the hrtimer is canceled 288*4882a593Smuzhiyun * @hrtimer: pointer to struct hrtimer 289*4882a593Smuzhiyun */ 290*4882a593Smuzhiyun DEFINE_EVENT(hrtimer_class, hrtimer_cancel, 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun TP_PROTO(struct hrtimer *hrtimer), 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun TP_ARGS(hrtimer) 295*4882a593Smuzhiyun ); 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /** 298*4882a593Smuzhiyun * itimer_state - called when itimer is started or canceled 299*4882a593Smuzhiyun * @which: name of the interval timer 300*4882a593Smuzhiyun * @value: the itimers value, itimer is canceled if value->it_value is 301*4882a593Smuzhiyun * zero, otherwise it is started 302*4882a593Smuzhiyun * @expires: the itimers expiry time 303*4882a593Smuzhiyun */ 304*4882a593Smuzhiyun TRACE_EVENT(itimer_state, 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun TP_PROTO(int which, const struct itimerspec64 *const value, 307*4882a593Smuzhiyun unsigned long long expires), 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun TP_ARGS(which, value, expires), 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun TP_STRUCT__entry( 312*4882a593Smuzhiyun __field( int, which ) 313*4882a593Smuzhiyun __field( unsigned long long, expires ) 314*4882a593Smuzhiyun __field( long, value_sec ) 315*4882a593Smuzhiyun __field( long, value_nsec ) 316*4882a593Smuzhiyun __field( long, interval_sec ) 317*4882a593Smuzhiyun __field( long, interval_nsec ) 318*4882a593Smuzhiyun ), 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun TP_fast_assign( 321*4882a593Smuzhiyun __entry->which = which; 322*4882a593Smuzhiyun __entry->expires = expires; 323*4882a593Smuzhiyun __entry->value_sec = value->it_value.tv_sec; 324*4882a593Smuzhiyun __entry->value_nsec = value->it_value.tv_nsec; 325*4882a593Smuzhiyun __entry->interval_sec = value->it_interval.tv_sec; 326*4882a593Smuzhiyun __entry->interval_nsec = value->it_interval.tv_nsec; 327*4882a593Smuzhiyun ), 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun TP_printk("which=%d expires=%llu it_value=%ld.%06ld it_interval=%ld.%06ld", 330*4882a593Smuzhiyun __entry->which, __entry->expires, 331*4882a593Smuzhiyun __entry->value_sec, __entry->value_nsec / NSEC_PER_USEC, 332*4882a593Smuzhiyun __entry->interval_sec, __entry->interval_nsec / NSEC_PER_USEC) 333*4882a593Smuzhiyun ); 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /** 336*4882a593Smuzhiyun * itimer_expire - called when itimer expires 337*4882a593Smuzhiyun * @which: type of the interval timer 338*4882a593Smuzhiyun * @pid: pid of the process which owns the timer 339*4882a593Smuzhiyun * @now: current time, used to calculate the latency of itimer 340*4882a593Smuzhiyun */ 341*4882a593Smuzhiyun TRACE_EVENT(itimer_expire, 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun TP_PROTO(int which, struct pid *pid, unsigned long long now), 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun TP_ARGS(which, pid, now), 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun TP_STRUCT__entry( 348*4882a593Smuzhiyun __field( int , which ) 349*4882a593Smuzhiyun __field( pid_t, pid ) 350*4882a593Smuzhiyun __field( unsigned long long, now ) 351*4882a593Smuzhiyun ), 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun TP_fast_assign( 354*4882a593Smuzhiyun __entry->which = which; 355*4882a593Smuzhiyun __entry->now = now; 356*4882a593Smuzhiyun __entry->pid = pid_nr(pid); 357*4882a593Smuzhiyun ), 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun TP_printk("which=%d pid=%d now=%llu", __entry->which, 360*4882a593Smuzhiyun (int) __entry->pid, __entry->now) 361*4882a593Smuzhiyun ); 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun #ifdef CONFIG_NO_HZ_COMMON 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun #define TICK_DEP_NAMES \ 366*4882a593Smuzhiyun tick_dep_mask_name(NONE) \ 367*4882a593Smuzhiyun tick_dep_name(POSIX_TIMER) \ 368*4882a593Smuzhiyun tick_dep_name(PERF_EVENTS) \ 369*4882a593Smuzhiyun tick_dep_name(SCHED) \ 370*4882a593Smuzhiyun tick_dep_name(CLOCK_UNSTABLE) \ 371*4882a593Smuzhiyun tick_dep_name_end(RCU) 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun #undef tick_dep_name 374*4882a593Smuzhiyun #undef tick_dep_mask_name 375*4882a593Smuzhiyun #undef tick_dep_name_end 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun /* The MASK will convert to their bits and they need to be processed too */ 378*4882a593Smuzhiyun #define tick_dep_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 379*4882a593Smuzhiyun TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 380*4882a593Smuzhiyun #define tick_dep_name_end(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 381*4882a593Smuzhiyun TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 382*4882a593Smuzhiyun /* NONE only has a mask defined for it */ 383*4882a593Smuzhiyun #define tick_dep_mask_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun TICK_DEP_NAMES 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun #undef tick_dep_name 388*4882a593Smuzhiyun #undef tick_dep_mask_name 389*4882a593Smuzhiyun #undef tick_dep_name_end 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun #define tick_dep_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 392*4882a593Smuzhiyun #define tick_dep_mask_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 393*4882a593Smuzhiyun #define tick_dep_name_end(sdep) { TICK_DEP_MASK_##sdep, #sdep } 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun #define show_tick_dep_name(val) \ 396*4882a593Smuzhiyun __print_symbolic(val, TICK_DEP_NAMES) 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun TRACE_EVENT(tick_stop, 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun TP_PROTO(int success, int dependency), 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun TP_ARGS(success, dependency), 403*4882a593Smuzhiyun 404*4882a593Smuzhiyun TP_STRUCT__entry( 405*4882a593Smuzhiyun __field( int , success ) 406*4882a593Smuzhiyun __field( int , dependency ) 407*4882a593Smuzhiyun ), 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun TP_fast_assign( 410*4882a593Smuzhiyun __entry->success = success; 411*4882a593Smuzhiyun __entry->dependency = dependency; 412*4882a593Smuzhiyun ), 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun TP_printk("success=%d dependency=%s", __entry->success, \ 415*4882a593Smuzhiyun show_tick_dep_name(__entry->dependency)) 416*4882a593Smuzhiyun ); 417*4882a593Smuzhiyun #endif 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #endif /* _TRACE_TIMER_H */ 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun /* This part must be outside protection */ 422*4882a593Smuzhiyun #include <trace/define_trace.h> 423