aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Galbraith <mgalbraith@suse.de>2012-05-08 06:20:58 -0400
committerThomas Gleixner <tglx@linutronix.de>2012-05-24 19:44:50 -0400
commit5307c9556bc17e3cd26d4e94fc3b2565921834de (patch)
treee51937060ccd5e293dec7246a7961b0ae5509a53
parentce004178be1bbaa292e9e6497939e2970300095a (diff)
tick: Add tick skew boot option
Let the user decide whether power consumption or jitter is the more important consideration for their machines. Quoting removal commit af5ab277ded04bd9bc6b048c5a2f0e7d70ef0867: "Historically, Linux has tried to make the regular timer tick on the various CPUs not happen at the same time, to avoid contention on xtime_lock. Nowadays, with the tickless kernel, this contention no longer happens since time keeping and updating are done differently. In addition, this skew is actually hurting power consumption in a measurable way on many-core systems." Problems: - Contrary to the above, systems do encounter contention on both xtime_lock and RCU structure locks when the tick is synchronized. - Moderate sized RT systems suffer intolerable jitter due to the tick being synchronized. - SGI reports the same for their large systems. - Fully utilized systems reap no power saving benefit from skew removal, but do suffer from resulting induced lock contention. - 0209f649 rcu: limit rcu_node leaf-level fanout This patch was born to combat lock contention which testing showed to have been _induced by_ skew removal. Skew the tick, contention disappeared virtually completely. Signed-off-by: Mike Galbraith <mgalbraith@suse.de> Link: http://lkml.kernel.org/r/1336472458.21924.78.camel@marge.simpson.net Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--Documentation/kernel-parameters.txt9
-rw-r--r--kernel/time/tick-sched.c18
2 files changed, 27 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index b69cfdc12112..ea38cd1f0aba 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2532,6 +2532,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
2532 2532
2533 sched_debug [KNL] Enables verbose scheduler debug messages. 2533 sched_debug [KNL] Enables verbose scheduler debug messages.
2534 2534
2535 skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate
2536 xtime_lock contention on larger systems, and/or RCU lock
2537 contention on all systems with CONFIG_MAXSMP set.
2538 Format: { "0" | "1" }
2539 0 -- disable. (may be 1 via CONFIG_CMDLINE="skew_tick=1"
2540 1 -- enable.
2541 Note: increases power consumption, thus should only be
2542 enabled if running jitter sensitive (HPC/RT) workloads.
2543
2535 security= [SECURITY] Choose a security module to enable at boot. 2544 security= [SECURITY] Choose a security module to enable at boot.
2536 If this boot parameter is not specified, only the first 2545 If this boot parameter is not specified, only the first
2537 security module asking for security registration will be 2546 security module asking for security registration will be
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 6a3a5b9ff561..4eddbb5ea9c5 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -814,6 +814,8 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
814 return HRTIMER_RESTART; 814 return HRTIMER_RESTART;
815} 815}
816 816
817static int sched_skew_tick;
818
817/** 819/**
818 * tick_setup_sched_timer - setup the tick emulation timer 820 * tick_setup_sched_timer - setup the tick emulation timer
819 */ 821 */
@@ -831,6 +833,14 @@ void tick_setup_sched_timer(void)
831 /* Get the next period (per cpu) */ 833 /* Get the next period (per cpu) */
832 hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update()); 834 hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update());
833 835
836 /* Offset the tick to avert xtime_lock contention. */
837 if (sched_skew_tick) {
838 u64 offset = ktime_to_ns(tick_period) >> 1;
839 do_div(offset, num_possible_cpus());
840 offset *= smp_processor_id();
841 hrtimer_add_expires_ns(&ts->sched_timer, offset);
842 }
843
834 for (;;) { 844 for (;;) {
835 hrtimer_forward(&ts->sched_timer, now, tick_period); 845 hrtimer_forward(&ts->sched_timer, now, tick_period);
836 hrtimer_start_expires(&ts->sched_timer, 846 hrtimer_start_expires(&ts->sched_timer,
@@ -910,3 +920,11 @@ int tick_check_oneshot_change(int allow_nohz)
910 tick_nohz_switch_to_nohz(); 920 tick_nohz_switch_to_nohz();
911 return 0; 921 return 0;
912} 922}
923
924static int __init skew_tick(char *str)
925{
926 get_option(&str, &sched_skew_tick);
927
928 return 0;
929}
930early_param("skew_tick", skew_tick);