From 113330577851e0350db71e2fddd8068fcf543509 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Apr 20 2023 11:01:00 +0000 Subject: cgroup/cpuset: Fix partition root's cpuset.cpus update bug (bsc#1012628). --- diff --git a/patches.kernel.org/6.2.12-116-cgroup-cpuset-Fix-partition-root-s-cpuset.cpus.patch b/patches.kernel.org/6.2.12-116-cgroup-cpuset-Fix-partition-root-s-cpuset.cpus.patch new file mode 100644 index 0000000..5ee1a4a --- /dev/null +++ b/patches.kernel.org/6.2.12-116-cgroup-cpuset-Fix-partition-root-s-cpuset.cpus.patch @@ -0,0 +1,74 @@ +From: Waiman Long +Date: Fri, 17 Mar 2023 11:15:05 -0400 +Subject: [PATCH] cgroup/cpuset: Fix partition root's cpuset.cpus update bug +References: bsc#1012628 +Patch-mainline: 6.2.12 +Git-commit: 292fd843de26c551856e66faf134512c52dd78b4 + +commit 292fd843de26c551856e66faf134512c52dd78b4 upstream. + +It was found that commit 7a2127e66a00 ("cpuset: Call +set_cpus_allowed_ptr() with appropriate mask for task") introduced a bug +that corrupted "cpuset.cpus" of a partition root when it was updated. + +It is because the tmp->new_cpus field of the passed tmp parameter +of update_parent_subparts_cpumask() should not be used at all as +it contains important cpumask data that should not be overwritten. +Fix it by using tmp->addmask instead. + +Also update update_cpumask() to make sure that trialcs->cpu_allowed +will not be corrupted until it is no longer needed. + +Fixes: 7a2127e66a00 ("cpuset: Call set_cpus_allowed_ptr() with appropriate mask for task") +Signed-off-by: Waiman Long +Cc: stable@vger.kernel.org # v6.2+ +Signed-off-by: Tejun Heo +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Jiri Slaby +--- + kernel/cgroup/cpuset.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c +index ca826bd1..56fb79a4 100644 +--- a/kernel/cgroup/cpuset.c ++++ b/kernel/cgroup/cpuset.c +@@ -1513,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, tmp->new_cpus); ++ update_tasks_cpumask(parent, tmp->addmask); + + /* + * Set or clear CS_SCHED_LOAD_BALANCE when partcmd_update, if necessary. +@@ -1770,10 +1770,13 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, + /* + * Use the cpumasks in trialcs for tmpmasks when they are pointers + * to allocated cpumasks. ++ * ++ * Note that update_parent_subparts_cpumask() uses only addmask & ++ * delmask, but not new_cpus. + */ + tmp.addmask = trialcs->subparts_cpus; + tmp.delmask = trialcs->effective_cpus; +- tmp.new_cpus = trialcs->cpus_allowed; ++ tmp.new_cpus = NULL; + #endif + + retval = validate_change(cs, trialcs); +@@ -1838,6 +1841,11 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, + } + spin_unlock_irq(&callback_lock); + ++#ifdef CONFIG_CPUMASK_OFFSTACK ++ /* Now trialcs->cpus_allowed is available */ ++ tmp.new_cpus = trialcs->cpus_allowed; ++#endif ++ + /* effective_cpus will be updated here */ + update_cpumasks_hier(cs, &tmp, false); + +-- +2.35.3 + diff --git a/series.conf b/series.conf index 49d0f02..c9e11ad 100644 --- a/series.conf +++ b/series.conf @@ -2343,6 +2343,7 @@ patches.kernel.org/6.2.12-113-PCI-MSI-Provide-missing-stub-for-pci_msix_can_.patch patches.kernel.org/6.2.12-114-x86-PCI-Add-quirk-for-AMD-XHCI-controller-that.patch patches.kernel.org/6.2.12-115-cgroup-fix-display-of-forceidle-time-at-root.patch + patches.kernel.org/6.2.12-116-cgroup-cpuset-Fix-partition-root-s-cpuset.cpus.patch ######################################################## # Build fixes that apply to the vanilla kernel too.