From nobody Tue Dec 16 14:57:45 2025 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6987D2C027E for ; Fri, 5 Dec 2025 22:00:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764972003; cv=none; b=A01QFFag4dOChb7vQEBpw4/UvAFdghMYzTVnIZsPXU2nt9OSErQ2Ip5f9IblsOG/1sD396uci/G0Wl3tlD+97Vsb+Kncd+iNgIJ8ljp/iK3hFefFMWMaoNbX42phrFpIH9fgTDObrGuQOnBKYZiDWM9lAlBA7mwrWaQ7F1JkUr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764972003; c=relaxed/simple; bh=qm8+UwX2jA5MZOITS+pgjttD9SxH5N1pC27W5xgvxYY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VnIYFGB9lSVKbaZdM/gUuXOJWXY+wtedJfEyHhej9OOdysFK8pzLIKBsc9wXZqsPLlUhn5tK/INHd9PWws+jl4nEObm7L70wzIAqlLXFsrgMWTf641PJ5gbh+IKBb/lgMNjUeN38fazvt7efXBJOf5s9hU2mSDjhzmY0mQ+bC4s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5C9CA1A25; Fri, 5 Dec 2025 13:59:53 -0800 (PST) Received: from merodach.members.linode.com (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id F299A3F740; Fri, 5 Dec 2025 13:59:56 -0800 (PST) From: James Morse To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: James Morse , D Scott Phillips OS , carl@os.amperecomputing.com, lcherian@marvell.com, bobo.shaobowang@huawei.com, tan.shaopeng@fujitsu.com, baolin.wang@linux.alibaba.com, Jamie Iles , Xin Hao , peternewman@google.com, dfustini@baylibre.com, amitsinght@marvell.com, David Hildenbrand , Dave Martin , Koba Ko , Shanker Donthineni , fenghuay@nvidia.com, baisheng.gao@unisoc.com, Jonathan Cameron , Gavin Shan , Ben Horgan , rohit.mathew@arm.com, reinette.chatre@intel.com, Punit Agrawal Subject: [RFC PATCH 08/38] arm_mpam: resctrl: Pick the caches we will use as resctrl resources Date: Fri, 5 Dec 2025 21:58:31 +0000 Message-Id: <20251205215901.17772-9-james.morse@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20251205215901.17772-1-james.morse@arm.com> References: <20251205215901.17772-1-james.morse@arm.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 Content-Type: text/plain; charset="utf-8" Systems with MPAM support may have a variety of control types at any point of their system layout. We can only expose certain types of control, and only if they exist at particular locations. Start with the well-know caches. These have to be depth 2 or 3 and support MPAM's cache portion bitmap controls, with a number of portions fewer than resctrl's limit. Signed-off-by: James Morse --- drivers/resctrl/mpam_resctrl.c | 91 +++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c index 320cebbd37ce..ceaf11af4fc1 100644 --- a/drivers/resctrl/mpam_resctrl.c +++ b/drivers/resctrl/mpam_resctrl.c @@ -60,10 +60,96 @@ struct rdt_resource *resctrl_arch_get_resource(enum res= ctrl_res_level l) return &mpam_resctrl_controls[l].resctrl_res; } =20 +static bool cache_has_usable_cpor(struct mpam_class *class) +{ + struct mpam_props *cprops =3D &class->props; + + if (!mpam_has_feature(mpam_feat_cpor_part, cprops)) + return false; + + /* resctrl uses u32 for all bitmap configurations */ + return (class->props.cpbm_wd <=3D 32); +} + +/* Test whether we can export MPAM_CLASS_CACHE:{2,3}? */ +static void mpam_resctrl_pick_caches(void) +{ + struct mpam_class *class; + struct mpam_resctrl_res *res; + + lockdep_assert_cpus_held(); + + guard(srcu)(&mpam_srcu); + list_for_each_entry_srcu(class, &mpam_classes, classes_list, + srcu_read_lock_held(&mpam_srcu)) { + if (class->type !=3D MPAM_CLASS_CACHE) { + pr_debug("class %u is not a cache\n", class->level); + continue; + } + + if (class->level !=3D 2 && class->level !=3D 3) { + pr_debug("class %u is not L2 or L3\n", class->level); + continue; + } + + if (!cache_has_usable_cpor(class)) { + pr_debug("class %u cache misses CPOR\n", class->level); + continue; + } + + if (!cpumask_equal(&class->affinity, cpu_possible_mask)) { + pr_debug("class %u has missing CPUs\n", class->level); + pr_debug("class %u mask %*pb !=3D %*pb\n", class->level, + cpumask_pr_args(&class->affinity), + cpumask_pr_args(cpu_possible_mask)); + continue; + } + + if (class->level =3D=3D 2) + res =3D &mpam_resctrl_controls[RDT_RESOURCE_L2]; + else + res =3D &mpam_resctrl_controls[RDT_RESOURCE_L3]; + res->class =3D class; + exposed_alloc_capable =3D true; + } +} + static int mpam_resctrl_control_init(struct mpam_resctrl_res *res, enum resctrl_res_level type) { - /* TODO: initialise the resctrl resources */ + struct mpam_class *class =3D res->class; + struct rdt_resource *r =3D &res->resctrl_res; + + switch (res->resctrl_res.rid) { + case RDT_RESOURCE_L2: + case RDT_RESOURCE_L3: + r->alloc_capable =3D true; + r->schema_fmt =3D RESCTRL_SCHEMA_BITMAP; + r->cache.arch_has_sparse_bitmasks =3D true; + + r->cache.cbm_len =3D class->props.cpbm_wd; + /* mpam_devices will reject empty bitmaps */ + r->cache.min_cbm_bits =3D 1; + + if (r->rid =3D=3D RDT_RESOURCE_L2) { + r->name =3D "L2"; + r->ctrl_scope =3D RESCTRL_L2_CACHE; + } else { + r->name =3D "L3"; + r->ctrl_scope =3D RESCTRL_L3_CACHE; + } + + /* + * Which bits are shared with other ...things... + * Unknown devices use partid-0 which uses all the bitmap + * fields. Until we configured the SMMU and GIC not to do this + * 'all the bits' is the correct answer here. + */ + r->cache.shareable_bits =3D resctrl_get_default_ctrl(r); + break; + default: + break; + } =20 return 0; } @@ -286,7 +372,8 @@ int mpam_resctrl_setup(void) res->resctrl_res.rid =3D i; } =20 - /* TODO: pick MPAM classes to map to resctrl resources */ + /* Find some classes to use for controls */ + mpam_resctrl_pick_caches(); =20 /* Initialise the resctrl structures from the classes */ for (i =3D 0; i < RDT_NUM_RESOURCES; i++) { --=20 2.39.5