cgroups.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Will Deacon <will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: kernel-team-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org,
	Will Deacon <will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Peter Zijlstra <peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
	Waiman Long <longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Zefan Li <lizefan.x-EC8Uxl6Npydl57MIdRCFDg@public.gmane.org>,
	Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>,
	cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH 2/2] cpuset: Call set_cpus_allowed_ptr() with appropriate mask for task
Date: Tue, 31 Jan 2023 22:17:19 +0000	[thread overview]
Message-ID: <20230131221719.3176-3-will@kernel.org> (raw)
In-Reply-To: <20230131221719.3176-1-will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

set_cpus_allowed_ptr() will fail with -EINVAL if the requested
affinity mask is not a subset of the task_cpu_possible_mask() for the
task being updated. Consequently, on a heterogeneous system with cpusets
spanning the different CPU types, updates to the cgroup hierarchy can
silently fail to update task affinities when the effective affinity
mask for the cpuset is expanded.

For example, consider an arm64 system with 4 CPUs, where CPUs 2-3 are
the only cores capable of executing 32-bit tasks. Attaching a 32-bit
task to a cpuset containing CPUs 0-2 will correctly affine the task to
CPU 2. Extending the cpuset to CPUs 0-3, however, will fail to extend
the affinity mask of the 32-bit task because update_tasks_cpumask() will
pass the full 0-3 mask to set_cpus_allowed_ptr().

Extend update_tasks_cpumask() to take a temporary 'cpumask' paramater
and use it to mask the 'effective_cpus' mask with the possible mask for
each task being updated.

Fixes: 431c69fac05b ("cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus()")
Signed-off-by: Will Deacon <will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---

Note: We wondered whether it was worth calling guarantee_online_cpus()
if the cpumask_and() returns 0 in update_tasks_cpumask(), but given that
this path is only called when the effective mask changes, it didn't
seem appropriate. Ultimately, if you have 32-bit tasks attached to a
cpuset containing only 64-bit cpus, then the affinity is going to be
forced.

 kernel/cgroup/cpuset.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index 8552cc2c586a..f15fb0426707 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -1205,12 +1205,13 @@ void rebuild_sched_domains(void)
 /**
  * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset.
  * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed
+ * @new_cpus: the temp variable for the new effective_cpus mask
  *
  * Iterate through each task of @cs updating its cpus_allowed to the
  * effective cpuset's.  As this function is called with cpuset_rwsem held,
  * cpuset membership stays stable.
  */
-static void update_tasks_cpumask(struct cpuset *cs)
+static void update_tasks_cpumask(struct cpuset *cs, struct cpumask *new_cpus)
 {
 	struct css_task_iter it;
 	struct task_struct *task;
@@ -1224,7 +1225,10 @@ static void update_tasks_cpumask(struct cpuset *cs)
 		if (top_cs && (task->flags & PF_KTHREAD) &&
 		    kthread_is_per_cpu(task))
 			continue;
-		set_cpus_allowed_ptr(task, cs->effective_cpus);
+
+		cpumask_and(new_cpus, cs->effective_cpus,
+			    task_cpu_possible_mask(task));
+		set_cpus_allowed_ptr(task, new_cpus);
 	}
 	css_task_iter_end(&it);
 }
@@ -1509,7 +1513,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cs, int cmd,
 	spin_unlock_irq(&callback_lock);
 
 	if (adding || deleting)
-		update_tasks_cpumask(parent);
+		update_tasks_cpumask(parent, tmp->new_cpus);
 
 	/*
 	 * Set or clear CS_SCHED_LOAD_BALANCE when partcmd_update, if necessary.
@@ -1661,7 +1665,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp,
 		WARN_ON(!is_in_v2_mode() &&
 			!cpumask_equal(cp->cpus_allowed, cp->effective_cpus));
 
-		update_tasks_cpumask(cp);
+		update_tasks_cpumask(cp, tmp->new_cpus);
 
 		/*
 		 * On legacy hierarchy, if the effective cpumask of any non-
@@ -2309,7 +2313,7 @@ static int update_prstate(struct cpuset *cs, int new_prs)
 		}
 	}
 
-	update_tasks_cpumask(parent);
+	update_tasks_cpumask(parent, tmpmask.new_cpus);
 
 	if (parent->child_ecpus_count)
 		update_sibling_cpumasks(parent, cs, &tmpmask);
@@ -3347,7 +3351,7 @@ hotplug_update_tasks_legacy(struct cpuset *cs,
 	 * as the tasks will be migrated to an ancestor.
 	 */
 	if (cpus_updated && !cpumask_empty(cs->cpus_allowed))
-		update_tasks_cpumask(cs);
+		update_tasks_cpumask(cs, new_cpus);
 	if (mems_updated && !nodes_empty(cs->mems_allowed))
 		update_tasks_nodemask(cs);
 
@@ -3384,7 +3388,7 @@ hotplug_update_tasks(struct cpuset *cs,
 	spin_unlock_irq(&callback_lock);
 
 	if (cpus_updated)
-		update_tasks_cpumask(cs);
+		update_tasks_cpumask(cs, new_cpus);
 	if (mems_updated)
 		update_tasks_nodemask(cs);
 }
-- 
2.39.1.456.gfc5497dd1b-goog


  parent reply	other threads:[~2023-01-31 22:17 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-31 22:17 [PATCH 0/2] Fix broken cpuset affinity handling on heterogeneous systems Will Deacon
     [not found] ` <20230131221719.3176-1-will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2023-01-31 22:17   ` [PATCH 1/2] cpuset: Fix cpuset_cpus_allowed() to not filter offline CPUs Will Deacon
     [not found]     ` <20230131221719.3176-2-will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2023-02-01  4:14       ` Waiman Long
     [not found]         ` <6b068916-5e1b-a943-1aad-554964d8b746-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-01  9:14           ` Peter Zijlstra
     [not found]             ` <Y9otWX+MGOLDKU6t-Nxj+rRp3nVydTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2023-02-01 15:16               ` Waiman Long
2023-02-01 18:46                 ` Waiman Long
     [not found]                   ` <a892d340-ea99-1562-0e70-176f02f195c2-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-01 19:14                     ` Waiman Long
     [not found]                       ` <37f158af-6ca8-9f5a-c87a-0266d8bb21a6-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-01 19:17                         ` Waiman Long
2023-02-01 21:10                   ` Peter Zijlstra
2023-02-02  3:34                     ` Waiman Long
     [not found]                       ` <773e2f22-211e-163f-64bb-15ae29ad161b-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-03 11:50                         ` Will Deacon
2023-02-03 15:13                           ` Waiman Long
     [not found]                             ` <d626998b-4cb0-dd8f-fd97-21715bf2eb0b-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-03 15:26                               ` Peter Zijlstra
     [not found]                                 ` <Y90nn9NVkEhcZ6nq-Nxj+rRp3nVydTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2023-02-03 15:35                                   ` Waiman Long
2023-02-02  8:34           ` Peter Zijlstra
     [not found]             ` <Y9t1sP/6nFht7RSN-Nxj+rRp3nVydTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2023-02-02 16:06               ` Waiman Long
     [not found]                 ` <d630ca53-71f0-c735-fbc3-e826479aa86b-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-02 19:42                   ` Peter Zijlstra
     [not found]                     ` <Y9wSC1Wxlm8CKKlN-Nxj+rRp3nVydTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2023-02-02 20:46                       ` Waiman Long
     [not found]                         ` <2bc730db-704d-080b-6869-02f6d0035fad-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-02 20:48                           ` Tejun Heo
     [not found]                             ` <Y9whrU4IUeleqdrt-NiLfg/pYEd1N0TnZuCh8vA@public.gmane.org>
2023-02-02 20:53                               ` Waiman Long
2023-02-02 21:05                                 ` Waiman Long
     [not found]                                   ` <8787b5f7-9822-e49b-0357-d0ce224ca920-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-02 21:50                                     ` Tejun Heo
     [not found]                                       ` <Y9wwP4LF9vgreO3U-NiLfg/pYEd1N0TnZuCh8vA@public.gmane.org>
2023-02-03  0:54                                         ` Waiman Long
2023-02-03 16:31                                         ` Will Deacon
2023-01-31 22:17   ` Will Deacon [this message]
2023-02-01  2:22     ` [PATCH 2/2] cpuset: Call set_cpus_allowed_ptr() with appropriate mask for task Waiman Long
     [not found]       ` <66cdf2e8-f1aa-5dfe-cd2e-0e37dc0ae799-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2023-02-01  9:15         ` Peter Zijlstra
2023-02-01 15:03           ` Waiman Long
     [not found]     ` <20230131221719.3176-3-will-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2023-02-01  9:27       ` Peter Zijlstra
2023-02-03 17:55       ` Waiman Long
2023-02-06 20:21       ` Tejun Heo

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=20230131221719.3176-3-will@kernel.org \
    --to=will-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
    --cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org \
    --cc=kernel-team-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=lizefan.x-EC8Uxl6Npydl57MIdRCFDg@public.gmane.org \
    --cc=longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).