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