diff options
| author | Yong Zhang <yong.zhang@windriver.com> | 2010-10-20 15:57:31 -0700 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-22 14:46:25 +0200 | 
| commit | 6f1bc451e6a79470b122a37ee1fc6bbca450f444 (patch) | |
| tree | b4393f6130ae3a9075de509a0e0e9328f3bd3430 /kernel/timer.c | |
| parent | 20f33a03f0cf87e51165f7084f697acfb68e865b (diff) | |
| download | olio-linux-3.10-6f1bc451e6a79470b122a37ee1fc6bbca450f444.tar.xz olio-linux-3.10-6f1bc451e6a79470b122a37ee1fc6bbca450f444.zip  | |
timer: Make try_to_del_timer_sync() the same on SMP and UP
On UP try_to_del_timer_sync() is mapped to del_timer() which does not
take the running timer callback into account, so it has different
semantics.
Remove the SMP dependency of try_to_del_timer_sync() by using
base->running_timer in the UP case as well.
[ tglx: Removed set_running_timer() inline and tweaked the changelog ]
Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/timer.c')
| -rw-r--r-- | kernel/timer.c | 17 | 
1 files changed, 3 insertions, 14 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 72853b256ff..47b86c1e322 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -330,15 +330,6 @@ void set_timer_slack(struct timer_list *timer, int slack_hz)  }  EXPORT_SYMBOL_GPL(set_timer_slack); - -static inline void set_running_timer(struct tvec_base *base, -					struct timer_list *timer) -{ -#ifdef CONFIG_SMP -	base->running_timer = timer; -#endif -} -  static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)  {  	unsigned long expires = timer->expires; @@ -923,15 +914,12 @@ int del_timer(struct timer_list *timer)  }  EXPORT_SYMBOL(del_timer); -#ifdef CONFIG_SMP  /**   * try_to_del_timer_sync - Try to deactivate a timer   * @timer: timer do del   *   * This function tries to deactivate a timer. Upon successful (ret >= 0)   * exit the timer is not queued and the handler is not running on any CPU. - * - * It must not be called from interrupt contexts.   */  int try_to_del_timer_sync(struct timer_list *timer)  { @@ -960,6 +948,7 @@ out:  }  EXPORT_SYMBOL(try_to_del_timer_sync); +#ifdef CONFIG_SMP  /**   * del_timer_sync - deactivate a timer and wait for the handler to finish.   * @timer: the timer to be deactivated @@ -1098,7 +1087,7 @@ static inline void __run_timers(struct tvec_base *base)  			timer_stats_account_timer(timer); -			set_running_timer(base, timer); +			base->running_timer = timer;  			detach_timer(timer, 1);  			spin_unlock_irq(&base->lock); @@ -1106,7 +1095,7 @@ static inline void __run_timers(struct tvec_base *base)  			spin_lock_irq(&base->lock);  		}  	} -	set_running_timer(base, NULL); +	base->running_timer = NULL;  	spin_unlock_irq(&base->lock);  }  |