-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
timers: Add tracepoints for timer_list timers
Add tracepoints which cover the timer life cycle. The tracepoints are integrated with the already existing debug_object debug points as far as possible. Based on patches from Mathieu: http://marc.info/?l=linux-kernel&m=123791201816247&w=2 and Anton: http://marc.info/?l=linux-kernel&m=124331396919301&w=2 [ tglx: Fixed timeout value in timer_start tracepoint, massaged comments and made the printk's more readable ] Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Cc: Anton Blanchard <anton@samba.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Cc: Peter Zijlstra <peterz@infradead.org> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Zhaolei <zhaolei@cn.fujitsu.com> LKML-Reference: <4A7F8A9B.3040201@cn.fujitsu.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
- Loading branch information
Xiao Guangrong
authored and
Thomas Gleixner
committed
Aug 29, 2009
1 parent
f71bb0a
commit 2b022e3
Showing
2 changed files
with
165 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
#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/timer.h> | ||
|
||
/** | ||
* timer_init - called when the timer is initialized | ||
* @timer: pointer to struct timer_list | ||
*/ | ||
TRACE_EVENT(timer_init, | ||
|
||
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_start - called when the timer is started | ||
* @timer: pointer to struct timer_list | ||
* @expires: the timers expiry time | ||
*/ | ||
TRACE_EVENT(timer_start, | ||
|
||
TP_PROTO(struct timer_list *timer, unsigned long expires), | ||
|
||
TP_ARGS(timer, expires), | ||
|
||
TP_STRUCT__entry( | ||
__field( void *, timer ) | ||
__field( void *, function ) | ||
__field( unsigned long, expires ) | ||
__field( unsigned long, now ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->timer = timer; | ||
__entry->function = timer->function; | ||
__entry->expires = expires; | ||
__entry->now = jiffies; | ||
), | ||
|
||
TP_printk("timer %p: func %pf, expires %lu, timeout %ld", | ||
__entry->timer, __entry->function, __entry->expires, | ||
(long)__entry->expires - __entry->now) | ||
); | ||
|
||
/** | ||
* timer_expire_entry - called immediately before the timer callback | ||
* @timer: pointer to struct timer_list | ||
* | ||
* Allows to determine the timer latency. | ||
*/ | ||
TRACE_EVENT(timer_expire_entry, | ||
|
||
TP_PROTO(struct timer_list *timer), | ||
|
||
TP_ARGS(timer), | ||
|
||
TP_STRUCT__entry( | ||
__field( void *, timer ) | ||
__field( unsigned long, now ) | ||
), | ||
|
||
TP_fast_assign( | ||
__entry->timer = timer; | ||
__entry->now = jiffies; | ||
), | ||
|
||
TP_printk("timer %p: now %lu", __entry->timer, __entry->now) | ||
); | ||
|
||
/** | ||
* 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 derefernce timer in TP_fast_assign. The pointer might | ||
* be invalid. We solely track the pointer. | ||
*/ | ||
TRACE_EVENT(timer_expire_exit, | ||
|
||
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_cancel - called when the timer is canceled | ||
* @timer: pointer to struct timer_list | ||
*/ | ||
TRACE_EVENT(timer_cancel, | ||
|
||
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) | ||
); | ||
|
||
#endif /* _TRACE_TIMER_H */ | ||
|
||
/* This part must be outside protection */ | ||
#include <trace/define_trace.h> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters