162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#undef TRACE_SYSTEM 362306a36Sopenharmony_ci#define TRACE_SYSTEM timer 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ) 662306a36Sopenharmony_ci#define _TRACE_TIMER_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/tracepoint.h> 962306a36Sopenharmony_ci#include <linux/hrtimer.h> 1062306a36Sopenharmony_ci#include <linux/timer.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciDECLARE_EVENT_CLASS(timer_class, 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer), 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci TP_ARGS(timer), 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci TP_STRUCT__entry( 1962306a36Sopenharmony_ci __field( void *, timer ) 2062306a36Sopenharmony_ci ), 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci TP_fast_assign( 2362306a36Sopenharmony_ci __entry->timer = timer; 2462306a36Sopenharmony_ci ), 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci TP_printk("timer=%p", __entry->timer) 2762306a36Sopenharmony_ci); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/** 3062306a36Sopenharmony_ci * timer_init - called when the timer is initialized 3162306a36Sopenharmony_ci * @timer: pointer to struct timer_list 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ciDEFINE_EVENT(timer_class, timer_init, 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer), 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci TP_ARGS(timer) 3862306a36Sopenharmony_ci); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define decode_timer_flags(flags) \ 4162306a36Sopenharmony_ci __print_flags(flags, "|", \ 4262306a36Sopenharmony_ci { TIMER_MIGRATING, "M" }, \ 4362306a36Sopenharmony_ci { TIMER_DEFERRABLE, "D" }, \ 4462306a36Sopenharmony_ci { TIMER_PINNED, "P" }, \ 4562306a36Sopenharmony_ci { TIMER_IRQSAFE, "I" }) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/** 4862306a36Sopenharmony_ci * timer_start - called when the timer is started 4962306a36Sopenharmony_ci * @timer: pointer to struct timer_list 5062306a36Sopenharmony_ci * @expires: the timers expiry time 5162306a36Sopenharmony_ci * @flags: the timers flags 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ciTRACE_EVENT(timer_start, 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer, 5662306a36Sopenharmony_ci unsigned long expires, 5762306a36Sopenharmony_ci unsigned int flags), 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci TP_ARGS(timer, expires, flags), 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci TP_STRUCT__entry( 6262306a36Sopenharmony_ci __field( void *, timer ) 6362306a36Sopenharmony_ci __field( void *, function ) 6462306a36Sopenharmony_ci __field( unsigned long, expires ) 6562306a36Sopenharmony_ci __field( unsigned long, now ) 6662306a36Sopenharmony_ci __field( unsigned int, flags ) 6762306a36Sopenharmony_ci ), 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci TP_fast_assign( 7062306a36Sopenharmony_ci __entry->timer = timer; 7162306a36Sopenharmony_ci __entry->function = timer->function; 7262306a36Sopenharmony_ci __entry->expires = expires; 7362306a36Sopenharmony_ci __entry->now = jiffies; 7462306a36Sopenharmony_ci __entry->flags = flags; 7562306a36Sopenharmony_ci ), 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci TP_printk("timer=%p function=%ps expires=%lu [timeout=%ld] cpu=%u idx=%u flags=%s", 7862306a36Sopenharmony_ci __entry->timer, __entry->function, __entry->expires, 7962306a36Sopenharmony_ci (long)__entry->expires - __entry->now, 8062306a36Sopenharmony_ci __entry->flags & TIMER_CPUMASK, 8162306a36Sopenharmony_ci __entry->flags >> TIMER_ARRAYSHIFT, 8262306a36Sopenharmony_ci decode_timer_flags(__entry->flags & TIMER_TRACE_FLAGMASK)) 8362306a36Sopenharmony_ci); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/** 8662306a36Sopenharmony_ci * timer_expire_entry - called immediately before the timer callback 8762306a36Sopenharmony_ci * @timer: pointer to struct timer_list 8862306a36Sopenharmony_ci * @baseclk: value of timer_base::clk when timer expires 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci * Allows to determine the timer latency. 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_ciTRACE_EVENT(timer_expire_entry, 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer, unsigned long baseclk), 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci TP_ARGS(timer, baseclk), 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci TP_STRUCT__entry( 9962306a36Sopenharmony_ci __field( void *, timer ) 10062306a36Sopenharmony_ci __field( unsigned long, now ) 10162306a36Sopenharmony_ci __field( void *, function) 10262306a36Sopenharmony_ci __field( unsigned long, baseclk ) 10362306a36Sopenharmony_ci ), 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci TP_fast_assign( 10662306a36Sopenharmony_ci __entry->timer = timer; 10762306a36Sopenharmony_ci __entry->now = jiffies; 10862306a36Sopenharmony_ci __entry->function = timer->function; 10962306a36Sopenharmony_ci __entry->baseclk = baseclk; 11062306a36Sopenharmony_ci ), 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci TP_printk("timer=%p function=%ps now=%lu baseclk=%lu", 11362306a36Sopenharmony_ci __entry->timer, __entry->function, __entry->now, 11462306a36Sopenharmony_ci __entry->baseclk) 11562306a36Sopenharmony_ci); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/** 11862306a36Sopenharmony_ci * timer_expire_exit - called immediately after the timer callback returns 11962306a36Sopenharmony_ci * @timer: pointer to struct timer_list 12062306a36Sopenharmony_ci * 12162306a36Sopenharmony_ci * When used in combination with the timer_expire_entry tracepoint we can 12262306a36Sopenharmony_ci * determine the runtime of the timer callback function. 12362306a36Sopenharmony_ci * 12462306a36Sopenharmony_ci * NOTE: Do NOT dereference timer in TP_fast_assign. The pointer might 12562306a36Sopenharmony_ci * be invalid. We solely track the pointer. 12662306a36Sopenharmony_ci */ 12762306a36Sopenharmony_ciDEFINE_EVENT(timer_class, timer_expire_exit, 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer), 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci TP_ARGS(timer) 13262306a36Sopenharmony_ci); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/** 13562306a36Sopenharmony_ci * timer_cancel - called when the timer is canceled 13662306a36Sopenharmony_ci * @timer: pointer to struct timer_list 13762306a36Sopenharmony_ci */ 13862306a36Sopenharmony_ciDEFINE_EVENT(timer_class, timer_cancel, 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci TP_PROTO(struct timer_list *timer), 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci TP_ARGS(timer) 14362306a36Sopenharmony_ci); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define decode_clockid(type) \ 14662306a36Sopenharmony_ci __print_symbolic(type, \ 14762306a36Sopenharmony_ci { CLOCK_REALTIME, "CLOCK_REALTIME" }, \ 14862306a36Sopenharmony_ci { CLOCK_MONOTONIC, "CLOCK_MONOTONIC" }, \ 14962306a36Sopenharmony_ci { CLOCK_BOOTTIME, "CLOCK_BOOTTIME" }, \ 15062306a36Sopenharmony_ci { CLOCK_TAI, "CLOCK_TAI" }) 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci#define decode_hrtimer_mode(mode) \ 15362306a36Sopenharmony_ci __print_symbolic(mode, \ 15462306a36Sopenharmony_ci { HRTIMER_MODE_ABS, "ABS" }, \ 15562306a36Sopenharmony_ci { HRTIMER_MODE_REL, "REL" }, \ 15662306a36Sopenharmony_ci { HRTIMER_MODE_ABS_PINNED, "ABS|PINNED" }, \ 15762306a36Sopenharmony_ci { HRTIMER_MODE_REL_PINNED, "REL|PINNED" }, \ 15862306a36Sopenharmony_ci { HRTIMER_MODE_ABS_SOFT, "ABS|SOFT" }, \ 15962306a36Sopenharmony_ci { HRTIMER_MODE_REL_SOFT, "REL|SOFT" }, \ 16062306a36Sopenharmony_ci { HRTIMER_MODE_ABS_PINNED_SOFT, "ABS|PINNED|SOFT" }, \ 16162306a36Sopenharmony_ci { HRTIMER_MODE_REL_PINNED_SOFT, "REL|PINNED|SOFT" }, \ 16262306a36Sopenharmony_ci { HRTIMER_MODE_ABS_HARD, "ABS|HARD" }, \ 16362306a36Sopenharmony_ci { HRTIMER_MODE_REL_HARD, "REL|HARD" }, \ 16462306a36Sopenharmony_ci { HRTIMER_MODE_ABS_PINNED_HARD, "ABS|PINNED|HARD" }, \ 16562306a36Sopenharmony_ci { HRTIMER_MODE_REL_PINNED_HARD, "REL|PINNED|HARD" }) 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci/** 16862306a36Sopenharmony_ci * hrtimer_init - called when the hrtimer is initialized 16962306a36Sopenharmony_ci * @hrtimer: pointer to struct hrtimer 17062306a36Sopenharmony_ci * @clockid: the hrtimers clock 17162306a36Sopenharmony_ci * @mode: the hrtimers mode 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_ciTRACE_EVENT(hrtimer_init, 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer, clockid_t clockid, 17662306a36Sopenharmony_ci enum hrtimer_mode mode), 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci TP_ARGS(hrtimer, clockid, mode), 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci TP_STRUCT__entry( 18162306a36Sopenharmony_ci __field( void *, hrtimer ) 18262306a36Sopenharmony_ci __field( clockid_t, clockid ) 18362306a36Sopenharmony_ci __field( enum hrtimer_mode, mode ) 18462306a36Sopenharmony_ci ), 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci TP_fast_assign( 18762306a36Sopenharmony_ci __entry->hrtimer = hrtimer; 18862306a36Sopenharmony_ci __entry->clockid = clockid; 18962306a36Sopenharmony_ci __entry->mode = mode; 19062306a36Sopenharmony_ci ), 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci TP_printk("hrtimer=%p clockid=%s mode=%s", __entry->hrtimer, 19362306a36Sopenharmony_ci decode_clockid(__entry->clockid), 19462306a36Sopenharmony_ci decode_hrtimer_mode(__entry->mode)) 19562306a36Sopenharmony_ci); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/** 19862306a36Sopenharmony_ci * hrtimer_start - called when the hrtimer is started 19962306a36Sopenharmony_ci * @hrtimer: pointer to struct hrtimer 20062306a36Sopenharmony_ci * @mode: the hrtimers mode 20162306a36Sopenharmony_ci */ 20262306a36Sopenharmony_ciTRACE_EVENT(hrtimer_start, 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer, enum hrtimer_mode mode), 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci TP_ARGS(hrtimer, mode), 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci TP_STRUCT__entry( 20962306a36Sopenharmony_ci __field( void *, hrtimer ) 21062306a36Sopenharmony_ci __field( void *, function ) 21162306a36Sopenharmony_ci __field( s64, expires ) 21262306a36Sopenharmony_ci __field( s64, softexpires ) 21362306a36Sopenharmony_ci __field( enum hrtimer_mode, mode ) 21462306a36Sopenharmony_ci ), 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci TP_fast_assign( 21762306a36Sopenharmony_ci __entry->hrtimer = hrtimer; 21862306a36Sopenharmony_ci __entry->function = hrtimer->function; 21962306a36Sopenharmony_ci __entry->expires = hrtimer_get_expires(hrtimer); 22062306a36Sopenharmony_ci __entry->softexpires = hrtimer_get_softexpires(hrtimer); 22162306a36Sopenharmony_ci __entry->mode = mode; 22262306a36Sopenharmony_ci ), 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci TP_printk("hrtimer=%p function=%ps expires=%llu softexpires=%llu " 22562306a36Sopenharmony_ci "mode=%s", __entry->hrtimer, __entry->function, 22662306a36Sopenharmony_ci (unsigned long long) __entry->expires, 22762306a36Sopenharmony_ci (unsigned long long) __entry->softexpires, 22862306a36Sopenharmony_ci decode_hrtimer_mode(__entry->mode)) 22962306a36Sopenharmony_ci); 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci/** 23262306a36Sopenharmony_ci * hrtimer_expire_entry - called immediately before the hrtimer callback 23362306a36Sopenharmony_ci * @hrtimer: pointer to struct hrtimer 23462306a36Sopenharmony_ci * @now: pointer to variable which contains current time of the 23562306a36Sopenharmony_ci * timers base. 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * Allows to determine the timer latency. 23862306a36Sopenharmony_ci */ 23962306a36Sopenharmony_ciTRACE_EVENT(hrtimer_expire_entry, 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer, ktime_t *now), 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci TP_ARGS(hrtimer, now), 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci TP_STRUCT__entry( 24662306a36Sopenharmony_ci __field( void *, hrtimer ) 24762306a36Sopenharmony_ci __field( s64, now ) 24862306a36Sopenharmony_ci __field( void *, function) 24962306a36Sopenharmony_ci ), 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci TP_fast_assign( 25262306a36Sopenharmony_ci __entry->hrtimer = hrtimer; 25362306a36Sopenharmony_ci __entry->now = *now; 25462306a36Sopenharmony_ci __entry->function = hrtimer->function; 25562306a36Sopenharmony_ci ), 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci TP_printk("hrtimer=%p function=%ps now=%llu", 25862306a36Sopenharmony_ci __entry->hrtimer, __entry->function, 25962306a36Sopenharmony_ci (unsigned long long) __entry->now) 26062306a36Sopenharmony_ci); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ciDECLARE_EVENT_CLASS(hrtimer_class, 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer), 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci TP_ARGS(hrtimer), 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci TP_STRUCT__entry( 26962306a36Sopenharmony_ci __field( void *, hrtimer ) 27062306a36Sopenharmony_ci ), 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci TP_fast_assign( 27362306a36Sopenharmony_ci __entry->hrtimer = hrtimer; 27462306a36Sopenharmony_ci ), 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci TP_printk("hrtimer=%p", __entry->hrtimer) 27762306a36Sopenharmony_ci); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/** 28062306a36Sopenharmony_ci * hrtimer_expire_exit - called immediately after the hrtimer callback returns 28162306a36Sopenharmony_ci * @hrtimer: pointer to struct hrtimer 28262306a36Sopenharmony_ci * 28362306a36Sopenharmony_ci * When used in combination with the hrtimer_expire_entry tracepoint we can 28462306a36Sopenharmony_ci * determine the runtime of the callback function. 28562306a36Sopenharmony_ci */ 28662306a36Sopenharmony_ciDEFINE_EVENT(hrtimer_class, hrtimer_expire_exit, 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer), 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci TP_ARGS(hrtimer) 29162306a36Sopenharmony_ci); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci/** 29462306a36Sopenharmony_ci * hrtimer_cancel - called when the hrtimer is canceled 29562306a36Sopenharmony_ci * @hrtimer: pointer to struct hrtimer 29662306a36Sopenharmony_ci */ 29762306a36Sopenharmony_ciDEFINE_EVENT(hrtimer_class, hrtimer_cancel, 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci TP_PROTO(struct hrtimer *hrtimer), 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci TP_ARGS(hrtimer) 30262306a36Sopenharmony_ci); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/** 30562306a36Sopenharmony_ci * itimer_state - called when itimer is started or canceled 30662306a36Sopenharmony_ci * @which: name of the interval timer 30762306a36Sopenharmony_ci * @value: the itimers value, itimer is canceled if value->it_value is 30862306a36Sopenharmony_ci * zero, otherwise it is started 30962306a36Sopenharmony_ci * @expires: the itimers expiry time 31062306a36Sopenharmony_ci */ 31162306a36Sopenharmony_ciTRACE_EVENT(itimer_state, 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci TP_PROTO(int which, const struct itimerspec64 *const value, 31462306a36Sopenharmony_ci unsigned long long expires), 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci TP_ARGS(which, value, expires), 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci TP_STRUCT__entry( 31962306a36Sopenharmony_ci __field( int, which ) 32062306a36Sopenharmony_ci __field( unsigned long long, expires ) 32162306a36Sopenharmony_ci __field( long, value_sec ) 32262306a36Sopenharmony_ci __field( long, value_nsec ) 32362306a36Sopenharmony_ci __field( long, interval_sec ) 32462306a36Sopenharmony_ci __field( long, interval_nsec ) 32562306a36Sopenharmony_ci ), 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci TP_fast_assign( 32862306a36Sopenharmony_ci __entry->which = which; 32962306a36Sopenharmony_ci __entry->expires = expires; 33062306a36Sopenharmony_ci __entry->value_sec = value->it_value.tv_sec; 33162306a36Sopenharmony_ci __entry->value_nsec = value->it_value.tv_nsec; 33262306a36Sopenharmony_ci __entry->interval_sec = value->it_interval.tv_sec; 33362306a36Sopenharmony_ci __entry->interval_nsec = value->it_interval.tv_nsec; 33462306a36Sopenharmony_ci ), 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci TP_printk("which=%d expires=%llu it_value=%ld.%06ld it_interval=%ld.%06ld", 33762306a36Sopenharmony_ci __entry->which, __entry->expires, 33862306a36Sopenharmony_ci __entry->value_sec, __entry->value_nsec / NSEC_PER_USEC, 33962306a36Sopenharmony_ci __entry->interval_sec, __entry->interval_nsec / NSEC_PER_USEC) 34062306a36Sopenharmony_ci); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci/** 34362306a36Sopenharmony_ci * itimer_expire - called when itimer expires 34462306a36Sopenharmony_ci * @which: type of the interval timer 34562306a36Sopenharmony_ci * @pid: pid of the process which owns the timer 34662306a36Sopenharmony_ci * @now: current time, used to calculate the latency of itimer 34762306a36Sopenharmony_ci */ 34862306a36Sopenharmony_ciTRACE_EVENT(itimer_expire, 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci TP_PROTO(int which, struct pid *pid, unsigned long long now), 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci TP_ARGS(which, pid, now), 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci TP_STRUCT__entry( 35562306a36Sopenharmony_ci __field( int , which ) 35662306a36Sopenharmony_ci __field( pid_t, pid ) 35762306a36Sopenharmony_ci __field( unsigned long long, now ) 35862306a36Sopenharmony_ci ), 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci TP_fast_assign( 36162306a36Sopenharmony_ci __entry->which = which; 36262306a36Sopenharmony_ci __entry->now = now; 36362306a36Sopenharmony_ci __entry->pid = pid_nr(pid); 36462306a36Sopenharmony_ci ), 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci TP_printk("which=%d pid=%d now=%llu", __entry->which, 36762306a36Sopenharmony_ci (int) __entry->pid, __entry->now) 36862306a36Sopenharmony_ci); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci#ifdef CONFIG_NO_HZ_COMMON 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci#define TICK_DEP_NAMES \ 37362306a36Sopenharmony_ci tick_dep_mask_name(NONE) \ 37462306a36Sopenharmony_ci tick_dep_name(POSIX_TIMER) \ 37562306a36Sopenharmony_ci tick_dep_name(PERF_EVENTS) \ 37662306a36Sopenharmony_ci tick_dep_name(SCHED) \ 37762306a36Sopenharmony_ci tick_dep_name(CLOCK_UNSTABLE) \ 37862306a36Sopenharmony_ci tick_dep_name(RCU) \ 37962306a36Sopenharmony_ci tick_dep_name_end(RCU_EXP) 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci#undef tick_dep_name 38262306a36Sopenharmony_ci#undef tick_dep_mask_name 38362306a36Sopenharmony_ci#undef tick_dep_name_end 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci/* The MASK will convert to their bits and they need to be processed too */ 38662306a36Sopenharmony_ci#define tick_dep_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 38762306a36Sopenharmony_ci TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 38862306a36Sopenharmony_ci#define tick_dep_name_end(sdep) TRACE_DEFINE_ENUM(TICK_DEP_BIT_##sdep); \ 38962306a36Sopenharmony_ci TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 39062306a36Sopenharmony_ci/* NONE only has a mask defined for it */ 39162306a36Sopenharmony_ci#define tick_dep_mask_name(sdep) TRACE_DEFINE_ENUM(TICK_DEP_MASK_##sdep); 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ciTICK_DEP_NAMES 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci#undef tick_dep_name 39662306a36Sopenharmony_ci#undef tick_dep_mask_name 39762306a36Sopenharmony_ci#undef tick_dep_name_end 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci#define tick_dep_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 40062306a36Sopenharmony_ci#define tick_dep_mask_name(sdep) { TICK_DEP_MASK_##sdep, #sdep }, 40162306a36Sopenharmony_ci#define tick_dep_name_end(sdep) { TICK_DEP_MASK_##sdep, #sdep } 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci#define show_tick_dep_name(val) \ 40462306a36Sopenharmony_ci __print_symbolic(val, TICK_DEP_NAMES) 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ciTRACE_EVENT(tick_stop, 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci TP_PROTO(int success, int dependency), 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci TP_ARGS(success, dependency), 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci TP_STRUCT__entry( 41362306a36Sopenharmony_ci __field( int , success ) 41462306a36Sopenharmony_ci __field( int , dependency ) 41562306a36Sopenharmony_ci ), 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci TP_fast_assign( 41862306a36Sopenharmony_ci __entry->success = success; 41962306a36Sopenharmony_ci __entry->dependency = dependency; 42062306a36Sopenharmony_ci ), 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci TP_printk("success=%d dependency=%s", __entry->success, \ 42362306a36Sopenharmony_ci show_tick_dep_name(__entry->dependency)) 42462306a36Sopenharmony_ci); 42562306a36Sopenharmony_ci#endif 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci#endif /* _TRACE_TIMER_H */ 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci/* This part must be outside protection */ 43062306a36Sopenharmony_ci#include <trace/define_trace.h> 431