1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22b022e3dSXiao Guangrong #undef TRACE_SYSTEM 32b022e3dSXiao Guangrong #define TRACE_SYSTEM timer 42b022e3dSXiao Guangrong 52b022e3dSXiao Guangrong #if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ) 62b022e3dSXiao Guangrong #define _TRACE_TIMER_H 72b022e3dSXiao Guangrong 82b022e3dSXiao Guangrong #include <linux/tracepoint.h> 9c6a2a177SXiao Guangrong #include <linux/hrtimer.h> 102b022e3dSXiao Guangrong #include <linux/timer.h> 112b022e3dSXiao Guangrong 12363d0f64SLi Zefan DECLARE_EVENT_CLASS(timer_class, 132b022e3dSXiao Guangrong 142b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 152b022e3dSXiao Guangrong 162b022e3dSXiao Guangrong TP_ARGS(timer), 172b022e3dSXiao Guangrong 182b022e3dSXiao Guangrong TP_STRUCT__entry( 192b022e3dSXiao Guangrong __field( void *, timer ) 202b022e3dSXiao Guangrong ), 212b022e3dSXiao Guangrong 222b022e3dSXiao Guangrong TP_fast_assign( 232b022e3dSXiao Guangrong __entry->timer = timer; 242b022e3dSXiao Guangrong ), 252b022e3dSXiao Guangrong 26434a83c3SIngo Molnar TP_printk("timer=%p", __entry->timer) 272b022e3dSXiao Guangrong ); 282b022e3dSXiao Guangrong 292b022e3dSXiao Guangrong /** 30363d0f64SLi Zefan * timer_init - called when the timer is initialized 31363d0f64SLi Zefan * @timer: pointer to struct timer_list 32363d0f64SLi Zefan */ 33363d0f64SLi Zefan DEFINE_EVENT(timer_class, timer_init, 34363d0f64SLi Zefan 35363d0f64SLi Zefan TP_PROTO(struct timer_list *timer), 36363d0f64SLi Zefan 37363d0f64SLi Zefan TP_ARGS(timer) 38363d0f64SLi Zefan ); 39363d0f64SLi Zefan 408a58a34bSThomas Gleixner #define decode_timer_flags(flags) \ 418a58a34bSThomas Gleixner __print_flags(flags, "|", \ 428a58a34bSThomas Gleixner { TIMER_MIGRATING, "M" }, \ 438a58a34bSThomas Gleixner { TIMER_DEFERRABLE, "D" }, \ 448a58a34bSThomas Gleixner { TIMER_PINNED, "P" }, \ 458a58a34bSThomas Gleixner { TIMER_IRQSAFE, "I" }) 468a58a34bSThomas Gleixner 47363d0f64SLi Zefan /** 482b022e3dSXiao Guangrong * timer_start - called when the timer is started 492b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 502b022e3dSXiao Guangrong * @expires: the timers expiry time 512b022e3dSXiao Guangrong */ 522b022e3dSXiao Guangrong TRACE_EVENT(timer_start, 532b022e3dSXiao Guangrong 544e413e85SBadhri Jagan Sridharan TP_PROTO(struct timer_list *timer, 554e413e85SBadhri Jagan Sridharan unsigned long expires, 560eeda71bSThomas Gleixner unsigned int flags), 572b022e3dSXiao Guangrong 580eeda71bSThomas Gleixner TP_ARGS(timer, expires, flags), 592b022e3dSXiao Guangrong 602b022e3dSXiao Guangrong TP_STRUCT__entry( 612b022e3dSXiao Guangrong __field( void *, timer ) 622b022e3dSXiao Guangrong __field( void *, function ) 632b022e3dSXiao Guangrong __field( unsigned long, expires ) 642b022e3dSXiao Guangrong __field( unsigned long, now ) 650eeda71bSThomas Gleixner __field( unsigned int, flags ) 662b022e3dSXiao Guangrong ), 672b022e3dSXiao Guangrong 682b022e3dSXiao Guangrong TP_fast_assign( 692b022e3dSXiao Guangrong __entry->timer = timer; 702b022e3dSXiao Guangrong __entry->function = timer->function; 712b022e3dSXiao Guangrong __entry->expires = expires; 722b022e3dSXiao Guangrong __entry->now = jiffies; 730eeda71bSThomas Gleixner __entry->flags = flags; 742b022e3dSXiao Guangrong ), 752b022e3dSXiao Guangrong 768a58a34bSThomas Gleixner TP_printk("timer=%p function=%pf expires=%lu [timeout=%ld] cpu=%u idx=%u flags=%s", 772b022e3dSXiao Guangrong __entry->timer, __entry->function, __entry->expires, 788a58a34bSThomas Gleixner (long)__entry->expires - __entry->now, 798a58a34bSThomas Gleixner __entry->flags & TIMER_CPUMASK, 808a58a34bSThomas Gleixner __entry->flags >> TIMER_ARRAYSHIFT, 818a58a34bSThomas Gleixner decode_timer_flags(__entry->flags & TIMER_TRACE_FLAGMASK)) 822b022e3dSXiao Guangrong ); 832b022e3dSXiao Guangrong 842b022e3dSXiao Guangrong /** 852b022e3dSXiao Guangrong * timer_expire_entry - called immediately before the timer callback 862b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 872b022e3dSXiao Guangrong * 882b022e3dSXiao Guangrong * Allows to determine the timer latency. 892b022e3dSXiao Guangrong */ 902b022e3dSXiao Guangrong TRACE_EVENT(timer_expire_entry, 912b022e3dSXiao Guangrong 922b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 932b022e3dSXiao Guangrong 942b022e3dSXiao Guangrong TP_ARGS(timer), 952b022e3dSXiao Guangrong 962b022e3dSXiao Guangrong TP_STRUCT__entry( 972b022e3dSXiao Guangrong __field( void *, timer ) 982b022e3dSXiao Guangrong __field( unsigned long, now ) 99ede1b429SArjan van de Ven __field( void *, function) 1002b022e3dSXiao Guangrong ), 1012b022e3dSXiao Guangrong 1022b022e3dSXiao Guangrong TP_fast_assign( 1032b022e3dSXiao Guangrong __entry->timer = timer; 1042b022e3dSXiao Guangrong __entry->now = jiffies; 105ede1b429SArjan van de Ven __entry->function = timer->function; 1062b022e3dSXiao Guangrong ), 1072b022e3dSXiao Guangrong 108ede1b429SArjan van de Ven TP_printk("timer=%p function=%pf now=%lu", __entry->timer, __entry->function,__entry->now) 1092b022e3dSXiao Guangrong ); 1102b022e3dSXiao Guangrong 1112b022e3dSXiao Guangrong /** 1122b022e3dSXiao Guangrong * timer_expire_exit - called immediately after the timer callback returns 1132b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 1142b022e3dSXiao Guangrong * 1152b022e3dSXiao Guangrong * When used in combination with the timer_expire_entry tracepoint we can 1162b022e3dSXiao Guangrong * determine the runtime of the timer callback function. 1172b022e3dSXiao Guangrong * 1182b022e3dSXiao Guangrong * NOTE: Do NOT derefernce timer in TP_fast_assign. The pointer might 1192b022e3dSXiao Guangrong * be invalid. We solely track the pointer. 1202b022e3dSXiao Guangrong */ 121363d0f64SLi Zefan DEFINE_EVENT(timer_class, timer_expire_exit, 1222b022e3dSXiao Guangrong 1232b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 1242b022e3dSXiao Guangrong 125363d0f64SLi Zefan TP_ARGS(timer) 1262b022e3dSXiao Guangrong ); 1272b022e3dSXiao Guangrong 1282b022e3dSXiao Guangrong /** 1292b022e3dSXiao Guangrong * timer_cancel - called when the timer is canceled 1302b022e3dSXiao Guangrong * @timer: pointer to struct timer_list 1312b022e3dSXiao Guangrong */ 132363d0f64SLi Zefan DEFINE_EVENT(timer_class, timer_cancel, 1332b022e3dSXiao Guangrong 1342b022e3dSXiao Guangrong TP_PROTO(struct timer_list *timer), 1352b022e3dSXiao Guangrong 136363d0f64SLi Zefan TP_ARGS(timer) 1372b022e3dSXiao Guangrong ); 1382b022e3dSXiao Guangrong 13991633eedSAnna-Maria Gleixner #define decode_clockid(type) \ 14091633eedSAnna-Maria Gleixner __print_symbolic(type, \ 14191633eedSAnna-Maria Gleixner { CLOCK_REALTIME, "CLOCK_REALTIME" }, \ 14291633eedSAnna-Maria Gleixner { CLOCK_MONOTONIC, "CLOCK_MONOTONIC" }, \ 14391633eedSAnna-Maria Gleixner { CLOCK_BOOTTIME, "CLOCK_BOOTTIME" }, \ 14491633eedSAnna-Maria Gleixner { CLOCK_TAI, "CLOCK_TAI" }) 14591633eedSAnna-Maria Gleixner 14691633eedSAnna-Maria Gleixner #define decode_hrtimer_mode(mode) \ 14791633eedSAnna-Maria Gleixner __print_symbolic(mode, \ 14891633eedSAnna-Maria Gleixner { HRTIMER_MODE_ABS, "ABS" }, \ 14991633eedSAnna-Maria Gleixner { HRTIMER_MODE_REL, "REL" }, \ 15091633eedSAnna-Maria Gleixner { HRTIMER_MODE_ABS_PINNED, "ABS|PINNED" }, \ 15191633eedSAnna-Maria Gleixner { HRTIMER_MODE_REL_PINNED, "REL|PINNED" }) 15291633eedSAnna-Maria Gleixner 153c6a2a177SXiao Guangrong /** 154c6a2a177SXiao Guangrong * hrtimer_init - called when the hrtimer is initialized 155cf2fbdd2SMasanari Iida * @hrtimer: pointer to struct hrtimer 156c6a2a177SXiao Guangrong * @clockid: the hrtimers clock 157c6a2a177SXiao Guangrong * @mode: the hrtimers mode 158c6a2a177SXiao Guangrong */ 159c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_init, 160c6a2a177SXiao Guangrong 161434a83c3SIngo Molnar TP_PROTO(struct hrtimer *hrtimer, clockid_t clockid, 162c6a2a177SXiao Guangrong enum hrtimer_mode mode), 163c6a2a177SXiao Guangrong 164434a83c3SIngo Molnar TP_ARGS(hrtimer, clockid, mode), 165c6a2a177SXiao Guangrong 166c6a2a177SXiao Guangrong TP_STRUCT__entry( 167434a83c3SIngo Molnar __field( void *, hrtimer ) 168c6a2a177SXiao Guangrong __field( clockid_t, clockid ) 169c6a2a177SXiao Guangrong __field( enum hrtimer_mode, mode ) 170c6a2a177SXiao Guangrong ), 171c6a2a177SXiao Guangrong 172c6a2a177SXiao Guangrong TP_fast_assign( 173434a83c3SIngo Molnar __entry->hrtimer = hrtimer; 174c6a2a177SXiao Guangrong __entry->clockid = clockid; 175c6a2a177SXiao Guangrong __entry->mode = mode; 176c6a2a177SXiao Guangrong ), 177c6a2a177SXiao Guangrong 178434a83c3SIngo Molnar TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer, 17991633eedSAnna-Maria Gleixner decode_clockid(__entry->clockid), 18091633eedSAnna-Maria Gleixner decode_hrtimer_mode(__entry->mode)) 181c6a2a177SXiao Guangrong ); 182c6a2a177SXiao Guangrong 183c6a2a177SXiao Guangrong /** 184c6a2a177SXiao Guangrong * hrtimer_start - called when the hrtimer is started 185cf2fbdd2SMasanari Iida * @hrtimer: pointer to struct hrtimer 186c6a2a177SXiao Guangrong */ 187c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_start, 188c6a2a177SXiao Guangrong 189*63e2ed36SAnna-Maria Gleixner TP_PROTO(struct hrtimer *hrtimer, enum hrtimer_mode mode), 190c6a2a177SXiao Guangrong 191*63e2ed36SAnna-Maria Gleixner TP_ARGS(hrtimer, mode), 192c6a2a177SXiao Guangrong 193c6a2a177SXiao Guangrong TP_STRUCT__entry( 194434a83c3SIngo Molnar __field( void *, hrtimer ) 195c6a2a177SXiao Guangrong __field( void *, function ) 196c6a2a177SXiao Guangrong __field( s64, expires ) 197c6a2a177SXiao Guangrong __field( s64, softexpires ) 198*63e2ed36SAnna-Maria Gleixner __field( enum hrtimer_mode, mode ) 199c6a2a177SXiao Guangrong ), 200c6a2a177SXiao Guangrong 201c6a2a177SXiao Guangrong TP_fast_assign( 202434a83c3SIngo Molnar __entry->hrtimer = hrtimer; 203434a83c3SIngo Molnar __entry->function = hrtimer->function; 2042456e855SThomas Gleixner __entry->expires = hrtimer_get_expires(hrtimer); 2052456e855SThomas Gleixner __entry->softexpires = hrtimer_get_softexpires(hrtimer); 206*63e2ed36SAnna-Maria Gleixner __entry->mode = mode; 207c6a2a177SXiao Guangrong ), 208c6a2a177SXiao Guangrong 209*63e2ed36SAnna-Maria Gleixner TP_printk("hrtimer=%p function=%pf expires=%llu softexpires=%llu " 210*63e2ed36SAnna-Maria Gleixner "mode=%s", __entry->hrtimer, __entry->function, 2112456e855SThomas Gleixner (unsigned long long) __entry->expires, 212*63e2ed36SAnna-Maria Gleixner (unsigned long long) __entry->softexpires, 213*63e2ed36SAnna-Maria Gleixner decode_hrtimer_mode(__entry->mode)) 214c6a2a177SXiao Guangrong ); 215c6a2a177SXiao Guangrong 216c6a2a177SXiao Guangrong /** 217cf2fbdd2SMasanari Iida * hrtimer_expire_entry - called immediately before the hrtimer callback 218cf2fbdd2SMasanari Iida * @hrtimer: pointer to struct hrtimer 219c6a2a177SXiao Guangrong * @now: pointer to variable which contains current time of the 220c6a2a177SXiao Guangrong * timers base. 221c6a2a177SXiao Guangrong * 222c6a2a177SXiao Guangrong * Allows to determine the timer latency. 223c6a2a177SXiao Guangrong */ 224c6a2a177SXiao Guangrong TRACE_EVENT(hrtimer_expire_entry, 225c6a2a177SXiao Guangrong 226434a83c3SIngo Molnar TP_PROTO(struct hrtimer *hrtimer, ktime_t *now), 227c6a2a177SXiao Guangrong 228434a83c3SIngo Molnar TP_ARGS(hrtimer, now), 229c6a2a177SXiao Guangrong 230c6a2a177SXiao Guangrong TP_STRUCT__entry( 231434a83c3SIngo Molnar __field( void *, hrtimer ) 232c6a2a177SXiao Guangrong __field( s64, now ) 233ede1b429SArjan van de Ven __field( void *, function) 234c6a2a177SXiao Guangrong ), 235c6a2a177SXiao Guangrong 236c6a2a177SXiao Guangrong TP_fast_assign( 237434a83c3SIngo Molnar __entry->hrtimer = hrtimer; 2382456e855SThomas Gleixner __entry->now = *now; 239ede1b429SArjan van de Ven __entry->function = hrtimer->function; 240c6a2a177SXiao Guangrong ), 241c6a2a177SXiao Guangrong 242ede1b429SArjan van de Ven TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function, 2432456e855SThomas Gleixner (unsigned long long) __entry->now) 244c6a2a177SXiao Guangrong ); 245c6a2a177SXiao Guangrong 246363d0f64SLi Zefan DECLARE_EVENT_CLASS(hrtimer_class, 247c6a2a177SXiao Guangrong 248434a83c3SIngo Molnar TP_PROTO(struct hrtimer *hrtimer), 249c6a2a177SXiao Guangrong 250434a83c3SIngo Molnar TP_ARGS(hrtimer), 251c6a2a177SXiao Guangrong 252c6a2a177SXiao Guangrong TP_STRUCT__entry( 253434a83c3SIngo Molnar __field( void *, hrtimer ) 254c6a2a177SXiao Guangrong ), 255c6a2a177SXiao Guangrong 256c6a2a177SXiao Guangrong TP_fast_assign( 257434a83c3SIngo Molnar __entry->hrtimer = hrtimer; 258c6a2a177SXiao Guangrong ), 259c6a2a177SXiao Guangrong 260434a83c3SIngo Molnar TP_printk("hrtimer=%p", __entry->hrtimer) 261c6a2a177SXiao Guangrong ); 262c6a2a177SXiao Guangrong 263c6a2a177SXiao Guangrong /** 264363d0f64SLi Zefan * hrtimer_expire_exit - called immediately after the hrtimer callback returns 265cf2fbdd2SMasanari Iida * @hrtimer: pointer to struct hrtimer 266363d0f64SLi Zefan * 267363d0f64SLi Zefan * When used in combination with the hrtimer_expire_entry tracepoint we can 268363d0f64SLi Zefan * determine the runtime of the callback function. 269c6a2a177SXiao Guangrong */ 270363d0f64SLi Zefan DEFINE_EVENT(hrtimer_class, hrtimer_expire_exit, 271c6a2a177SXiao Guangrong 272434a83c3SIngo Molnar TP_PROTO(struct hrtimer *hrtimer), 273c6a2a177SXiao Guangrong 274363d0f64SLi Zefan TP_ARGS(hrtimer) 275363d0f64SLi Zefan ); 276c6a2a177SXiao Guangrong 277363d0f64SLi Zefan /** 278363d0f64SLi Zefan * hrtimer_cancel - called when the hrtimer is canceled 279363d0f64SLi Zefan * @hrtimer: pointer to struct hrtimer 280363d0f64SLi Zefan */ 281363d0f64SLi Zefan DEFINE_EVENT(hrtimer_class, hrtimer_cancel, 282c6a2a177SXiao Guangrong 283363d0f64SLi Zefan TP_PROTO(struct hrtimer *hrtimer), 284c6a2a177SXiao Guangrong 285363d0f64SLi Zefan TP_ARGS(hrtimer) 286c6a2a177SXiao Guangrong ); 287c6a2a177SXiao Guangrong 2883f0a525eSXiao Guangrong /** 2893f0a525eSXiao Guangrong * itimer_state - called when itimer is started or canceled 2903f0a525eSXiao Guangrong * @which: name of the interval timer 2913f0a525eSXiao Guangrong * @value: the itimers value, itimer is canceled if value->it_value is 2923f0a525eSXiao Guangrong * zero, otherwise it is started 2933f0a525eSXiao Guangrong * @expires: the itimers expiry time 2943f0a525eSXiao Guangrong */ 2953f0a525eSXiao Guangrong TRACE_EVENT(itimer_state, 2963f0a525eSXiao Guangrong 2973f0a525eSXiao Guangrong TP_PROTO(int which, const struct itimerval *const value, 298858cf3a8SFrederic Weisbecker unsigned long long expires), 2993f0a525eSXiao Guangrong 3003f0a525eSXiao Guangrong TP_ARGS(which, value, expires), 3013f0a525eSXiao Guangrong 3023f0a525eSXiao Guangrong TP_STRUCT__entry( 3033f0a525eSXiao Guangrong __field( int, which ) 304858cf3a8SFrederic Weisbecker __field( unsigned long long, expires ) 3053f0a525eSXiao Guangrong __field( long, value_sec ) 3063f0a525eSXiao Guangrong __field( long, value_usec ) 3073f0a525eSXiao Guangrong __field( long, interval_sec ) 3083f0a525eSXiao Guangrong __field( long, interval_usec ) 3093f0a525eSXiao Guangrong ), 3103f0a525eSXiao Guangrong 3113f0a525eSXiao Guangrong TP_fast_assign( 3123f0a525eSXiao Guangrong __entry->which = which; 3133f0a525eSXiao Guangrong __entry->expires = expires; 3143f0a525eSXiao Guangrong __entry->value_sec = value->it_value.tv_sec; 3153f0a525eSXiao Guangrong __entry->value_usec = value->it_value.tv_usec; 3163f0a525eSXiao Guangrong __entry->interval_sec = value->it_interval.tv_sec; 3173f0a525eSXiao Guangrong __entry->interval_usec = value->it_interval.tv_usec; 3183f0a525eSXiao Guangrong ), 3193f0a525eSXiao Guangrong 320e9c0748bSThomas Gleixner TP_printk("which=%d expires=%llu it_value=%ld.%ld it_interval=%ld.%ld", 321858cf3a8SFrederic Weisbecker __entry->which, __entry->expires, 3223f0a525eSXiao Guangrong __entry->value_sec, __entry->value_usec, 3233f0a525eSXiao Guangrong __entry->interval_sec, __entry->interval_usec) 3243f0a525eSXiao Guangrong ); 3253f0a525eSXiao Guangrong 3263f0a525eSXiao Guangrong /** 3273f0a525eSXiao Guangrong * itimer_expire - called when itimer expires 3283f0a525eSXiao Guangrong * @which: type of the interval timer 3293f0a525eSXiao Guangrong * @pid: pid of the process which owns the timer 3303f0a525eSXiao Guangrong * @now: current time, used to calculate the latency of itimer 3313f0a525eSXiao Guangrong */ 3323f0a525eSXiao Guangrong TRACE_EVENT(itimer_expire, 3333f0a525eSXiao Guangrong 334858cf3a8SFrederic Weisbecker TP_PROTO(int which, struct pid *pid, unsigned long long now), 3353f0a525eSXiao Guangrong 3363f0a525eSXiao Guangrong TP_ARGS(which, pid, now), 3373f0a525eSXiao Guangrong 3383f0a525eSXiao Guangrong TP_STRUCT__entry( 3393f0a525eSXiao Guangrong __field( int , which ) 3403f0a525eSXiao Guangrong __field( pid_t, pid ) 341858cf3a8SFrederic Weisbecker __field( unsigned long long, now ) 3423f0a525eSXiao Guangrong ), 3433f0a525eSXiao Guangrong 3443f0a525eSXiao Guangrong TP_fast_assign( 3453f0a525eSXiao Guangrong __entry->which = which; 3463f0a525eSXiao Guangrong __entry->now = now; 3473f0a525eSXiao Guangrong __entry->pid = pid_nr(pid); 3483f0a525eSXiao Guangrong ), 3493f0a525eSXiao Guangrong 350e9c0748bSThomas Gleixner TP_printk("which=%d pid=%d now=%llu", __entry->which, 351858cf3a8SFrederic Weisbecker (int) __entry->pid, __entry->now) 3523f0a525eSXiao Guangrong ); 3533f0a525eSXiao Guangrong 3542c82d1beSFrederic Weisbecker #ifdef CONFIG_NO_HZ_COMMON 355e6e6cc22SFrederic Weisbecker 356e6e6cc22SFrederic Weisbecker #define TICK_DEP_NAMES \ 357c87edb36SSteven Rostedt (Red Hat) tick_dep_mask_name(NONE) \ 358e6e6cc22SFrederic Weisbecker tick_dep_name(POSIX_TIMER) \ 359e6e6cc22SFrederic Weisbecker tick_dep_name(PERF_EVENTS) \ 360e6e6cc22SFrederic Weisbecker tick_dep_name(SCHED) \ 361e6e6cc22SFrederic Weisbecker tick_dep_name_end(CLOCK_UNSTABLE) 362e6e6cc22SFrederic Weisbecker 363e6e6cc22SFrederic Weisbecker #undef tick_dep_name 364c87edb36SSteven Rostedt (Red Hat) #undef tick_dep_mask_name 365e6e6cc22SFrederic Weisbecker #undef tick_dep_name_end 366e6e6cc22SFrederic Weisbecker 367c87edb36SSteven Rostedt (Red Hat) /* The MASK will convert to their bits and they need to be processed too */ 368c87edb36SSteven Rostedt (Red Hat) #define tick_dep_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 369c87edb36SSteven Rostedt (Red Hat) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 370c87edb36SSteven Rostedt (Red Hat) #define tick_dep_name_end(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 371c87edb36SSteven Rostedt (Red Hat) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 372c87edb36SSteven Rostedt (Red Hat) /* NONE only has a mask defined for it */ 373c87edb36SSteven Rostedt (Red Hat) #define tick_dep_mask_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 374e6e6cc22SFrederic Weisbecker 375e6e6cc22SFrederic Weisbecker TICK_DEP_NAMES 376e6e6cc22SFrederic Weisbecker 377e6e6cc22SFrederic Weisbecker #undef tick_dep_name 378c87edb36SSteven Rostedt (Red Hat) #undef tick_dep_mask_name 379e6e6cc22SFrederic Weisbecker #undef tick_dep_name_end 380e6e6cc22SFrederic Weisbecker 381e6e6cc22SFrederic Weisbecker #define tick_dep_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 382c87edb36SSteven Rostedt (Red Hat) #define tick_dep_mask_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 383e6e6cc22SFrederic Weisbecker #define tick_dep_name_end(sdep) { TICK_DEP_MASK_##sdep, #sdep } 384e6e6cc22SFrederic Weisbecker 385e6e6cc22SFrederic Weisbecker #define show_tick_dep_name(val) \ 386e6e6cc22SFrederic Weisbecker __print_symbolic(val, TICK_DEP_NAMES) 387e6e6cc22SFrederic Weisbecker 388cb41a290SFrederic Weisbecker TRACE_EVENT(tick_stop, 389cb41a290SFrederic Weisbecker 390e6e6cc22SFrederic Weisbecker TP_PROTO(int success, int dependency), 391cb41a290SFrederic Weisbecker 392e6e6cc22SFrederic Weisbecker TP_ARGS(success, dependency), 393cb41a290SFrederic Weisbecker 394cb41a290SFrederic Weisbecker TP_STRUCT__entry( 395cb41a290SFrederic Weisbecker __field( int , success ) 396e6e6cc22SFrederic Weisbecker __field( int , dependency ) 397cb41a290SFrederic Weisbecker ), 398cb41a290SFrederic Weisbecker 399cb41a290SFrederic Weisbecker TP_fast_assign( 400cb41a290SFrederic Weisbecker __entry->success = success; 401e6e6cc22SFrederic Weisbecker __entry->dependency = dependency; 402cb41a290SFrederic Weisbecker ), 403cb41a290SFrederic Weisbecker 404e6e6cc22SFrederic Weisbecker TP_printk("success=%d dependency=%s", __entry->success, \ 405e6e6cc22SFrederic Weisbecker show_tick_dep_name(__entry->dependency)) 406cb41a290SFrederic Weisbecker ); 407cb41a290SFrederic Weisbecker #endif 408cb41a290SFrederic Weisbecker 4092b022e3dSXiao Guangrong #endif /* _TRACE_TIMER_H */ 4102b022e3dSXiao Guangrong 4112b022e3dSXiao Guangrong /* This part must be outside protection */ 4122b022e3dSXiao Guangrong #include <trace/define_trace.h> 413