Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 942295e9 authored by Morten Rasmussen's avatar Morten Rasmussen Committed by Andres Oportus
Browse files

UPSTREAM: sched/fair: Avoid pulling tasks from non-overloaded higher capacity groups



For asymmetric CPU capacity systems it is counter-productive for
throughput if low capacity CPUs are pulling tasks from non-overloaded
CPUs with higher capacity. The assumption is that higher CPU capacity is
preferred over running alone in a group with lower CPU capacity.

This patch rejects higher CPU capacity groups with one or less task per
CPU as potential busiest group which could otherwise lead to a series of
failing load-balancing attempts leading to a force-migration.

Change-Id: I6c668db8efb23c98cba6a0358a5eae550b247c27
Signed-off-by: default avatarMorten Rasmussen <morten.rasmussen@arm.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: dietmar.eggemann@arm.com
Cc: freedom.tan@mediatek.com
Cc: keita.kobayashi.ym@renesas.com
Cc: mgalbraith@suse.de
Cc: sgurrappadi@nvidia.com
Cc: vincent.guittot@linaro.org
Cc: yuyang.du@intel.com
Link: http://lkml.kernel.org/r/1476452472-24740-5-git-send-email-morten.rasmussen@arm.com


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
(cherry picked from commit 9e0994c0a1c1f82c705f1f66388e1bcffcee8bb9)
Signed-off-by: default avatarChris Redpath <chris.redpath@arm.com>
Signed-off-by: default avatarQuentin Perret <quentin.perret@arm.com>
parent 3d8cb903
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -7856,7 +7856,6 @@ group_is_overloaded(struct lb_env *env, struct sg_lb_stats *sgs)
	return false;
}


/*
 * group_smaller_cpu_capacity: Returns true if sched_group sg has smaller
 * per-cpu capacity than sched_group ref.
@@ -7989,14 +7988,20 @@ static bool update_sd_pick_busiest(struct lb_env *env,
	if (sgs->avg_load <= busiest->avg_load)
		return false;

	if (!(env->sd->flags & SD_ASYM_CPUCAPACITY))
		goto asym_packing;

	/*
	 * Candiate sg has no more than one task per cpu and has higher
	 * per-cpu capacity. No reason to pull tasks to less capable cpus.
	 * Candidate sg has no more than one task per CPU and
	 * has higher per-CPU capacity. Migrating tasks to less
	 * capable CPUs may harm throughput. Maximize throughput,
	 * power/energy consequences are not considered.
	 */
	if (sgs->sum_nr_running <= sgs->group_weight &&
	    group_smaller_cpu_capacity(sds->local, sg))
		return false;

asym_packing:
	/* This is the busiest node in its class. */
	if (!(env->sd->flags & SD_ASYM_PACKING))
		return true;