diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index b8a721bbe50d..3bbff02d5be1 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -2928,6 +2928,7 @@ static int update_prstate(struct cpuset *cs, int new_prs) struct cpuset *parent = parent_cs(cs); struct tmpmasks tmpmask; bool isolcpus_updated = false; + bool disable_partition = false; if (old_prs == new_prs) return 0; @@ -2984,15 +2985,21 @@ static int update_prstate(struct cpuset *cs, int new_prs) * Need to update isolated_cpus. */ if (prstate_housekeeping_conflict(new_prs, parent_prs, - cs->effective_xcpus, NULL)) + cs->effective_xcpus, NULL)) { + disable_partition = true; err = PERR_HKEEPING; - else + } else { isolcpus_updated = true; + } } else { /* * Switching back to member is always allowed even if it * disables child partitions. */ + disable_partition = true; + } + + if (disable_partition) { if (is_remote_partition(cs)) remote_partition_disable(cs, &tmpmask); else @@ -3001,7 +3008,7 @@ static int update_prstate(struct cpuset *cs, int new_prs) /* * Invalidation of child partitions will be done in - * update_cpumasks_hier(). + * update_cpumasks_hier() below. */ } out: @@ -3020,8 +3027,8 @@ static int update_prstate(struct cpuset *cs, int new_prs) isolated_cpus_update(old_prs, new_prs, cs->effective_xcpus); spin_unlock_irq(&callback_lock); - /* Force update if switching back to member & update effective_xcpus */ - update_cpumasks_hier(cs, &tmpmask, !new_prs); + /* Force update if partition is disabled & update effective_xcpus */ + update_cpumasks_hier(cs, &tmpmask, disable_partition); /* A newly created partition must have effective_xcpus set */ WARN_ON_ONCE(!old_prs && (new_prs > 0)