From nobody Fri Dec 19 10:57:58 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.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 686DD224AEB for ; Wed, 5 Nov 2025 04:39:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317557; cv=none; b=iJ6ReTFLv5T+gXPP9MfnvnWog3BzGlIBpOSDziYr03D9++nz+A1V8Q77+jCnePsiB8QvDuzevGkt40XztJPc5EeuRoHzovMXhZK8phF8+BEIXCOPRrS5eKjc+cPKlUUSKbmYEgPTsDnFMBtBLNtWWqX8A03me+LMg/20z8rycak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317557; c=relaxed/simple; bh=7jHpmWcYJsUU2T2hOdNuXivoRepIQIj6fE27OiNmH70=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=niNUm7gr44ixWOGEDtgGuU/Jozi9LXLSXhJMDl/LXeLp0DFELl0Z83MReIdL1Osf0doneE/mS1IaI3PPjKnPaCtLqkjpykd0fGqJSOcrMi/0GlyFzn04XP8VoJnUE4IMHnojzdqGDeLEezse4cclxHeXkZGHyD1nHb4Rm2wsXTQ= 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=KB6ECtAC; arc=none smtp.client-ip=170.10.133.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="KB6ECtAC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1762317554; 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: in-reply-to:in-reply-to:references:references; bh=PGxlyxFIeeJQWfJtkFlh/X5lpM+PZPG/dxHQARwfodM=; b=KB6ECtAC9DEOBtCUTgK9iB+/xFFUKZKuBbl3qjfeB1rmLC8XWH0cDHZX0hasDoYRbM9PrS VwL91cwTcIQtVreSHWWGexB/Sf8PS42tGJv3GZnaVilNnMDvCyxOsACksVOj6TKeEdqSEx vSFwjihu0WyA62zMeuAuqGb9MJqO4cI= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-556-M713oxnYONOFOx5pqhbbxw-1; Tue, 04 Nov 2025 23:39:11 -0500 X-MC-Unique: M713oxnYONOFOx5pqhbbxw-1 X-Mimecast-MFC-AGG-ID: M713oxnYONOFOx5pqhbbxw_1762317549 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2263E1956089; Wed, 5 Nov 2025 04:39:09 +0000 (UTC) Received: from llong-thinkpadp16vgen1.westford.csb (unknown [10.22.89.34]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AF26D1956095; Wed, 5 Nov 2025 04:39:06 +0000 (UTC) From: Waiman Long To: Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Ridong , Gabriele Monaco , Frederic Weisbecker , Waiman Long , Chen Ridong Subject: [cgroup/for-6.19 PATCH v3 1/5] cgroup/cpuset: Rename update_unbound_workqueue_cpumask() to update_isolation_cpumasks() Date: Tue, 4 Nov 2025 23:38:44 -0500 Message-ID: <20251105043848.382703-2-longman@redhat.com> In-Reply-To: <20251105043848.382703-1-longman@redhat.com> References: <20251105043848.382703-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: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" From: Gabriele Monaco update_unbound_workqueue_cpumask() updates unbound workqueues settings when there's a change in isolated CPUs, but it can be used for other subsystems requiring updated when isolated CPUs change. Generalise the name to update_isolation_cpumasks() to prepare for other functions unrelated to workqueues to be called in that spot. [longman: Change the function name to update_isolation_cpumasks()] Acked-by: Frederic Weisbecker Acked-by: Waiman Long Signed-off-by: Gabriele Monaco Signed-off-by: Waiman Long Reviewed-by: Chen Ridong --- kernel/cgroup/cpuset.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 7aef59ea9627..da770dac955e 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1393,7 +1393,7 @@ static bool partition_xcpus_del(int old_prs, struct c= puset *parent, return isolcpus_updated; } =20 -static void update_unbound_workqueue_cpumask(bool isolcpus_updated) +static void update_isolation_cpumasks(bool isolcpus_updated) { int ret; =20 @@ -1557,7 +1557,7 @@ static int remote_partition_enable(struct cpuset *cs,= int new_prs, list_add(&cs->remote_sibling, &remote_children); cpumask_copy(cs->effective_xcpus, tmp->new_cpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_isolation_cpumasks(isolcpus_updated); cpuset_force_rebuild(); cs->prs_err =3D 0; =20 @@ -1598,7 +1598,7 @@ static void remote_partition_disable(struct cpuset *c= s, struct tmpmasks *tmp) compute_excpus(cs, cs->effective_xcpus); reset_partition_data(cs); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_isolation_cpumasks(isolcpus_updated); cpuset_force_rebuild(); =20 /* @@ -1667,7 +1667,7 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, if (xcpus) cpumask_copy(cs->exclusive_cpus, xcpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_isolation_cpumasks(isolcpus_updated); if (adding || deleting) cpuset_force_rebuild(); =20 @@ -2011,7 +2011,7 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, tmp->delmask); =20 spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_isolation_cpumasks(isolcpus_updated); =20 if ((old_prs !=3D new_prs) && (cmd =3D=3D partcmd_update)) update_partition_exclusive_flag(cs, new_prs); @@ -3029,7 +3029,7 @@ static int update_prstate(struct cpuset *cs, int new_= prs) else if (isolcpus_updated) isolated_cpus_update(old_prs, new_prs, cs->effective_xcpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_isolation_cpumasks(isolcpus_updated); =20 /* Force update if switching back to member & update effective_xcpus */ update_cpumasks_hier(cs, &tmpmask, !new_prs); --=20 2.51.1 From nobody Fri Dec 19 10:57:58 2025 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 728E7265629 for ; Wed, 5 Nov 2025 04:39:18 +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=1762317560; cv=none; b=WwC8HHXUwf1cjSHPqYS4SEoJxtEl0PlJ5FhXh07TPMdUQLqB7yG+L22IUrjFfQNCI3Vbt91uwiMzXU+1To1Qg2jXFZWtlBh8Vw7X9HiYXyYSkGg5BfAfHnWYmr10xBuFDt6l2oPMgKFiEcygqZ6J2E1+8vPoXdW975bLpZ0fl8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317560; c=relaxed/simple; bh=FsDVuL4So5hYAjbKQr5dfptz8aZ5cBKhnkvvsXZclPc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DxGf02GRxXFZg2OrS8mFxhreOFNk9n0jGIFuAHMQ3a5AAPFoVm2GKBZy0QJ0VnQcq9ZltcTczQfQP5A9KdZyuUPYafCppEnTaN/rZK4vNIjcNcDwv99cx7AFvk2j4AwzFf4qR6EWHVEoDBU6Qj6QRyh6TkVx3DjO9S8G6/+80BE= 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=MkdQs01P; 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="MkdQs01P" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1762317557; 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: in-reply-to:in-reply-to:references:references; bh=56SeQtccCrfekrGgrecCjJvwM5GooUSBGQW14sYuREc=; b=MkdQs01P/Dl/ZU2enTRzALkiXuW3dVyIdoBSMK3aDR30pL10bVo5GlqnhPQPWn9F2f/vK7 +g8YtuaY1azp5M2zhBEwnmmBgVnxXT/xS2PCBgjOVEmbjlPVfT+Hj421WaV6IXC70xj5ar SeoXEaKPju3xO8nR2UpzG0rxACAXrbM= 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-287-69ZcZ23TOwuaBMR7Fw-poA-1; Tue, 04 Nov 2025 23:39:13 -0500 X-MC-Unique: 69ZcZ23TOwuaBMR7Fw-poA-1 X-Mimecast-MFC-AGG-ID: 69ZcZ23TOwuaBMR7Fw-poA_1762317552 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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 7D93518011EF; Wed, 5 Nov 2025 04:39:11 +0000 (UTC) Received: from llong-thinkpadp16vgen1.westford.csb (unknown [10.22.89.34]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 463B5195608E; Wed, 5 Nov 2025 04:39:09 +0000 (UTC) From: Waiman Long To: Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Ridong , Gabriele Monaco , Frederic Weisbecker , Waiman Long Subject: [cgroup/for-6.19 PATCH v3 2/5] cgroup/cpuset: Fail if isolated and nohz_full don't leave any housekeeping Date: Tue, 4 Nov 2025 23:38:45 -0500 Message-ID: <20251105043848.382703-3-longman@redhat.com> In-Reply-To: <20251105043848.382703-1-longman@redhat.com> References: <20251105043848.382703-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: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" Currently the user can set up isolated cpus via cpuset and nohz_full in such a way that leaves no housekeeping CPU (i.e. no CPU that is neither domain isolated nor nohz full). This can be a problem for other subsystems (e.g. the timer wheel imgration). Prevent this configuration by blocking any assignation that would cause the union of domain isolated cpus and nohz_full to covers all CPUs. [longman: Remove isolated_cpus_should_update() and rewrite the checking in update_prstate() and update_parent_effective_cpumask()] Originally-by: Gabriele Monaco Signed-off-by: Waiman Long Reviewed-by: Chen Ridong --- kernel/cgroup/cpuset.c | 74 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index da770dac955e..99622e90991a 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1393,6 +1393,45 @@ static bool partition_xcpus_del(int old_prs, struct = cpuset *parent, return isolcpus_updated; } =20 +/* + * isolated_cpus_can_update - check for isolated & nohz_full conflicts + * @add_cpus: cpu mask for cpus that are going to be isolated + * @del_cpus: cpu mask for cpus that are no longer isolated, can be NULL + * Return: false if there is conflict, true otherwise + * + * If nohz_full is enabled and we have isolated CPUs, their combination mu= st + * still leave housekeeping CPUs. + * + * TBD: Should consider merging this function into + * prstate_housekeeping_conflict(). + */ +static bool isolated_cpus_can_update(struct cpumask *add_cpus, + struct cpumask *del_cpus) +{ + cpumask_var_t full_hk_cpus; + int res =3D true; + + if (!housekeeping_enabled(HK_TYPE_KERNEL_NOISE)) + return true; + + if (del_cpus && cpumask_weight_and(del_cpus, + housekeeping_cpumask(HK_TYPE_KERNEL_NOISE))) + return true; + + if (!alloc_cpumask_var(&full_hk_cpus, GFP_KERNEL)) + return false; + + cpumask_and(full_hk_cpus, housekeeping_cpumask(HK_TYPE_KERNEL_NOISE), + housekeeping_cpumask(HK_TYPE_DOMAIN)); + cpumask_andnot(full_hk_cpus, full_hk_cpus, isolated_cpus); + cpumask_and(full_hk_cpus, full_hk_cpus, cpu_active_mask); + if (!cpumask_weight_andnot(full_hk_cpus, add_cpus)) + res =3D false; + + free_cpumask_var(full_hk_cpus); + return res; +} + static void update_isolation_cpumasks(bool isolcpus_updated) { int ret; @@ -1551,6 +1590,9 @@ static int remote_partition_enable(struct cpuset *cs,= int new_prs, if (!cpumask_intersects(tmp->new_cpus, cpu_active_mask) || cpumask_subset(top_cpuset.effective_cpus, tmp->new_cpus)) return PERR_INVCPUS; + if ((new_prs =3D=3D PRS_ISOLATED) && + !isolated_cpus_can_update(tmp->new_cpus, NULL)) + return PERR_HKEEPING; =20 spin_lock_irq(&callback_lock); isolcpus_updated =3D partition_xcpus_add(new_prs, NULL, tmp->new_cpus); @@ -1650,6 +1692,9 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, else if (cpumask_intersects(tmp->addmask, subpartitions_cpus) || cpumask_subset(top_cpuset.effective_cpus, tmp->addmask)) cs->prs_err =3D PERR_NOCPUS; + else if ((prs =3D=3D PRS_ISOLATED) && + !isolated_cpus_can_update(tmp->addmask, tmp->delmask)) + cs->prs_err =3D PERR_HKEEPING; if (cs->prs_err) goto invalidate; } @@ -1750,6 +1795,7 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, int part_error =3D PERR_NONE; /* Partition error? */ int isolcpus_updated =3D 0; struct cpumask *xcpus =3D user_xcpus(cs); + int parent_prs =3D parent->partition_root_state; bool nocpu; =20 lockdep_assert_held(&cpuset_mutex); @@ -1813,6 +1859,10 @@ static int update_parent_effective_cpumask(struct cp= uset *cs, int cmd, if (prstate_housekeeping_conflict(new_prs, xcpus)) return PERR_HKEEPING; =20 + if ((new_prs =3D=3D PRS_ISOLATED) && (new_prs !=3D parent_prs) && + !isolated_cpus_can_update(xcpus, NULL)) + return PERR_HKEEPING; + if (tasks_nocpu_error(parent, cs, xcpus)) return PERR_NOCPUS; =20 @@ -1866,6 +1916,7 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, * * For invalid partition: * delmask =3D newmask & parent->effective_xcpus + * The partition may become valid soon. */ if (is_partition_invalid(cs)) { adding =3D false; @@ -1880,6 +1931,23 @@ static int update_parent_effective_cpumask(struct cp= uset *cs, int cmd, deleting =3D cpumask_and(tmp->delmask, tmp->delmask, parent->effective_xcpus); } + + /* + * TBD: Invalidate a currently valid child root partition may + * still break isolated_cpus_can_update() rule if parent is an + * isolated partition. + */ + if (is_partition_valid(cs) && (old_prs !=3D parent_prs)) { + if ((parent_prs =3D=3D PRS_ROOT) && + /* Adding to parent means removing isolated CPUs */ + !isolated_cpus_can_update(tmp->delmask, tmp->addmask)) + part_error =3D PERR_HKEEPING; + if ((parent_prs =3D=3D PRS_ISOLATED) && + /* Adding to parent means adding isolated CPUs */ + !isolated_cpus_can_update(tmp->addmask, tmp->delmask)) + part_error =3D PERR_HKEEPING; + } + /* * The new CPUs to be removed from parent's effective CPUs * must be present. @@ -2994,7 +3062,11 @@ static int update_prstate(struct cpuset *cs, int new= _prs) * A change in load balance state only, no change in cpumasks. * Need to update isolated_cpus. */ - isolcpus_updated =3D true; + if ((new_prs =3D=3D PRS_ISOLATED) && + !isolated_cpus_can_update(cs->effective_xcpus, NULL)) + err =3D PERR_HKEEPING; + else + isolcpus_updated =3D true; } else { /* * Switching back to member is always allowed even if it --=20 2.51.1 From nobody Fri Dec 19 10:57:58 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.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 80A0D26E6FA for ; Wed, 5 Nov 2025 04:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317563; cv=none; b=sGt5F35DWVtud9Gp6nWuDrGuTkNeJbJtwKjezhXRU3Mgfac7DB3k7NDttBtnou3i/M9YV/JZPun2/gLuvAt/c5MTNp+/3Re/8pMncEkGcfeyL/H/45JLBofqElMwA/1zDkTZ7ZREUgFPPllq8cqnW4Ta29gv3vZsHAECLDpcmbk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317563; c=relaxed/simple; bh=RMjGOSJpyo8rJND2xA3CXsnbb4vc2vX8OFQFw74WN60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=STIYHyEEiBvdovotoIEHdNodM1y4FcdtEbi7nc7p51jkE1Ca/UGo0bHo0nPAv6Bn6q08hrf5LAJPZeeHVL4Ohtw3JPXy8ATXSpCBVEB9K7iZM4LqzTLvz+kPVidnJwD9yItHjdRT41QdxYrLRuUNfTHPuzdr0hh50pTtpj9Kh5M= 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=H65JiNB+; arc=none smtp.client-ip=170.10.133.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="H65JiNB+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1762317560; 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: in-reply-to:in-reply-to:references:references; bh=x6GCHt1CiApHsHGJP9FdQ1dyKLj8EW3fJqm5osh6hIc=; b=H65JiNB+HP5Hw2McSJCrdne2neDSWxjPXJvN5qsQniMsCZr1lfG9dUMJopWRsZweTs9i2m f7CSQOrbO16Nr6ZIW47wYPB9Hi9Aj7K3nyZJC5T+0Wrn4WtP8Gd9P8yRtPkKFwVkkrbsGp 3IfetN/N0Tvy9Ac+xt0cuepw4uNbqpQ= Received: from mx-prod-mc-08.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-478-TPZwAlc8MOS7x6WNjQ09NQ-1; Tue, 04 Nov 2025 23:39:15 -0500 X-MC-Unique: TPZwAlc8MOS7x6WNjQ09NQ-1 X-Mimecast-MFC-AGG-ID: TPZwAlc8MOS7x6WNjQ09NQ_1762317553 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id D01361800359; Wed, 5 Nov 2025 04:39:13 +0000 (UTC) Received: from llong-thinkpadp16vgen1.westford.csb (unknown [10.22.89.34]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C1CFE1956095; Wed, 5 Nov 2025 04:39:11 +0000 (UTC) From: Waiman Long To: Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Ridong , Gabriele Monaco , Frederic Weisbecker , Waiman Long Subject: [cgroup/for-6.19 PATCH v3 3/5] cgroup/cpuset: Move up prstate_housekeeping_conflict() helper Date: Tue, 4 Nov 2025 23:38:46 -0500 Message-ID: <20251105043848.382703-4-longman@redhat.com> In-Reply-To: <20251105043848.382703-1-longman@redhat.com> References: <20251105043848.382703-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: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" Move up the prstate_housekeeping_conflict() helper so that it can be used in remote partition code. Signed-off-by: Waiman Long Reviewed-by: Chen Ridong --- kernel/cgroup/cpuset.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 99622e90991a..cc9c3402f16b 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1432,6 +1432,26 @@ static bool isolated_cpus_can_update(struct cpumask = *add_cpus, return res; } =20 +/* + * prstate_housekeeping_conflict - check for partition & housekeeping conf= licts + * @prstate: partition root state to be checked + * @new_cpus: cpu mask + * Return: true if there is conflict, false otherwise + * + * CPUs outside of boot_hk_cpus, if defined, can only be used in an + * isolated partition. + */ +static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new= _cpus) +{ + if (!have_boot_isolcpus) + return false; + + if ((prstate !=3D PRS_ISOLATED) && !cpumask_subset(new_cpus, boot_hk_cpus= )) + return true; + + return false; +} + static void update_isolation_cpumasks(bool isolcpus_updated) { int ret; @@ -1727,26 +1747,6 @@ static void remote_cpus_update(struct cpuset *cs, st= ruct cpumask *xcpus, remote_partition_disable(cs, tmp); } =20 -/* - * prstate_housekeeping_conflict - check for partition & housekeeping conf= licts - * @prstate: partition root state to be checked - * @new_cpus: cpu mask - * Return: true if there is conflict, false otherwise - * - * CPUs outside of boot_hk_cpus, if defined, can only be used in an - * isolated partition. - */ -static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new= _cpus) -{ - if (!have_boot_isolcpus) - return false; - - if ((prstate !=3D PRS_ISOLATED) && !cpumask_subset(new_cpus, boot_hk_cpus= )) - return true; - - return false; -} - /** * update_parent_effective_cpumask - update effective_cpus mask of parent = cpuset * @cs: The cpuset that requests change in partition root state --=20 2.51.1 From nobody Fri Dec 19 10:57:58 2025 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 AAC2326F29C for ; Wed, 5 Nov 2025 04:39:22 +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=1762317564; cv=none; b=B0C3yKDPA+5xqxwuIkXTHuuhueBSsbfRvrQj869vsz9RoF9bt8e+nxp9Rk09Tpf8ubqGl6tnIInGuEbB/M3INZ2vjlQHMYqyy5xklYUu0JZD+KJ+1SWYWcY700XhKkN8J3jykavm0QvsNmbzv3sdWiDKfuDjIaSItt1N9G3sgKk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317564; c=relaxed/simple; bh=lksMERBV1ushFLKX6VsS5voiCsPgNY/nOBWjYiN++aE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eyadypWh12J/n91e3xH0EmQVJBhojWVsN+rcM3YMNAftWRE+ORZ5dDGA3SoJaa3d/ItxI6snHZR8eewuJpjKwj8cAwrLOua3yl7pAC/KqbD/uHYyD359zUH8Hcz+PKTGISGHHR6IYTWw+z9TvTpDJevROPduxXKhq+JqSV6N+OM= 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=J3AK/u5V; 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="J3AK/u5V" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1762317561; 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: in-reply-to:in-reply-to:references:references; bh=IPEm3+lCvSFTomkEaqugdFQCEEtIwhV9OiG9EpvN3L4=; b=J3AK/u5VnvGmRugHR3Hc5Ou3uGvZsSw4ztlG+2EYsjA+VxBQL/pVenYl1onax/pGT0L0sm 0ouq580QDqFXZo2S5acSVinY46BTTPP8NYp9GjcZm8XvAHr2+ZueKbjhlhMkS1cgrru0E6 OXB4Ks9ITzq2Y8ekHdCLmINsJ1wEeJQ= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-295-fjv1-XboNpGD31spmWZB8g-1; Tue, 04 Nov 2025 23:39:17 -0500 X-MC-Unique: fjv1-XboNpGD31spmWZB8g-1 X-Mimecast-MFC-AGG-ID: fjv1-XboNpGD31spmWZB8g_1762317556 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E2B98195606D; Wed, 5 Nov 2025 04:39:15 +0000 (UTC) Received: from llong-thinkpadp16vgen1.westford.csb (unknown [10.22.89.34]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 0452F195608E; Wed, 5 Nov 2025 04:39:13 +0000 (UTC) From: Waiman Long To: Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Ridong , Gabriele Monaco , Frederic Weisbecker , Waiman Long Subject: [cgroup/for-6.19 PATCH v3 4/5] cgroup/cpuset: Ensure domain isolated CPUs stay in root or isolated partition Date: Tue, 4 Nov 2025 23:38:47 -0500 Message-ID: <20251105043848.382703-5-longman@redhat.com> In-Reply-To: <20251105043848.382703-1-longman@redhat.com> References: <20251105043848.382703-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: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" Commit 4a74e418881f ("cgroup/cpuset: Check partition conflict with housekeeping setup") is supposed to ensure that domain isolated CPUs designated by the "isolcpus" boot command line option stay either in root partition or in isolated partitions. However, the required check wasn't implemented when a remote partition was created or when an existing partition changed type from "root" to "isolated". Even though this is a relatively minor issue, we still need to add the required prstate_housekeeping_conflict() call in the right places to ensure that the rule is strictly followed. The following steps can be used to reproduce the problem before this fix. # fmt -1 /proc/cmdline | grep isolcpus isolcpus=3D9 # cd /sys/fs/cgroup/ # echo +cpuset > cgroup.subtree_control # mkdir test # echo 9 > test/cpuset.cpus # echo isolated > test/cpuset.cpus.partition # cat test/cpuset.cpus.partition isolated # cat test/cpuset.cpus.effective 9 # echo root > test/cpuset.cpus.partition # cat test/cpuset.cpus.effective 9 # cat test/cpuset.cpus.partition root With this fix, the last few steps will become: # echo root > test/cpuset.cpus.partition # cat test/cpuset.cpus.effective 0-8,10-95 # cat test/cpuset.cpus.partition root invalid (partition config conflicts with housekeeping setup) Reported-by: Chen Ridong Signed-off-by: Waiman Long Reviewed-by: Chen Ridong --- kernel/cgroup/cpuset.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index cc9c3402f16b..2daf58bf0bbb 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1610,8 +1610,9 @@ static int remote_partition_enable(struct cpuset *cs,= int new_prs, if (!cpumask_intersects(tmp->new_cpus, cpu_active_mask) || cpumask_subset(top_cpuset.effective_cpus, tmp->new_cpus)) return PERR_INVCPUS; - if ((new_prs =3D=3D PRS_ISOLATED) && - !isolated_cpus_can_update(tmp->new_cpus, NULL)) + if (((new_prs =3D=3D PRS_ISOLATED) && + !isolated_cpus_can_update(tmp->new_cpus, NULL)) || + prstate_housekeeping_conflict(new_prs, tmp->new_cpus)) return PERR_HKEEPING; =20 spin_lock_irq(&callback_lock); @@ -3062,8 +3063,9 @@ static int update_prstate(struct cpuset *cs, int new_= prs) * A change in load balance state only, no change in cpumasks. * Need to update isolated_cpus. */ - if ((new_prs =3D=3D PRS_ISOLATED) && - !isolated_cpus_can_update(cs->effective_xcpus, NULL)) + if (((new_prs =3D=3D PRS_ISOLATED) && + !isolated_cpus_can_update(cs->effective_xcpus, NULL)) || + prstate_housekeeping_conflict(new_prs, cs->effective_xcpus)) err =3D PERR_HKEEPING; else isolcpus_updated =3D true; --=20 2.51.1 From nobody Fri Dec 19 10:57:58 2025 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 D05E0270ED2 for ; Wed, 5 Nov 2025 04:39:23 +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=1762317565; cv=none; b=S1E0Rm0tOzD3K6JpnLbuFZiAMgKJnWiJdXBN0akVOhLVG66b0bgTAVYwG/psiPbOz0BbAME4fjxbWNjoO8zl+ZOYlE3nFFvbeP+lR8RxS7zpr1QfdNdMi1BIePdx5hgXTegCAplueMBTXMIkaynplqyvRTMzUx0oyKzP0wowgas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762317565; c=relaxed/simple; bh=PRMJcyYJl61mZBeSGGgiHzEd0shtT9jlqiAi1ex1Arw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZDuNz8kE/O7uILabthSuF2utGRr7iJ5M/+Qi3FXnPQMygZr/bf3Vir1GuKttAw+TkyAd9CnIqWLbR9xHJRcnTMsoM/K+Ri2rb284//3xn12o9czZWGCVCnISS1V1eAUGujP7wDUy8jrHuYwqlPYbBCyiOcANgavVagTecvsIwRQ= 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=Ljf5b1Cg; 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="Ljf5b1Cg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1762317563; 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: in-reply-to:in-reply-to:references:references; bh=wQG5O0jywdiZSfV+8D+TD6Dmb/AbN0MrtQRlMhnkX3c=; b=Ljf5b1CgNc9nFnlNzj3nyi2MHwaQsL/Ik0IkoEnyk8rOUxkIuoPMP/PpTOo1n5b6U8Q72Y LSEE4SiR4MVNvZUMd8KIuEB2puICuHzUHB16/KiIanScMfHGERTnZunrC5S0LX/xFnXgue PMA8OoOLcWHngEcWr7SGLE4C6EyMsF4= 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-517--pHnmFIJO1CImlX9mI_A5w-1; Tue, 04 Nov 2025 23:39:19 -0500 X-MC-Unique: -pHnmFIJO1CImlX9mI_A5w-1 X-Mimecast-MFC-AGG-ID: -pHnmFIJO1CImlX9mI_A5w_1762317558 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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 DAB1118011EF; Wed, 5 Nov 2025 04:39:17 +0000 (UTC) Received: from llong-thinkpadp16vgen1.westford.csb (unknown [10.22.89.34]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 33E18195608E; Wed, 5 Nov 2025 04:39:16 +0000 (UTC) From: Waiman Long To: Tejun Heo , Johannes Weiner , =?UTF-8?q?Michal=20Koutn=C3=BD?= Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Ridong , Gabriele Monaco , Frederic Weisbecker , Waiman Long Subject: [cgroup/for-6.19 PATCH v3 5/5] cgroup/cpuset: Globally track isolated_cpus update Date: Tue, 4 Nov 2025 23:38:48 -0500 Message-ID: <20251105043848.382703-6-longman@redhat.com> In-Reply-To: <20251105043848.382703-1-longman@redhat.com> References: <20251105043848.382703-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: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" The current cpuset code passes a local isolcpus_updated flag around in a number of functions to determine if external isolation related cpumasks like wq_unbound_cpumask should be updated. It is a bit cumbersome and makes the code more complex. Simplify the code by using a global boolean flag "isolated_cpus_updating" to track this. This flag will be set in isolated_cpus_update() and cleared in update_isolation_cpumasks(). No functional change is expected. Signed-off-by: Waiman Long Reviewed-by: Chen Ridong --- kernel/cgroup/cpuset.c | 73 ++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 2daf58bf0bbb..90288efe5367 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -81,6 +81,13 @@ static cpumask_var_t subpartitions_cpus; */ static cpumask_var_t isolated_cpus; =20 +/* + * isolated_cpus updating flag (protected by cpuset_mutex) + * Set if isolated_cpus is going to be updated in the current + * cpuset_mutex crtical section. + */ +static bool isolated_cpus_updating; + /* * Housekeeping (HK_TYPE_DOMAIN) CPUs at boot */ @@ -1327,6 +1334,8 @@ static void isolated_cpus_update(int old_prs, int new= _prs, struct cpumask *xcpus cpumask_or(isolated_cpus, isolated_cpus, xcpus); else cpumask_andnot(isolated_cpus, isolated_cpus, xcpus); + + isolated_cpus_updating =3D true; } =20 /* @@ -1334,15 +1343,12 @@ static void isolated_cpus_update(int old_prs, int n= ew_prs, struct cpumask *xcpus * @new_prs: new partition_root_state * @parent: parent cpuset * @xcpus: exclusive CPUs to be added - * Return: true if isolated_cpus modified, false otherwise * * Remote partition if parent =3D=3D NULL */ -static bool partition_xcpus_add(int new_prs, struct cpuset *parent, +static void partition_xcpus_add(int new_prs, struct cpuset *parent, struct cpumask *xcpus) { - bool isolcpus_updated; - WARN_ON_ONCE(new_prs < 0); lockdep_assert_held(&callback_lock); if (!parent) @@ -1352,13 +1358,11 @@ static bool partition_xcpus_add(int new_prs, struct= cpuset *parent, if (parent =3D=3D &top_cpuset) cpumask_or(subpartitions_cpus, subpartitions_cpus, xcpus); =20 - isolcpus_updated =3D (new_prs !=3D parent->partition_root_state); - if (isolcpus_updated) + if (new_prs !=3D parent->partition_root_state) isolated_cpus_update(parent->partition_root_state, new_prs, xcpus); =20 cpumask_andnot(parent->effective_cpus, parent->effective_cpus, xcpus); - return isolcpus_updated; } =20 /* @@ -1366,15 +1370,12 @@ static bool partition_xcpus_add(int new_prs, struct= cpuset *parent, * @old_prs: old partition_root_state * @parent: parent cpuset * @xcpus: exclusive CPUs to be removed - * Return: true if isolated_cpus modified, false otherwise * * Remote partition if parent =3D=3D NULL */ -static bool partition_xcpus_del(int old_prs, struct cpuset *parent, +static void partition_xcpus_del(int old_prs, struct cpuset *parent, struct cpumask *xcpus) { - bool isolcpus_updated; - WARN_ON_ONCE(old_prs < 0); lockdep_assert_held(&callback_lock); if (!parent) @@ -1383,14 +1384,12 @@ static bool partition_xcpus_del(int old_prs, struct= cpuset *parent, if (parent =3D=3D &top_cpuset) cpumask_andnot(subpartitions_cpus, subpartitions_cpus, xcpus); =20 - isolcpus_updated =3D (old_prs !=3D parent->partition_root_state); - if (isolcpus_updated) + if (old_prs !=3D parent->partition_root_state) isolated_cpus_update(old_prs, parent->partition_root_state, xcpus); =20 cpumask_and(xcpus, xcpus, cpu_active_mask); cpumask_or(parent->effective_cpus, parent->effective_cpus, xcpus); - return isolcpus_updated; } =20 /* @@ -1452,17 +1451,24 @@ static bool prstate_housekeeping_conflict(int prsta= te, struct cpumask *new_cpus) return false; } =20 -static void update_isolation_cpumasks(bool isolcpus_updated) +/* + * update_isolation_cpumasks - Update external isolation related CPU masks + * + * The following external CPU masks will be updated if necessary: + * - workqueue unbound cpumask + */ +static void update_isolation_cpumasks(void) { int ret; =20 - lockdep_assert_cpus_held(); - - if (!isolcpus_updated) + if (!isolated_cpus_updating) return; =20 + lockdep_assert_cpus_held(); + ret =3D workqueue_unbound_exclude_cpumask(isolated_cpus); WARN_ON_ONCE(ret < 0); + isolated_cpus_updating =3D false; } =20 /** @@ -1587,8 +1593,6 @@ static inline bool is_local_partition(struct cpuset *= cs) static int remote_partition_enable(struct cpuset *cs, int new_prs, struct tmpmasks *tmp) { - bool isolcpus_updated; - /* * The user must have sysadmin privilege. */ @@ -1616,11 +1620,11 @@ static int remote_partition_enable(struct cpuset *c= s, int new_prs, return PERR_HKEEPING; =20 spin_lock_irq(&callback_lock); - isolcpus_updated =3D partition_xcpus_add(new_prs, NULL, tmp->new_cpus); + partition_xcpus_add(new_prs, NULL, tmp->new_cpus); list_add(&cs->remote_sibling, &remote_children); cpumask_copy(cs->effective_xcpus, tmp->new_cpus); spin_unlock_irq(&callback_lock); - update_isolation_cpumasks(isolcpus_updated); + update_isolation_cpumasks(); cpuset_force_rebuild(); cs->prs_err =3D 0; =20 @@ -1643,15 +1647,12 @@ static int remote_partition_enable(struct cpuset *c= s, int new_prs, */ static void remote_partition_disable(struct cpuset *cs, struct tmpmasks *t= mp) { - bool isolcpus_updated; - WARN_ON_ONCE(!is_remote_partition(cs)); WARN_ON_ONCE(!cpumask_subset(cs->effective_xcpus, subpartitions_cpus)); =20 spin_lock_irq(&callback_lock); list_del_init(&cs->remote_sibling); - isolcpus_updated =3D partition_xcpus_del(cs->partition_root_state, - NULL, cs->effective_xcpus); + partition_xcpus_del(cs->partition_root_state, NULL, cs->effective_xcpus); if (cs->prs_err) cs->partition_root_state =3D -cs->partition_root_state; else @@ -1661,7 +1662,7 @@ static void remote_partition_disable(struct cpuset *c= s, struct tmpmasks *tmp) compute_excpus(cs, cs->effective_xcpus); reset_partition_data(cs); spin_unlock_irq(&callback_lock); - update_isolation_cpumasks(isolcpus_updated); + update_isolation_cpumasks(); cpuset_force_rebuild(); =20 /* @@ -1686,7 +1687,6 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, { bool adding, deleting; int prs =3D cs->partition_root_state; - int isolcpus_updated =3D 0; =20 if (WARN_ON_ONCE(!is_remote_partition(cs))) return; @@ -1722,9 +1722,9 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, =20 spin_lock_irq(&callback_lock); if (adding) - isolcpus_updated +=3D partition_xcpus_add(prs, NULL, tmp->addmask); + partition_xcpus_add(prs, NULL, tmp->addmask); if (deleting) - isolcpus_updated +=3D partition_xcpus_del(prs, NULL, tmp->delmask); + partition_xcpus_del(prs, NULL, tmp->delmask); /* * Need to update effective_xcpus and exclusive_cpus now as * update_sibling_cpumasks() below may iterate back to the same cs. @@ -1733,7 +1733,7 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, if (xcpus) cpumask_copy(cs->exclusive_cpus, xcpus); spin_unlock_irq(&callback_lock); - update_isolation_cpumasks(isolcpus_updated); + update_isolation_cpumasks(); if (adding || deleting) cpuset_force_rebuild(); =20 @@ -1794,7 +1794,6 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, int deleting; /* Deleting cpus from parent's effective_cpus */ int old_prs, new_prs; int part_error =3D PERR_NONE; /* Partition error? */ - int isolcpus_updated =3D 0; struct cpumask *xcpus =3D user_xcpus(cs); int parent_prs =3D parent->partition_root_state; bool nocpu; @@ -2073,14 +2072,12 @@ static int update_parent_effective_cpumask(struct c= puset *cs, int cmd, * and vice versa. */ if (adding) - isolcpus_updated +=3D partition_xcpus_del(old_prs, parent, - tmp->addmask); + partition_xcpus_del(old_prs, parent, tmp->addmask); if (deleting) - isolcpus_updated +=3D partition_xcpus_add(new_prs, parent, - tmp->delmask); + partition_xcpus_add(new_prs, parent, tmp->delmask); =20 spin_unlock_irq(&callback_lock); - update_isolation_cpumasks(isolcpus_updated); + update_isolation_cpumasks(); =20 if ((old_prs !=3D new_prs) && (cmd =3D=3D partcmd_update)) update_partition_exclusive_flag(cs, new_prs); @@ -3103,7 +3100,7 @@ static int update_prstate(struct cpuset *cs, int new_= prs) else if (isolcpus_updated) isolated_cpus_update(old_prs, new_prs, cs->effective_xcpus); spin_unlock_irq(&callback_lock); - update_isolation_cpumasks(isolcpus_updated); + update_isolation_cpumasks(); =20 /* Force update if switching back to member & update effective_xcpus */ update_cpumasks_hier(cs, &tmpmask, !new_prs); --=20 2.51.1