summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong Zhang <yong.zhang@windriver.com>2010-10-21 00:57:32 +0200
committerThomas Gleixner <tglx@linutronix.de>2010-10-22 14:46:25 +0200
commit1118e2cd33d47254854e1ba3ba8e32802ff14fdf (patch)
tree09bb7b87d78ecfa542a419640f36505fac11fb79
parenttimer: Make try_to_del_timer_sync() the same on SMP and UP (diff)
downloadlinux-1118e2cd33d47254854e1ba3ba8e32802ff14fdf.tar.xz
linux-1118e2cd33d47254854e1ba3ba8e32802ff14fdf.zip
timer: Del_timer_sync() can be used in softirq context
Actually we have used del_timer_sync() in softirq context for a long time, e.g. in __dst_free()::cancel_delayed_work(). So change the comments of it to warn on hardirq context only, and make lockdep know about this change. Signed-off-by: Yong Zhang <yong.zhang0@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--kernel/timer.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index 47b86c1e3226..612de0306e79 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -959,7 +959,7 @@ EXPORT_SYMBOL(try_to_del_timer_sync);
*
* Synchronization rules: Callers must prevent restarting of the timer,
* otherwise this function is meaningless. It must not be called from
- * interrupt contexts. The caller must not hold locks which would prevent
+ * hardirq contexts. The caller must not hold locks which would prevent
* completion of the timer's handler. The timer's handler must not call
* add_timer_on(). Upon exit the timer is not queued and the handler is
* not running on any CPU.
@@ -969,12 +969,10 @@ EXPORT_SYMBOL(try_to_del_timer_sync);
int del_timer_sync(struct timer_list *timer)
{
#ifdef CONFIG_LOCKDEP
- unsigned long flags;
-
- local_irq_save(flags);
+ local_bh_disable();
lock_map_acquire(&timer->lockdep_map);
lock_map_release(&timer->lockdep_map);
- local_irq_restore(flags);
+ local_bh_enable();
#endif
for (;;) {