diff options
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index d6459923d245..fd6198692b57 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -404,6 +404,11 @@ static void timer_stats_account_timer(struct timer_list *timer) {} | |||
404 | 404 | ||
405 | static struct debug_obj_descr timer_debug_descr; | 405 | static struct debug_obj_descr timer_debug_descr; |
406 | 406 | ||
407 | static void *timer_debug_hint(void *addr) | ||
408 | { | ||
409 | return ((struct timer_list *) addr)->function; | ||
410 | } | ||
411 | |||
407 | /* | 412 | /* |
408 | * fixup_init is called when: | 413 | * fixup_init is called when: |
409 | * - an active object is initialized | 414 | * - an active object is initialized |
@@ -477,6 +482,7 @@ static int timer_fixup_free(void *addr, enum debug_obj_state state) | |||
477 | 482 | ||
478 | static struct debug_obj_descr timer_debug_descr = { | 483 | static struct debug_obj_descr timer_debug_descr = { |
479 | .name = "timer_list", | 484 | .name = "timer_list", |
485 | .debug_hint = timer_debug_hint, | ||
480 | .fixup_init = timer_fixup_init, | 486 | .fixup_init = timer_fixup_init, |
481 | .fixup_activate = timer_fixup_activate, | 487 | .fixup_activate = timer_fixup_activate, |
482 | .fixup_free = timer_fixup_free, | 488 | .fixup_free = timer_fixup_free, |
@@ -964,6 +970,25 @@ EXPORT_SYMBOL(try_to_del_timer_sync); | |||
964 | * add_timer_on(). Upon exit the timer is not queued and the handler is | 970 | * add_timer_on(). Upon exit the timer is not queued and the handler is |
965 | * not running on any CPU. | 971 | * not running on any CPU. |
966 | * | 972 | * |
973 | * Note: You must not hold locks that are held in interrupt context | ||
974 | * while calling this function. Even if the lock has nothing to do | ||
975 | * with the timer in question. Here's why: | ||
976 | * | ||
977 | * CPU0 CPU1 | ||
978 | * ---- ---- | ||
979 | * <SOFTIRQ> | ||
980 | * call_timer_fn(); | ||
981 | * base->running_timer = mytimer; | ||
982 | * spin_lock_irq(somelock); | ||
983 | * <IRQ> | ||
984 | * spin_lock(somelock); | ||
985 | * del_timer_sync(mytimer); | ||
986 | * while (base->running_timer == mytimer); | ||
987 | * | ||
988 | * Now del_timer_sync() will never return and never release somelock. | ||
989 | * The interrupt on the other CPU is waiting to grab somelock but | ||
990 | * it has interrupted the softirq that CPU0 is waiting to finish. | ||
991 | * | ||
967 | * The function returns whether it has deactivated a pending timer or not. | 992 | * The function returns whether it has deactivated a pending timer or not. |
968 | */ | 993 | */ |
969 | int del_timer_sync(struct timer_list *timer) | 994 | int del_timer_sync(struct timer_list *timer) |
@@ -971,6 +996,10 @@ int del_timer_sync(struct timer_list *timer) | |||
971 | #ifdef CONFIG_LOCKDEP | 996 | #ifdef CONFIG_LOCKDEP |
972 | unsigned long flags; | 997 | unsigned long flags; |
973 | 998 | ||
999 | /* | ||
1000 | * If lockdep gives a backtrace here, please reference | ||
1001 | * the synchronization rules above. | ||
1002 | */ | ||
974 | local_irq_save(flags); | 1003 | local_irq_save(flags); |
975 | lock_map_acquire(&timer->lockdep_map); | 1004 | lock_map_acquire(&timer->lockdep_map); |
976 | lock_map_release(&timer->lockdep_map); | 1005 | lock_map_release(&timer->lockdep_map); |
@@ -1295,19 +1324,6 @@ void run_local_timers(void) | |||
1295 | raise_softirq(TIMER_SOFTIRQ); | 1324 | raise_softirq(TIMER_SOFTIRQ); |
1296 | } | 1325 | } |
1297 | 1326 | ||
1298 | /* | ||
1299 | * The 64-bit jiffies value is not atomic - you MUST NOT read it | ||
1300 | * without sampling the sequence number in xtime_lock. | ||
1301 | * jiffies is defined in the linker script... | ||
1302 | */ | ||
1303 | |||
1304 | void do_timer(unsigned long ticks) | ||
1305 | { | ||
1306 | jiffies_64 += ticks; | ||
1307 | update_wall_time(); | ||
1308 | calc_global_load(ticks); | ||
1309 | } | ||
1310 | |||
1311 | #ifdef __ARCH_WANT_SYS_ALARM | 1327 | #ifdef __ARCH_WANT_SYS_ALARM |
1312 | 1328 | ||
1313 | /* | 1329 | /* |