at v2.6.35 7.4 kB view raw
1#ifndef _LINUX_TIMER_H 2#define _LINUX_TIMER_H 3 4#include <linux/list.h> 5#include <linux/ktime.h> 6#include <linux/stddef.h> 7#include <linux/debugobjects.h> 8#include <linux/stringify.h> 9 10struct tvec_base; 11 12struct timer_list { 13 /* 14 * All fields that change during normal runtime grouped to the 15 * same cacheline 16 */ 17 struct list_head entry; 18 unsigned long expires; 19 struct tvec_base *base; 20 21 void (*function)(unsigned long); 22 unsigned long data; 23 24 int slack; 25 26#ifdef CONFIG_TIMER_STATS 27 void *start_site; 28 char start_comm[16]; 29 int start_pid; 30#endif 31#ifdef CONFIG_LOCKDEP 32 struct lockdep_map lockdep_map; 33#endif 34}; 35 36extern struct tvec_base boot_tvec_bases; 37 38#ifdef CONFIG_LOCKDEP 39/* 40 * NB: because we have to copy the lockdep_map, setting the lockdep_map key 41 * (second argument) here is required, otherwise it could be initialised to 42 * the copy of the lockdep_map later! We use the pointer to and the string 43 * "<file>:<line>" as the key resp. the name of the lockdep_map. 44 */ 45#define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn) \ 46 .lockdep_map = STATIC_LOCKDEP_MAP_INIT(_kn, &_kn), 47#else 48#define __TIMER_LOCKDEP_MAP_INITIALIZER(_kn) 49#endif 50 51#define TIMER_INITIALIZER(_function, _expires, _data) { \ 52 .entry = { .prev = TIMER_ENTRY_STATIC }, \ 53 .function = (_function), \ 54 .expires = (_expires), \ 55 .data = (_data), \ 56 .base = &boot_tvec_bases, \ 57 __TIMER_LOCKDEP_MAP_INITIALIZER( \ 58 __FILE__ ":" __stringify(__LINE__)) \ 59 } 60 61#define DEFINE_TIMER(_name, _function, _expires, _data) \ 62 struct timer_list _name = \ 63 TIMER_INITIALIZER(_function, _expires, _data) 64 65void init_timer_key(struct timer_list *timer, 66 const char *name, 67 struct lock_class_key *key); 68void init_timer_deferrable_key(struct timer_list *timer, 69 const char *name, 70 struct lock_class_key *key); 71 72#ifdef CONFIG_LOCKDEP 73#define init_timer(timer) \ 74 do { \ 75 static struct lock_class_key __key; \ 76 init_timer_key((timer), #timer, &__key); \ 77 } while (0) 78 79#define init_timer_deferrable(timer) \ 80 do { \ 81 static struct lock_class_key __key; \ 82 init_timer_deferrable_key((timer), #timer, &__key); \ 83 } while (0) 84 85#define init_timer_on_stack(timer) \ 86 do { \ 87 static struct lock_class_key __key; \ 88 init_timer_on_stack_key((timer), #timer, &__key); \ 89 } while (0) 90 91#define setup_timer(timer, fn, data) \ 92 do { \ 93 static struct lock_class_key __key; \ 94 setup_timer_key((timer), #timer, &__key, (fn), (data));\ 95 } while (0) 96 97#define setup_timer_on_stack(timer, fn, data) \ 98 do { \ 99 static struct lock_class_key __key; \ 100 setup_timer_on_stack_key((timer), #timer, &__key, \ 101 (fn), (data)); \ 102 } while (0) 103#else 104#define init_timer(timer)\ 105 init_timer_key((timer), NULL, NULL) 106#define init_timer_deferrable(timer)\ 107 init_timer_deferrable_key((timer), NULL, NULL) 108#define init_timer_on_stack(timer)\ 109 init_timer_on_stack_key((timer), NULL, NULL) 110#define setup_timer(timer, fn, data)\ 111 setup_timer_key((timer), NULL, NULL, (fn), (data)) 112#define setup_timer_on_stack(timer, fn, data)\ 113 setup_timer_on_stack_key((timer), NULL, NULL, (fn), (data)) 114#endif 115 116#ifdef CONFIG_DEBUG_OBJECTS_TIMERS 117extern void init_timer_on_stack_key(struct timer_list *timer, 118 const char *name, 119 struct lock_class_key *key); 120extern void destroy_timer_on_stack(struct timer_list *timer); 121#else 122static inline void destroy_timer_on_stack(struct timer_list *timer) { } 123static inline void init_timer_on_stack_key(struct timer_list *timer, 124 const char *name, 125 struct lock_class_key *key) 126{ 127 init_timer_key(timer, name, key); 128} 129#endif 130 131static inline void setup_timer_key(struct timer_list * timer, 132 const char *name, 133 struct lock_class_key *key, 134 void (*function)(unsigned long), 135 unsigned long data) 136{ 137 timer->function = function; 138 timer->data = data; 139 init_timer_key(timer, name, key); 140} 141 142static inline void setup_timer_on_stack_key(struct timer_list *timer, 143 const char *name, 144 struct lock_class_key *key, 145 void (*function)(unsigned long), 146 unsigned long data) 147{ 148 timer->function = function; 149 timer->data = data; 150 init_timer_on_stack_key(timer, name, key); 151} 152 153/** 154 * timer_pending - is a timer pending? 155 * @timer: the timer in question 156 * 157 * timer_pending will tell whether a given timer is currently pending, 158 * or not. Callers must ensure serialization wrt. other operations done 159 * to this timer, eg. interrupt contexts, or other CPUs on SMP. 160 * 161 * return value: 1 if the timer is pending, 0 if not. 162 */ 163static inline int timer_pending(const struct timer_list * timer) 164{ 165 return timer->entry.next != NULL; 166} 167 168extern void add_timer_on(struct timer_list *timer, int cpu); 169extern int del_timer(struct timer_list * timer); 170extern int mod_timer(struct timer_list *timer, unsigned long expires); 171extern int mod_timer_pending(struct timer_list *timer, unsigned long expires); 172extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires); 173 174extern void set_timer_slack(struct timer_list *time, int slack_hz); 175 176#define TIMER_NOT_PINNED 0 177#define TIMER_PINNED 1 178/* 179 * The jiffies value which is added to now, when there is no timer 180 * in the timer wheel: 181 */ 182#define NEXT_TIMER_MAX_DELTA ((1UL << 30) - 1) 183 184/* 185 * Return when the next timer-wheel timeout occurs (in absolute jiffies), 186 * locks the timer base and does the comparison against the given 187 * jiffie. 188 */ 189extern unsigned long get_next_timer_interrupt(unsigned long now); 190 191/* 192 * Timer-statistics info: 193 */ 194#ifdef CONFIG_TIMER_STATS 195 196extern int timer_stats_active; 197 198#define TIMER_STATS_FLAG_DEFERRABLE 0x1 199 200extern void init_timer_stats(void); 201 202extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf, 203 void *timerf, char *comm, 204 unsigned int timer_flag); 205 206extern void __timer_stats_timer_set_start_info(struct timer_list *timer, 207 void *addr); 208 209static inline void timer_stats_timer_set_start_info(struct timer_list *timer) 210{ 211 if (likely(!timer_stats_active)) 212 return; 213 __timer_stats_timer_set_start_info(timer, __builtin_return_address(0)); 214} 215 216static inline void timer_stats_timer_clear_start_info(struct timer_list *timer) 217{ 218 timer->start_site = NULL; 219} 220#else 221static inline void init_timer_stats(void) 222{ 223} 224 225static inline void timer_stats_timer_set_start_info(struct timer_list *timer) 226{ 227} 228 229static inline void timer_stats_timer_clear_start_info(struct timer_list *timer) 230{ 231} 232#endif 233 234extern void add_timer(struct timer_list *timer); 235 236#ifdef CONFIG_SMP 237 extern int try_to_del_timer_sync(struct timer_list *timer); 238 extern int del_timer_sync(struct timer_list *timer); 239#else 240# define try_to_del_timer_sync(t) del_timer(t) 241# define del_timer_sync(t) del_timer(t) 242#endif 243 244#define del_singleshot_timer_sync(t) del_timer_sync(t) 245 246extern void init_timers(void); 247extern void run_local_timers(void); 248struct hrtimer; 249extern enum hrtimer_restart it_real_fn(struct hrtimer *); 250 251unsigned long __round_jiffies(unsigned long j, int cpu); 252unsigned long __round_jiffies_relative(unsigned long j, int cpu); 253unsigned long round_jiffies(unsigned long j); 254unsigned long round_jiffies_relative(unsigned long j); 255 256unsigned long __round_jiffies_up(unsigned long j, int cpu); 257unsigned long __round_jiffies_up_relative(unsigned long j, int cpu); 258unsigned long round_jiffies_up(unsigned long j); 259unsigned long round_jiffies_up_relative(unsigned long j); 260 261#endif