diff options
Diffstat (limited to 'kernel/time/tick-sched.c')
-rw-r--r-- | kernel/time/tick-sched.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 6a3a5b9ff561..da70c6db496c 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -576,6 +576,7 @@ void tick_nohz_idle_exit(void) | |||
576 | /* Update jiffies first */ | 576 | /* Update jiffies first */ |
577 | select_nohz_load_balancer(0); | 577 | select_nohz_load_balancer(0); |
578 | tick_do_update_jiffies64(now); | 578 | tick_do_update_jiffies64(now); |
579 | update_cpu_load_nohz(); | ||
579 | 580 | ||
580 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 581 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING |
581 | /* | 582 | /* |
@@ -814,6 +815,16 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer) | |||
814 | return HRTIMER_RESTART; | 815 | return HRTIMER_RESTART; |
815 | } | 816 | } |
816 | 817 | ||
818 | static int sched_skew_tick; | ||
819 | |||
820 | static int __init skew_tick(char *str) | ||
821 | { | ||
822 | get_option(&str, &sched_skew_tick); | ||
823 | |||
824 | return 0; | ||
825 | } | ||
826 | early_param("skew_tick", skew_tick); | ||
827 | |||
817 | /** | 828 | /** |
818 | * tick_setup_sched_timer - setup the tick emulation timer | 829 | * tick_setup_sched_timer - setup the tick emulation timer |
819 | */ | 830 | */ |
@@ -831,6 +842,14 @@ void tick_setup_sched_timer(void) | |||
831 | /* Get the next period (per cpu) */ | 842 | /* Get the next period (per cpu) */ |
832 | hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update()); | 843 | hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update()); |
833 | 844 | ||
845 | /* Offset the tick to avert xtime_lock contention. */ | ||
846 | if (sched_skew_tick) { | ||
847 | u64 offset = ktime_to_ns(tick_period) >> 1; | ||
848 | do_div(offset, num_possible_cpus()); | ||
849 | offset *= smp_processor_id(); | ||
850 | hrtimer_add_expires_ns(&ts->sched_timer, offset); | ||
851 | } | ||
852 | |||
834 | for (;;) { | 853 | for (;;) { |
835 | hrtimer_forward(&ts->sched_timer, now, tick_period); | 854 | hrtimer_forward(&ts->sched_timer, now, tick_period); |
836 | hrtimer_start_expires(&ts->sched_timer, | 855 | hrtimer_start_expires(&ts->sched_timer, |