If we run in full dynticks mode, we have no way to update the CPU load stats as typically done by update_cpu_load_active().
Hence we need to force LB_BIAS sched feature to be off because we can't rely on these statistics to measure a CPU load in order to find a target for load balancing. Instead, lets only rely on the current runqueue load weight. Signed-off-by: Frederic Weisbecker <[email protected]> Cc: Alessio Igor Bogani <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Chris Metcalf <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Geoff Levand <[email protected]> Cc: Gilad Ben Yossef <[email protected]> Cc: Hakan Akkan <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Li Zhong <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Paul E. McKenney <[email protected]> Cc: Paul Gortmaker <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Thomas Gleixner <[email protected]> --- kernel/sched/fair.c | 13 +++++++++++-- kernel/sched/features.h | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index bd9113a..4a55e8a 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -2903,6 +2903,15 @@ static unsigned long weighted_cpuload(const int cpu) return cpu_rq(cpu)->load.weight; } +static inline int sched_lb_bias(void) +{ +#ifndef CONFIG_NO_HZ_FULL + return sched_feat(LB_BIAS); +#else + return 0; +#endif +} + /* * Return a low guess at the load of a migration-source cpu weighted * according to the scheduling class and "nice" value. @@ -2915,7 +2924,7 @@ static unsigned long source_load(int cpu, int type) struct rq *rq = cpu_rq(cpu); unsigned long total = weighted_cpuload(cpu); - if (type == 0 || !sched_feat(LB_BIAS)) + if (type == 0 || !sched_lb_bias()) return total; return min(rq->cpu_load[type-1], total); @@ -2930,7 +2939,7 @@ static unsigned long target_load(int cpu, int type) struct rq *rq = cpu_rq(cpu); unsigned long total = weighted_cpuload(cpu); - if (type == 0 || !sched_feat(LB_BIAS)) + if (type == 0 || !sched_lb_bias()) return total; return max(rq->cpu_load[type-1], total); diff --git a/kernel/sched/features.h b/kernel/sched/features.h index 1ad1d2b..4c8c113 100644 --- a/kernel/sched/features.h +++ b/kernel/sched/features.h @@ -43,7 +43,10 @@ SCHED_FEAT(ARCH_POWER, true) SCHED_FEAT(HRTICK, false) SCHED_FEAT(DOUBLE_TICK, false) + +#ifndef CONFIG_NO_HZ_FULL SCHED_FEAT(LB_BIAS, true) +#endif /* * Spin-wait on mutex acquisition when the mutex owner is running on -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

