All of lore.kernel.org
 help / color / mirror / Atom feed
From: Valentin Schneider <valentin.schneider@arm.com>
To: Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Qais Yousef <qais.yousef@arm.com>
Cc: linux-kernel@vger.kernel.org,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	Vincent Guittot <vincent.guittot@linaro.org>,
	Morten Rasmussen <morten.rasmussen@arm.com>,
	Quentin Perret <qperret@google.com>,
	Pavan Kondeti <pkondeti@codeaurora.org>,
	Rik van Riel <riel@surriel.com>
Subject: Re: [PATCH 5/8] sched/fair: Make check_misfit_status() only compare dynamic capacities
Date: Thu, 04 Feb 2021 11:34:38 +0000	[thread overview]
Message-ID: <jhja6sk2hip.mognet@arm.com> (raw)
In-Reply-To: <f1ea5b53-5953-15dc-6b67-9b6d520c61fc@arm.com>

On 04/02/21 11:49, Dietmar Eggemann wrote:
> On 03/02/2021 16:15, Qais Yousef wrote:
>> On 01/28/21 18:31, Valentin Schneider wrote:
>
> [...]
>
>>> @@ -10238,7 +10236,7 @@ static void nohz_balancer_kick(struct rq *rq)
>>>  		 * When ASYM_CPUCAPACITY; see if there's a higher capacity CPU
>>>  		 * to run the misfit task on.
>>>  		 */
>>> -		if (check_misfit_status(rq, sd)) {
>>> +		if (check_misfit_status(rq)) {
>
> Since check_misfit_status() doesn't need sd anymore it looks like that
> rcu_dereference(per_cpu(sd_asym_cpucapacity, cpu)) could be replaced by
> static_branch_unlikely(&sched_asym_cpucapacity)) in nohz_balancer_kick().
>
> But as you mentioned in an earlier conversation we do need to check sd
> because of asymmetric CPU capacity systems w/ exclusive cpusets which
> could create symmetric islands (unique capacity_orig among CPUs).
>
> Maybe worth putting a comment here (similar to the one in sis()) so
> people don't try to optimize?

How about:

--->8---
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c2351b87824f..4b71f4d1d324 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6322,15 +6322,8 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)
 	 * sd_asym_cpucapacity rather than sd_llc.
 	 */
 	if (static_branch_unlikely(&sched_asym_cpucapacity)) {
+		/* See sd_has_asym_cpucapacity() */
 		sd = rcu_dereference(per_cpu(sd_asym_cpucapacity, target));
-		/*
-		 * On an asymmetric CPU capacity system where an exclusive
-		 * cpuset defines a symmetric island (i.e. one unique
-		 * capacity_orig value through the cpuset), the key will be set
-		 * but the CPUs within that cpuset will not have a domain with
-		 * SD_ASYM_CPUCAPACITY. These should follow the usual symmetric
-		 * capacity path.
-		 */
 		if (sd) {
 			i = select_idle_capacity(p, sd, target);
 			return ((unsigned)i < nr_cpumask_bits) ? i : target;
@@ -10274,6 +10267,10 @@ static void nohz_balancer_kick(struct rq *rq)
 		}
 	}
 
+	/*
+	 * Below checks don't actually use the sd, but they still hinge on its
+	 * presence. See sd_has_asym_cpucapacity().
+	 */
 	sd = rcu_dereference(per_cpu(sd_asym_cpucapacity, cpu));
 	if (sd) {
 		/*
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 21bd71f58c06..ea7f0155e268 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1482,6 +1482,33 @@ DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing);
 DECLARE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity);
 extern struct static_key_false sched_asym_cpucapacity;
 
+/*
+ * Note that the static key is system-wide, but the visibility of
+ * SD_ASYM_CPUCAPACITY isn't. Thus the static key being enabled does not
+ * imply all CPUs can see asymmetry.
+ *
+ * Consider an asymmetric CPU capacity system such as:
+ *
+ * MC [           ]
+ *     0 1 2 3 4 5
+ *     L L L L B B
+ *
+ * w/ arch_scale_cpu_capacity(L) < arch_scale_cpu_capacity(B)
+ *
+ * By default, booting this system will enable the sched_asym_cpucapacity
+ * static key, and all CPUs will see SD_ASYM_CPUCAPACITY set at their MC
+ * sched_domain.
+ *
+ * Further consider exclusive cpusets creating a "symmetric island":
+ *
+ * MC [   ][      ]
+ *     0 1  2 3 4 5
+ *     L L  L L B B
+ *
+ * Again, booting this will enable the static key, but CPUs 0-1 will *not* have
+ * SD_ASYM_CPUCAPACITY set in any of their sched_domain. This is the intending
+ * behaviour, as CPUs 0-1 should be treated as a regular, isolated SMP system.
+ */
 static inline bool sd_has_asym_cpucapacity(struct sched_domain *sd)
 {
 	return static_branch_unlikely(&sched_asym_cpucapacity) &&

  reply	other threads:[~2021-02-04 11:37 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-28 18:31 [PATCH 0/8] sched/fair: misfit task load-balance tweaks Valentin Schneider
2021-01-28 18:31 ` [PATCH 1/8] sched/fair: Clean up active balance nr_balance_failed trickery Valentin Schneider
2021-02-03 15:14   ` Qais Yousef
2021-02-03 18:42     ` Valentin Schneider
2021-02-04 15:05       ` Qais Yousef
2021-02-05 13:51   ` Vincent Guittot
2021-02-05 14:05     ` Valentin Schneider
2021-02-05 14:34       ` Vincent Guittot
2021-01-28 18:31 ` [PATCH 2/8] sched/fair: Add more sched_asym_cpucapacity static branch checks Valentin Schneider
2021-02-03 15:14   ` Qais Yousef
2021-02-09  8:42   ` Vincent Guittot
2021-01-28 18:31 ` [PATCH 3/8] sched/fair: Tweak misfit-related capacity checks Valentin Schneider
2021-02-03 15:15   ` Qais Yousef
2021-02-03 18:42     ` Valentin Schneider
2021-02-05 14:31   ` Vincent Guittot
2021-02-05 16:59     ` Valentin Schneider
2021-02-05 17:17       ` Vincent Guittot
2021-02-05 20:07         ` Valentin Schneider
2021-02-08 15:29           ` Vincent Guittot
2021-02-08 17:49             ` Valentin Schneider
2021-01-28 18:31 ` [PATCH 4/8] sched/fair: Use dst_cpu's capacity rather than group {min, max} capacity Valentin Schneider
2021-02-03 15:15   ` Qais Yousef
2021-01-28 18:31 ` [PATCH 5/8] sched/fair: Make check_misfit_status() only compare dynamic capacities Valentin Schneider
2021-02-03 15:15   ` Qais Yousef
2021-02-04 10:49     ` Dietmar Eggemann
2021-02-04 11:34       ` Valentin Schneider [this message]
2021-02-04 14:57         ` Dietmar Eggemann
2021-01-28 18:31 ` [PATCH 6/8] sched/fair: Filter out locally-unsolvable misfit imbalances Valentin Schneider
2021-02-03 15:16   ` Qais Yousef
2021-02-03 18:43     ` Valentin Schneider
2021-01-28 18:31 ` [PATCH 7/8] sched/fair: Attempt misfit active balance when migration_type != migrate_misfit Valentin Schneider
2021-02-03 15:16   ` Qais Yousef
2021-02-03 18:43     ` Valentin Schneider
2021-02-04 11:44       ` Dietmar Eggemann
2021-02-04 12:22         ` Valentin Schneider
2021-02-09  8:58   ` Vincent Guittot
2021-02-09 18:19     ` Valentin Schneider
2021-01-28 18:31 ` [PATCH 8/8] sched/fair: Relax task_hot() for misfit tasks Valentin Schneider
2021-02-03 15:17   ` Qais Yousef
2021-02-08 16:21   ` Vincent Guittot
2021-02-08 18:24     ` Valentin Schneider
2021-02-09  8:56       ` Vincent Guittot
2021-02-03 15:14 ` [PATCH 0/8] sched/fair: misfit task load-balance tweaks Qais Yousef
2021-02-03 18:43   ` Valentin Schneider
2021-02-04 12:03     ` Dietmar Eggemann
2021-02-04 12:36       ` Valentin Schneider

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jhja6sk2hip.mognet@arm.com \
    --to=valentin.schneider@arm.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=morten.rasmussen@arm.com \
    --cc=peterz@infradead.org \
    --cc=pkondeti@codeaurora.org \
    --cc=qais.yousef@arm.com \
    --cc=qperret@google.com \
    --cc=riel@surriel.com \
    --cc=vincent.guittot@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.