aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2013-12-16 13:32:01 -0500
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2014-02-25 15:39:00 -0500
commit16d937f880312e3f47157d4d6d6ebf7e61523378 (patch)
treedfe05811720545e3b6a167e46f99e89ccb9e51e1 /kernel
parentd550e81dc0ddc04f1b417c179c214103a28e0ee8 (diff)
timers: Reduce future __run_timers() latency for newly emptied list
The __run_timers() function currently steps through the list one jiffy at a time in order to update the timer wheel. However, if the timer wheel is empty, no adjustment is needed other than updating ->timer_jiffies. Therefore, if we just emptied the timer wheel, for example, by deleting the last timer, we should mark the timer wheel as being up to date. This marking will reduce (and perhaps eliminate) the jiffy-stepping that a future __run_timers() call will need to do in response to some future timer posting or migration. This commit therefore catches ->timer_jiffies for this case. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org> Acked-by: Peter Zijlstra <peterz@infradead.org> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Reviewed-by: Steven Rostedt <rostedt@goodmis.org> Tested-by: Mike Galbraith <bitbucket@online.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/timer.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index c8bc7091d8f3..dfac34f7186f 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -688,6 +688,7 @@ detach_expired_timer(struct timer_list *timer, struct tvec_base *base)
688 if (!tbase_get_deferrable(timer->base)) 688 if (!tbase_get_deferrable(timer->base))
689 base->active_timers--; 689 base->active_timers--;
690 base->all_timers--; 690 base->all_timers--;
691 (void)catchup_timer_jiffies(base);
691} 692}
692 693
693static int detach_if_pending(struct timer_list *timer, struct tvec_base *base, 694static int detach_if_pending(struct timer_list *timer, struct tvec_base *base,
@@ -703,6 +704,7 @@ static int detach_if_pending(struct timer_list *timer, struct tvec_base *base,
703 base->next_timer = base->timer_jiffies; 704 base->next_timer = base->timer_jiffies;
704 } 705 }
705 base->all_timers--; 706 base->all_timers--;
707 (void)catchup_timer_jiffies(base);
706 return 1; 708 return 1;
707} 709}
708 710