aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/hrtimer.h45
-rw-r--r--include/linux/timer.h54
2 files changed, 99 insertions, 0 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
index 4ecd991431b4..93b8757c1ea2 100644
--- a/include/linux/hrtimer.h
+++ b/include/linux/hrtimer.h
@@ -119,6 +119,11 @@ struct hrtimer {
119 enum hrtimer_cb_mode cb_mode; 119 enum hrtimer_cb_mode cb_mode;
120 struct list_head cb_entry; 120 struct list_head cb_entry;
121#endif 121#endif
122#ifdef CONFIG_TIMER_STATS
123 void *start_site;
124 char start_comm[16];
125 int start_pid;
126#endif
122}; 127};
123 128
124/** 129/**
@@ -311,4 +316,44 @@ extern unsigned long ktime_divns(const ktime_t kt, s64 div);
311# define ktime_divns(kt, div) (unsigned long)((kt).tv64 / (div)) 316# define ktime_divns(kt, div) (unsigned long)((kt).tv64 / (div))
312#endif 317#endif
313 318
319/*
320 * Timer-statistics info:
321 */
322#ifdef CONFIG_TIMER_STATS
323
324extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
325 void *timerf, char * comm);
326
327static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
328{
329 timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
330 timer->function, timer->start_comm);
331}
332
333extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
334 void *addr);
335
336static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
337{
338 __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0));
339}
340
341static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
342{
343 timer->start_site = NULL;
344}
345#else
346static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
347{
348}
349
350static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
351{
352}
353
354static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
355{
356}
357#endif
358
314#endif 359#endif
diff --git a/include/linux/timer.h b/include/linux/timer.h
index 44d41e9d7818..719113b652dd 100644
--- a/include/linux/timer.h
+++ b/include/linux/timer.h
@@ -2,6 +2,7 @@
2#define _LINUX_TIMER_H 2#define _LINUX_TIMER_H
3 3
4#include <linux/list.h> 4#include <linux/list.h>
5#include <linux/ktime.h>
5#include <linux/spinlock.h> 6#include <linux/spinlock.h>
6#include <linux/stddef.h> 7#include <linux/stddef.h>
7 8
@@ -15,6 +16,11 @@ struct timer_list {
15 unsigned long data; 16 unsigned long data;
16 17
17 struct tvec_t_base_s *base; 18 struct tvec_t_base_s *base;
19#ifdef CONFIG_TIMER_STATS
20 void *start_site;
21 char start_comm[16];
22 int start_pid;
23#endif
18}; 24};
19 25
20extern struct tvec_t_base_s boot_tvec_bases; 26extern struct tvec_t_base_s boot_tvec_bases;
@@ -73,6 +79,54 @@ extern unsigned long next_timer_interrupt(void);
73 */ 79 */
74extern unsigned long get_next_timer_interrupt(unsigned long now); 80extern unsigned long get_next_timer_interrupt(unsigned long now);
75 81
82/*
83 * Timer-statistics info:
84 */
85#ifdef CONFIG_TIMER_STATS
86
87extern void init_timer_stats(void);
88
89extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
90 void *timerf, char * comm);
91
92static inline void timer_stats_account_timer(struct timer_list *timer)
93{
94 timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
95 timer->function, timer->start_comm);
96}
97
98extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
99 void *addr);
100
101static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
102{
103 __timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
104}
105
106static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
107{
108 timer->start_site = NULL;
109}
110#else
111static inline void init_timer_stats(void)
112{
113}
114
115static inline void timer_stats_account_timer(struct timer_list *timer)
116{
117}
118
119static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
120{
121}
122
123static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
124{
125}
126#endif
127
128extern void delayed_work_timer_fn(unsigned long __data);
129
76/** 130/**
77 * add_timer - start a timer 131 * add_timer - start a timer
78 * @timer: the timer to be added 132 * @timer: the timer to be added