All of lore.kernel.org
 help / color / mirror / Atom feed
From: "tip-bot2 for Will Deacon" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Will Deacon <will@kernel.org>,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Valentin Schneider <Valentin.Schneider@arm.com>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: sched/core] cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus()
Date: Mon, 23 Aug 2021 09:26:24 -0000	[thread overview]
Message-ID: <162971078439.25758.9786344164798338385.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20210730112443.23245-4-will@kernel.org>

The following commit has been merged into the sched/core branch of tip:

Commit-ID:     431c69fac05baa7477d61a44f2708e069f2bed6c
Gitweb:        https://git.kernel.org/tip/431c69fac05baa7477d61a44f2708e069f2bed6c
Author:        Will Deacon <will@kernel.org>
AuthorDate:    Fri, 30 Jul 2021 12:24:30 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Fri, 20 Aug 2021 12:32:59 +02:00

cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus()

Asymmetric systems may not offer the same level of userspace ISA support
across all CPUs, meaning that some applications cannot be executed by
some CPUs. As a concrete example, upcoming arm64 big.LITTLE designs do
not feature support for 32-bit applications on both clusters.

Modify guarantee_online_cpus() to take task_cpu_possible_mask() into
account when trying to find a suitable set of online CPUs for a given
task. This will avoid passing an invalid mask to set_cpus_allowed_ptr()
during ->attach() and will subsequently allow the cpuset hierarchy to be
taken into account when forcefully overriding the affinity mask for a
task which requires migration to a compatible CPU.

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Valentin Schneider <Valentin.Schneider@arm.com>
Link: https://lkml.kernel.org/r/20210730112443.23245-4-will@kernel.org
---
 include/linux/cpuset.h |  2 +-
 kernel/cgroup/cpuset.c | 43 ++++++++++++++++++++++++-----------------
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
index ed6ec67..414a8e6 100644
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -185,7 +185,7 @@ static inline void cpuset_read_unlock(void) { }
 static inline void cpuset_cpus_allowed(struct task_struct *p,
 				       struct cpumask *mask)
 {
-	cpumask_copy(mask, cpu_possible_mask);
+	cpumask_copy(mask, task_cpu_possible_mask(p));
 }
 
 static inline void cpuset_cpus_allowed_fallback(struct task_struct *p)
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index a869378..3918132 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -372,18 +372,29 @@ static inline bool is_in_v2_mode(void)
 }
 
 /*
- * Return in pmask the portion of a cpusets's cpus_allowed that
- * are online.  If none are online, walk up the cpuset hierarchy
- * until we find one that does have some online cpus.
+ * Return in pmask the portion of a task's cpusets's cpus_allowed that
+ * are online and are capable of running the task.  If none are found,
+ * walk up the cpuset hierarchy until we find one that does have some
+ * appropriate cpus.
  *
  * One way or another, we guarantee to return some non-empty subset
  * of cpu_online_mask.
  *
  * Call with callback_lock or cpuset_mutex held.
  */
-static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
+static void guarantee_online_cpus(struct task_struct *tsk,
+				  struct cpumask *pmask)
 {
-	while (!cpumask_intersects(cs->effective_cpus, cpu_online_mask)) {
+	const struct cpumask *possible_mask = task_cpu_possible_mask(tsk);
+	struct cpuset *cs;
+
+	if (WARN_ON(!cpumask_and(pmask, possible_mask, cpu_online_mask)))
+		cpumask_copy(pmask, cpu_online_mask);
+
+	rcu_read_lock();
+	cs = task_cs(tsk);
+
+	while (!cpumask_intersects(cs->effective_cpus, pmask)) {
 		cs = parent_cs(cs);
 		if (unlikely(!cs)) {
 			/*
@@ -393,11 +404,13 @@ static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
 			 * cpuset's effective_cpus is on its way to be
 			 * identical to cpu_online_mask.
 			 */
-			cpumask_copy(pmask, cpu_online_mask);
-			return;
+			goto out_unlock;
 		}
 	}
-	cpumask_and(pmask, cs->effective_cpus, cpu_online_mask);
+	cpumask_and(pmask, pmask, cs->effective_cpus);
+
+out_unlock:
+	rcu_read_unlock();
 }
 
 /*
@@ -2199,15 +2212,13 @@ static void cpuset_attach(struct cgroup_taskset *tset)
 
 	percpu_down_write(&cpuset_rwsem);
 
-	/* prepare for attach */
-	if (cs == &top_cpuset)
-		cpumask_copy(cpus_attach, cpu_possible_mask);
-	else
-		guarantee_online_cpus(cs, cpus_attach);
-
 	guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
 
 	cgroup_taskset_for_each(task, css, tset) {
+		if (cs != &top_cpuset)
+			guarantee_online_cpus(task, cpus_attach);
+		else
+			cpumask_copy(cpus_attach, task_cpu_possible_mask(task));
 		/*
 		 * can_attach beforehand should guarantee that this doesn't
 		 * fail.  TODO: have a better way to handle failure here
@@ -3302,9 +3313,7 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
 	unsigned long flags;
 
 	spin_lock_irqsave(&callback_lock, flags);
-	rcu_read_lock();
-	guarantee_online_cpus(task_cs(tsk), pmask);
-	rcu_read_unlock();
+	guarantee_online_cpus(tsk, pmask);
 	spin_unlock_irqrestore(&callback_lock, flags);
 }
 

  reply	other threads:[~2021-08-23  9:26 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-30 11:24 [PATCH v11 00/16] Add support for 32-bit tasks on asymmetric AArch32 systems Will Deacon
2021-07-30 11:24 ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 01/16] sched: Introduce task_cpu_possible_mask() to limit fallback rq selection Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 02/16] cpuset: Don't use the cpu_possible_mask as a last resort for cgroup v1 Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 03/16] cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus() Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` tip-bot2 for Will Deacon [this message]
2021-07-30 11:24 ` [PATCH v11 04/16] cpuset: Cleanup cpuset_cpus_allowed_fallback() use in select_fallback_rq() Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 05/16] sched: Reject CPU affinity changes based on task_cpu_possible_mask() Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 06/16] sched: Introduce task_struct::user_cpus_ptr to track requested affinity Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 07/16] sched: Split the guts of sched_setaffinity() into a helper function Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-17 15:40   ` Peter Zijlstra
2021-08-17 15:40     ` Peter Zijlstra
2021-08-18 10:50     ` Will Deacon
2021-08-18 10:50       ` Will Deacon
2021-08-18 10:56       ` Peter Zijlstra
2021-08-18 10:56         ` Peter Zijlstra
2021-08-18 11:11         ` Will Deacon
2021-08-18 11:11           ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 08/16] sched: Allow task CPU affinity to be restricted on asymmetric systems Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-17 15:10   ` Peter Zijlstra
2021-08-17 15:10     ` Peter Zijlstra
2021-08-18 10:42     ` Will Deacon
2021-08-18 10:42       ` Will Deacon
2021-08-18 10:56       ` Peter Zijlstra
2021-08-18 10:56         ` Peter Zijlstra
2021-08-18 11:53         ` Peter Zijlstra
2021-08-18 11:53           ` Peter Zijlstra
2021-08-18 12:19           ` Will Deacon
2021-08-18 12:19             ` Will Deacon
2021-08-18 11:06       ` Peter Zijlstra
2021-08-18 11:06         ` Peter Zijlstra
2021-08-17 15:41   ` Peter Zijlstra
2021-08-17 15:41     ` Peter Zijlstra
2021-08-18 10:43     ` Will Deacon
2021-08-18 10:43       ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 09/16] sched: Introduce dl_task_check_affinity() to check proposed affinity Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-08-23  9:26   ` [tip: sched/core] " tip-bot2 for Will Deacon
2021-07-30 11:24 ` [PATCH v11 10/16] arm64: Implement task_cpu_possible_mask() Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 11/16] arm64: exec: Adjust affinity for compat tasks with mismatched 32-bit EL0 Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 12/16] arm64: Prevent offlining first CPU with 32-bit EL0 on mismatched system Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 13/16] arm64: Advertise CPUs capable of running 32-bit applications in sysfs Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 14/16] arm64: Hook up cmdline parameter to allow mismatched 32-bit EL0 Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 15/16] arm64: Remove logic to kill 32-bit tasks on 64-bit-only cores Will Deacon
2021-07-30 11:24   ` Will Deacon
2021-07-30 11:24 ` [PATCH v11 16/16] Documentation: arm64: describe asymmetric 32-bit support Will Deacon
2021-07-30 11:24   ` Will Deacon

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=162971078439.25758.9786344164798338385.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=Valentin.Schneider@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    --subject='Re: [tip: sched/core] cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus()' \
    /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

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.