It is found that when a local isolated partition is being invalidated
because its root partition parent is no longer valid, the isolated_cpus
cpumask may not be properly updated. If the parent was previously
an isolated partition, its invalidation should have properly updated
isolated_cpus before and no action will be needed.

Fix that by calling isolated_cpus_update() in this invalidation case
to update isolated_cpus. A test case in test_cpuset_prs.sh is modified
to test that.

Fixes: 11e5f407b64a ("cgroup/cpuset: Keep track of CPUs in isolated partitions")
Signed-off-by: Waiman Long <[email protected]>
---
 kernel/cgroup/cpuset.c                        | 19 ++++++++++++++-----
 .../selftests/cgroup/test_cpuset_prs.sh       |  4 ++--
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index 0ebba2d646c3..6b5c870e5607 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -2229,7 +2229,9 @@ static void update_cpumasks_hier(struct cpuset *cs, 
struct tmpmasks *tmp,
                 * cpuset if the parent's effective_cpus changes.
                 */
                if ((cp != cs) && old_prs) {
-                       switch (parent->partition_root_state) {
+                       int parent_prs = parent->partition_root_state;
+
+                       switch (parent_prs) {
                        case PRS_ROOT:
                        case PRS_ISOLATED:
                                update_parent = true;
@@ -2238,11 +2240,18 @@ static void update_cpumasks_hier(struct cpuset *cs, 
struct tmpmasks *tmp,
                        default:
                                /*
                                 * When parent is not a partition root or is
-                                * invalid, child partition roots become
-                                * invalid too.
+                                * invalid, child partition roots become invalid
+                                * too. For an isolated partition with root
+                                * partition parent, isolated_cpus_updated()
+                                * is called to update isolated_cpus.
                                 */
-                               if (is_partition_valid(cp))
-                                       new_prs = -cp->partition_root_state;
+                               if (is_partition_valid(cp)) {
+                                       new_prs = -old_prs;
+                                       if ((old_prs == PRS_ISOLATED) &&
+                                           (parent_prs == -PRS_ROOT))
+                                               isolated_cpus_update(old_prs, 
new_prs,
+                                                                    
cp->effective_xcpus);
+                               }
                                WRITE_ONCE(cp->prs_err,
                                           is_partition_invalid(parent)
                                           ? PERR_INVPARENT : PERR_NOTPART);
diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh 
b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
index 7efd5e645767..874a8a161236 100755
--- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
+++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
@@ -292,9 +292,9 @@ TEST_MATRIX=(
                                                                       
A1:P0|A2:P2|A3:P1 2-4|2-3"
        "   C0-4    C1-4  C2-4     .    X2-4  X2-4:P2 X3-4:P1   .    0 
A1:0-1|A2:2|A3:3-4 \
                                                                       
A1:P0|A2:P2|A3:P1 2"
-       " C0-4:X2-4 C1-4:X2-4:P2 C2-4:X4:P1 \
+       " C0-4:X2-4 C1-4:X2-4:P1 C2-4:X4:P2 \
                                   .      .      X5      .      .    0 
A1:0-4|A2:1-4|A3:2-4 \
-                                                                      
A1:P0|A2:P-2|A3:P-1 ."
+                                                                      
A1:P0|A2:P-1|A3:P-2 ."
        " C0-4:X2-4 C1-4:X2-4:P2 C2-4:X4:P1 \
                                   .      .      .      X1      .    0 
A1:0-1|A2:2-4|A3:2-4 \
                                                                       
A1:P0|A2:P2|A3:P-1 2-4"
-- 
2.55.0


Reply via email to