From nobody Mon Feb 9 07:20:25 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CFD5EB64D9 for ; Tue, 27 Jun 2023 00:59:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230212AbjF0A73 (ORCPT ); Mon, 26 Jun 2023 20:59:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54664 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230074AbjF0A7I (ORCPT ); Mon, 26 Jun 2023 20:59:08 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EFF021FC7 for ; Mon, 26 Jun 2023 17:56:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1687827372; 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=6SDcpWs1u3ahysDw5g7V3RllEryskJ/vzeC7eJOiR+M=; b=cw/4TQ1jhFEj9PkBDdLimMfYUj9yK6YBj/EpeW14jgK6XfGhsRu6D295bU5jBE6gDt+dJ4 6PpOBnbpYFnD0UlrNr4jdbnnjVoPzvkCJtBeEmVVQZ+fuhROc7J1ONELSIwLNHkd7/ojZA Ap6x+iXBiwH/xKnHTHQPax37WST/4Kc= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-9-tzvAqCY-P6eT4FQRIorBrg-1; Mon, 26 Jun 2023 20:56:05 -0400 X-MC-Unique: tzvAqCY-P6eT4FQRIorBrg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D9DEA185A795; Tue, 27 Jun 2023 00:56:04 +0000 (UTC) Received: from llong.com (unknown [10.22.33.159]) by smtp.corp.redhat.com (Postfix) with ESMTP id 061242166B25; Tue, 27 Jun 2023 00:56:03 +0000 (UTC) From: Waiman Long To: Tejun Heo , Zefan Li , Johannes Weiner , Jonathan Corbet , Shuah Khan Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Juri Lelli , Valentin Schneider , Frederic Weisbecker , Mrunal Patel , Ryan Phillips , Brent Rowsell , Peter Hunt , Phil Auld , Waiman Long Subject: [PATCH v3 7/9] cgroup/cpuset: Check partition conflict with housekeeping setup Date: Mon, 26 Jun 2023 20:55:27 -0400 Message-Id: <20230627005529.1564984-8-longman@redhat.com> In-Reply-To: <20230627005529.1564984-1-longman@redhat.com> References: <20230627005529.1564984-1-longman@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" A user can pre-configure certain CPUs in an isolated state at boot time with the "isolcpus" kernel boot command line option. Those CPUs will not be in the housekeeping_cpumask(HK_TYPE_DOMAIN) and so will not be in any sched domains. This may conflict with the partition setup at runtime. Those boot time isolated CPUs should only be used in an isolated partition. This patch adds the necessary check and disallows partition setup if the check fails. Signed-off-by: Waiman Long --- kernel/cgroup/cpuset.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index f3ff4efec6e0..a91b7ab1b163 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -75,6 +75,7 @@ enum prs_errcode { PERR_NOCPUS, PERR_HOTPLUG, PERR_CPUSEMPTY, + PERR_HKEEPING, }; =20 static const char * const perr_strings[] =3D { @@ -85,6 +86,7 @@ static const char * const perr_strings[] =3D { [PERR_NOCPUS] =3D "Parent unable to distribute cpu downstream", [PERR_HOTPLUG] =3D "No cpu available due to hotplug", [PERR_CPUSEMPTY] =3D "cpuset.cpus is empty", + [PERR_HKEEPING] =3D "partition config conflicts with housekeeping setup", }; =20 struct cpuset { @@ -1581,6 +1583,26 @@ static int remote_cpus_update(struct cpuset *cs, str= uct cpumask *newmask, return 0; } =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 housekeeping_cpumask(HK_TYPE_DOMAIN) can only be used in + * an isolated partition. + */ +static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new= _cpus) +{ + const struct cpumask *hk_domain =3D housekeeping_cpumask(HK_TYPE_DOMAIN); + bool all_in_hk =3D cpumask_subset(new_cpus, hk_domain); + + if (!all_in_hk && (prstate !=3D PRS_ISOLATED)) + 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 @@ -1681,6 +1703,9 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, if (!cpumask_intersects(xcpus, parent->exclusive_cpus)) return PERR_INVCPUS; =20 + if (prstate_housekeeping_conflict(new_prs, xcpus)) + return PERR_HKEEPING; + /* * A parent can be left with no CPU as long as there is no * task directly associated with the parent partition. @@ -2256,6 +2281,9 @@ static int update_cpumask(struct cpuset *cs, struct c= puset *trialcs, if (cpumask_empty(trialcs->exclusive_cpus)) { invalidate =3D true; cs->prs_err =3D PERR_INVCPUS; + } else if (prstate_housekeeping_conflict(old_prs, trialcs->exclusive_cpu= s)) { + invalidate =3D true; + cs->prs_err =3D PERR_HKEEPING; } else if (tasks_nocpu_error(parent, cs, trialcs->exclusive_cpus)) { invalidate =3D true; cs->prs_err =3D PERR_NOCPUS; @@ -2388,6 +2416,9 @@ static int update_exclusive_cpumask(struct cpuset *cs= , struct cpuset *trialcs, if (cpumask_empty(trialcs->exclusive_cpus)) { invalidate =3D true; cs->prs_err =3D PERR_INVCPUS; + } else if (prstate_housekeeping_conflict(old_prs, trialcs->exclusive_cpu= s)) { + invalidate =3D true; + cs->prs_err =3D PERR_HKEEPING; } else if (tasks_nocpu_error(parent, cs, trialcs->exclusive_cpus)) { invalidate =3D true; cs->prs_err =3D PERR_NOCPUS; --=20 2.31.1