aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorVatika Harlalka <vatikaharlalka@gmail.com>2015-09-01 10:50:59 -0400
committerIngo Molnar <mingo@kernel.org>2015-09-02 04:33:22 -0400
commit9642d18eee2cd169b60c6ac0f20bda745b5a3d1e (patch)
tree11ba961bc1366fd72d9ec7f732488f1574d15281 /kernel
parente713c80a4e49d4bed5324d24755e42bf01c87556 (diff)
nohz: Affine unpinned timers to housekeepers
The problem addressed in this patch is about affining unpinned timers. Adaptive or Full Dynticks CPUs are currently disturbed by unnecessary jitter due to firing of such timers on them. This patch will affine timers to online CPUs which are not full dynticks in NOHZ_FULL configured systems. It should not introduce overhead in nohz full off case due to static keys. Signed-off-by: Vatika Harlalka <vatikaharlalka@gmail.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Reviewed-by: Preeti U Murthy <preeti@linux.vnet.ibm.com> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Chris Metcalf <cmetcalf@ezchip.com> Cc: Christoph Lameter <cl@linux.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1441119060-2230-2-git-send-email-fweisbec@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/core.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 8b864ecee0e1..0902e4d72671 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -623,18 +623,21 @@ int get_nohz_timer_target(void)
623 int i, cpu = smp_processor_id(); 623 int i, cpu = smp_processor_id();
624 struct sched_domain *sd; 624 struct sched_domain *sd;
625 625
626 if (!idle_cpu(cpu)) 626 if (!idle_cpu(cpu) && is_housekeeping_cpu(cpu))
627 return cpu; 627 return cpu;
628 628
629 rcu_read_lock(); 629 rcu_read_lock();
630 for_each_domain(cpu, sd) { 630 for_each_domain(cpu, sd) {
631 for_each_cpu(i, sched_domain_span(sd)) { 631 for_each_cpu(i, sched_domain_span(sd)) {
632 if (!idle_cpu(i)) { 632 if (!idle_cpu(i) && is_housekeeping_cpu(cpu)) {
633 cpu = i; 633 cpu = i;
634 goto unlock; 634 goto unlock;
635 } 635 }
636 } 636 }
637 } 637 }
638
639 if (!is_housekeeping_cpu(cpu))
640 cpu = housekeeping_any_cpu();
638unlock: 641unlock:
639 rcu_read_unlock(); 642 rcu_read_unlock();
640 return cpu; 643 return cpu;