online
  "   ˆl–Ým_J*j"Tâ�rãB¸ÔÅ£Áƒh¹À¿      online
  /   ˆl–ßi~”êh¥8 Eq–î	µ1hßÂ‚À_ŒuÐb&=Ly[Ï¿ÂÁ  ´    ý7zXZ  i"Þ6 !   t/å£à ¿ x] 3V)2¯ˆ0ý<vïÂ”ši«åhx‹Ó¥3ÌÝQp7pSðÊs³ÿËß1¸”×l7n{ÅGicõá0¶Em©F�âÇ$hÉ°³üsës)Ä1µ^ìD’Ç<äôÜÁÁÿü¢×¸(¹f†ìï¶&(Æ·uH°f   PÑÎ �À  oÜ”>0‹    YZ     �_’I|¥‰ÓMjqØ‚¦ð¬÷ÃÂ      File not found.
  +   	ˆl–Ü4ý( ©³( 	Å€fàB¦-ÿÅ„_†I|¥�+ÅÄ *™    	/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM timer

#if !defined(_TRACE_TIMER_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_TIMER_H

#include <linux/tracepoint.h>
#include <linux/hrtimer.h>
#include <linux/timer.h>

DECLARE_EVENT_CLASS(timer_class,

	TP_PROTO(struct timer_list *timer),

	TP_ARGS(timer),

	TP_STRUCT__entry(
		__field( void *,	timer	)
	),

	TP_fast_assign(
		__entry->timer	= timer;
	),

	TP_printk("timer=%p", __entry->timer)
);

/**
 * timer_init - called when the timer is initialized
 * @timer:	pointer to struct timer_list
 */
DEFINE_EVENT(timer_class, timer_init,

	TP_PROTO(struct timer_list *timer),

	TP_ARGS(timer)
);

#define decode_timer_flags(flags)			\
	__print_flags(flags, "|",			\
		{  TIMER_MIGRATING,	"M" },		\
		{  TIMER_DEFERRABLE,	"D" },		\
		{  TIMER_PINNED,	"P" },		\
		{  TIMER_IRQSAFE,	"I" })

/**
 * timer_start - called when the timer is started
 * @timer:		pointer to struct timer_list
 * @bucket_expiry:	the bucket expiry time
 */
TRACE_EVENT(timer_start,

	TP_PROTO(struct timer_list *timer,
		unsigned long bucket_expiry),

	TP_ARGS(timer, bucket_expiry),

	TP_STRUCT__entry(
		__field( void *,	timer		)
		__field( void *,	function	)
		__field( unsigned long,	expires		)
		__field( unsigned long,	bucket_expiry	)
		__field( unsigned long,	now		)
		__field( unsigned int,	flags		)
	),

	TP_fast_assign(
		__entry->timer		= timer;
		__entry->function	= timer->function;
		__entry->expires	= timer->expires;
		__entry->bucket_expiry	= bucket_expiry;
		__entry->now		= jiffies;
		__entry->flags		= timer->flags;
	),

	TP_printk("timer=%p function=%ps expires=%lu [timeout=%ld] bucket_expiry=%lu cpu=%u idx=%u flags=%s",
		  __entry->timer, __entry->function, __entry->expires,
		  (long)__entry->expires - __entry->now,
		  __entry->bucket_expiry, __entry->flags & TIMER_CPUMASK,
		  __entry->flags >> TIMER_ARRAYSHIFT,
		  decode_timer_flags(__entry->flags & TIMER_TRACE_FLAGMASK))
);

/**
 * timer_expire_entry - called immediately before the timer callback
 * @timer:	pointer to struct timer_list
 * @baseclk:	value of timer_base::clk when timer expires
 *
 * Allows to determine the timer latency.
 */
TRACE_EVENT(timer_expire_entry,

	TP_PROTO(struct timer_list *timer, unsigned long baseclk),

	TP_ARGS(timer, baseclk),

	TP_STRUCT__entry(
		__field( void *,	timer	)
		__field( unsigned long,	now	)
		__field( void *,	function)
		__field( unsigned long,	baseclk	)
	),

	TP_fast_assign(
		__entry->timer		= timer;
		__entry->now		= jiffies;
		__entry->function	= timer->function;
		__entry->baseclk	= baseclk;
	),

	TP_printk("timer=%p function=%ps now=%lu baseclk=%lu",
		  __entry->timer, __entry->function, __entry->now,
		  __entry->baseclk)
);

/**
 * timer_expire_exit - called immediately after the timer callback returns
 * @timer:	pointer to struct timer_list
 *
 * When used in combination with the timer_expire_entry tracepoint we can
 * determine the runtime of the timer callback function.
 *
 * NOTE: Do NOT dereference timer in TP_fast_assign. The pointer might
 * be invalid. We solely track the pointer.
 */
DEFINE_EVENT(timer_class, timer_expire_exit,

	TP_PROTO(struct timer_list *timer),

	TP_ARGS(timer)
);

/**
 * timer_cancel - called when the timer is canceled
 * @timer:	pointer to struct timer_list
 */
DEFINE_EVENT(timer_class, timer_cancel,

	TP_PROTO(struct timer_list *timer),

	TP_ARGS(timer)
);

TRACE_EVENT(timer_base_idle,

	TP_PROTO(bool is_idle, unsigned int cpu),

	TP_ARGS(is_idle, cpu),

	TP_STRUCT__entry(
		__field( bool,		is_idle	)
		__field( unsigned int,	cpu	)
	),

	TP_fast_assign(
		__entry->is_idle	= is_idle;
		__entry->cpu		=