From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62C7D32E121 for ; Mon, 28 Sep 2026 23:52:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790639549; cv=none; b=ERmK5jP/b3+ZdQzaGbDwBbtg6iXu+wuT+w67TpAKnoZnB6Zc3PW0WbBrKHfMpl3cK/X11tlkgWxDBB99sZJuLS4l3V4pzJOdXRYTc96SQwJt/cHj870u5bkQ0TBEYswUQycW0zmg3INqvzXe6csM9NYeUwdmTQ56a/D8aGTtCuM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790639549; c=relaxed/simple; bh=CHcC2R0/FpBjIYI9QxP7NaTbRmriarLBJYrCjCRrOww=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=J1W9i1JA/iXcplOkBh3Qr0mkKFAtVxG+N4/th3nRvV0yzmWpN7QO4gR3O94dpvs18Zh3oxjiEtm5+egU1SucFYY2ssJ0UxH/qYsla4Ee5O7ZiYbEUC11Eh5hQRw31cvUTRXSGtabsH0S8M2XlhTe814VUwhARJHxAFog9e9sTaU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=O3mpIGao; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="O3mpIGao" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1790639546; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=SoI2AnljE74Mg/9u9kz3KpTxax7C6jzrTY3CpPf5lp0=; b=O3mpIGaofFjAKnIARCAra8UMY3EG1nd6DnTlyzQRjcZ8dnGDf7CXBFADMMsStblQyCjQL+ 6o6Yc+FksLmvlt652WvZsLuZ+yTpZdAC7HcvuSLGAwXSav7xIyvURr7yaDjrbf7+MvMQ4/ PHr2NehS8ZAjH3jjedWTVIplkn/DAgI= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-531-obuXTviePuSGHQeVKy6_4g-1; Mon, 28 Sep 2026 19:52:24 -0400 X-MC-Unique: obuXTviePuSGHQeVKy6_4g-1 X-Mimecast-MFC-AGG-ID: obuXTviePuSGHQeVKy6_4g_1790639543 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 15DEA1828A81; Mon, 28 Sep 2026 23:52:23 +0000 (UTC) Received: from llong-thinkpadp16vgen1.redhat.corp (headnet05.pony-001.prod.iad2.dc.redhat.com [10.2.32.117]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9F6C11800345; Mon, 28 Sep 2026 23:52:20 +0000 (UTC) From: Waiman Long To: Ridong Chen , Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Hui Peng , Guopeng Zhang , Waiman Long Subject: [PATCH] cgroup/cpuset: Properly disable partition when partition state switching fails Date: Mon, 28 Sep 2026 19:51:59 -0400 Message-ID: <20260928235159.515654-1-longman@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 Before commit 103b08709e8a ("cgroup/cpuset: Fail if isolated and nohz_full don't leave any housekeeping"), the partition state can be freely switched from "root" to "isolated" and vice versa. After that commit, the switch from "root" to "isolated" can fail if it exhausts all the housekeeping CPUs. Later on, the switch from "isolated" to "root" can also fail if some of the partition CPUs are boot-time isolated by "isolcpus". The partition is made invalid when the switch fails. However, the remote_partition flag for a remote partition can remain set and the CPUs from the invalidated partition aren't cleared from subpartitions_cpus. Fix this by properly disable the partition in this case. In the case of remote_partition flag, it should be cleared for a invalidated remote partition. To be safe, the reset_partition_data() is now enhanced to always clear the remote_partition flag. So there is no need to explicitly clear remote_partition in remote_partition_disable(). On a x86 test system with boot option "isolcpus=10 cgroup_debug" set and more than 16 cores, the following commands was executed after boot. # cd /sys/fs/cgroup # echo +cpuset > cgroup.subtree_control # cat cpuset.cpus.isolated 10 # mkdir A # echo 10-12 > A/cpuset.cpus # echo isolated > A/cpuset.cpus.partition # cat A/cpuset.cpus.partition isolated Before the patch: # echo root > A/cpuset.cpus.partition # cat A/cpuset.cpus.partition root invalid (partition config conflicts with housekeeping setup) # cat cpuset.cpus.isolated .__DEBUG__.cpuset.cpus.subpartitions 10-12 10-12 After the patch: # echo root > A/cpuset.cpus.partition # cat A/cpuset.cpus.partition root invalid (partition config conflicts with housekeeping setup) # cat cpuset.cpus.isolated .__DEBUG__.cpuset.cpus.subpartitions 10 Reported-by: Tejun Heo Link: https://lore.kernel.org/lkml/7f4c57b26ad120ab30adf35653f1dd94@kernel.org/ Fixes: 103b08709e8a ("cgroup/cpuset: Fail if isolated and nohz_full don't leave any housekeeping") Signed-off-by: Waiman Long --- kernel/cgroup/cpuset.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 4a915da37bb3..9874c25eb83c 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1229,6 +1229,7 @@ static void reset_partition_data(struct cpuset *cs) lockdep_assert_held(&callback_lock); + cs->remote_partition = false; if (cpumask_empty(cs->exclusive_cpus)) cpumask_clear(cs->effective_xcpus); @@ -1615,7 +1616,6 @@ static void remote_partition_disable(struct cpuset *cs, struct tmpmasks *tmp) !cpumask_empty(subpartitions_cpus)); spin_lock_irq(&callback_lock); - cs->remote_partition = false; partition_xcpus_del(cs->partition_root_state, NULL, cs->effective_xcpus); if (cs->prs_err) cs->partition_root_state = -cs->partition_root_state; @@ -2892,6 +2892,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; @@ -2946,27 +2947,32 @@ static int update_prstate(struct cpuset *cs, int new_prs) */ if (((new_prs == PRS_ISOLATED) && !isolated_cpus_can_update(cs->effective_xcpus, NULL)) || - prstate_housekeeping_conflict(new_prs, cs->effective_xcpus)) + prstate_housekeeping_conflict(new_prs, cs->effective_xcpus)) { err = PERR_HKEEPING; - else + disable_partition = true; + } else { isolcpus_updated = true; + } } else { /* * Switching back to member is always allowed even if it * disables child partitions. */ + disable_partition = true; + } +out: + if (disable_partition) { if (is_remote_partition(cs)) remote_partition_disable(cs, &tmpmask); else update_parent_effective_cpumask(cs, partcmd_disable, NULL, &tmpmask); - /* * Invalidation of child partitions will be done in - * update_cpumasks_hier(). + * update_cpumasks_hier() below. */ } -out: + /* * Make partition invalid if an error happens. */ -- 2.55.0