public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] sched: calculate_imbalance: Fix local->avg_load > sds->avg_load case
@ 2013-09-15 13:49 Vladimir Davydov
  2013-09-15 13:49 ` [PATCH 2/2] sched: fix_small_imbalance: Fix local->avg_load > busiest->avg_load case Vladimir Davydov
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Vladimir Davydov @ 2013-09-15 13:49 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar; +Cc: Paul Turner, linux-kernel, devel

In busiest->group_imb case we can come to calculate_imbalance() with
local->avg_load >= busiest->avg_load >= sds->avg_load. This can result
in imbalance overflow, because it is calculated as follows

env->imbalance = min(
	max_pull * busiest->group_power,
	(sds->avg_load - local->avg_load) * local->group_power
) / SCHED_POWER_SCALE;

As a result we can end up constantly bouncing tasks from one cpu to
another if there are pinned tasks.

Fix this by skipping the assignment and assuming imbalance=0 in case
local->avg_load > sds->avg_load.
--
The bug can be caught by running 2*N cpuhogs pinned to two logical cpus
belonging to different cores on an HT-enabled machine with N logical
cpus: just look at se.nr_migrations growth.

Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
---
 kernel/sched/fair.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9b3fe1c..507a8a9 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4896,7 +4896,8 @@ static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *s
 	 * max load less than avg load(as we skip the groups at or below
 	 * its cpu_power, while calculating max_load..)
 	 */
-	if (busiest->avg_load < sds->avg_load) {
+	if (busiest->avg_load <= sds->avg_load ||
+	    local->avg_load >= sds->avg_load) {
 		env->imbalance = 0;
 		return fix_small_imbalance(env, sds);
 	}
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-09-20 13:47 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-15 13:49 [PATCH 1/2] sched: calculate_imbalance: Fix local->avg_load > sds->avg_load case Vladimir Davydov
2013-09-15 13:49 ` [PATCH 2/2] sched: fix_small_imbalance: Fix local->avg_load > busiest->avg_load case Vladimir Davydov
2013-09-20 13:46   ` [tip:sched/core] sched/balancing: Fix 'local->avg_load > busiest- >avg_load' case in fix_small_imbalance() tip-bot for Vladimir Davydov
2013-09-16  5:52 ` [PATCH 1/2] sched: calculate_imbalance: Fix local->avg_load > sds->avg_load case Peter Zijlstra
2013-09-16  8:06   ` Vladimir Davydov
2013-09-16  8:11     ` Peter Zijlstra
2013-09-20 13:46 ` [tip:sched/core] sched/balancing: Fix 'local->avg_load > sds-> avg_load' case in calculate_imbalance() tip-bot for Vladimir Davydov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox