aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2013-12-16 10:32:01 -0800
committerAnders Roxell <anders.roxell@linaro.org>2015-06-01 12:03:38 +0200
commit2d74a9576e3931c2249467485ab54b3b2530ed69 (patch)
tree05cf3218e5b7e6ae55638041f00ee35fcca9c025
parent5f906aa66682a41b1f0c1351b63be1019d05d9f6 (diff)
downloadlinux-linaro-stable-2d74a9576e3931c2249467485ab54b3b2530ed69.tar.gz
timers: Reduce future __run_timers() latency for newly emptied list
upstream commit: 16d937f880312e3f47157d4d6d6ebf7e61523378 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> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel/timer.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/timer.c b/kernel/timer.c
index 9cf70c562fac..380f125ad100 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -691,6 +691,7 @@ detach_expired_timer(struct timer_list *timer, struct tvec_base *base)
if (!tbase_get_deferrable(timer->base))
base->active_timers--;
base->all_timers--;
+ (void)catchup_timer_jiffies(base);
}
static int detach_if_pending(struct timer_list *timer, struct tvec_base *base,
@@ -706,6 +707,7 @@ static int detach_if_pending(struct timer_list *timer, struct tvec_base *base,
base->next_timer = base->timer_jiffies;
}
base->all_timers--;
+ (void)catchup_timer_jiffies(base);
return 1;
}