public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
From: Ben Horgan <ben.horgan@arm.com>
To: Reinette Chatre <reinette.chatre@intel.com>
Cc: amitsinght@marvell.com, baisheng.gao@unisoc.com,
	baolin.wang@linux.alibaba.com, carl@os.amperecomputing.com,
	dave.martin@arm.com, david@kernel.org, dfustini@baylibre.com,
	fenghuay@nvidia.com, gshan@redhat.com, james.morse@arm.com,
	jonathan.cameron@huawei.com, kobak@nvidia.com,
	lcherian@marvell.com, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, peternewman@google.com,
	punit.agrawal@oss.qualcomm.com, quic_jiles@quicinc.com,
	rohit.mathew@arm.com, scott@os.amperecomputing.com,
	sdonthineni@nvidia.com, tan.shaopeng@fujitsu.com,
	xhao@linux.alibaba.com, catalin.marinas@arm.com, will@kernel.org,
	corbet@lwn.net, maz@kernel.org, oupton@kernel.org,
	joey.gouly@arm.com, suzuki.poulose@arm.com,
	kvmarm@lists.linux.dev, zengheng4@huawei.com,
	linux-doc@vger.kernel.org,
	Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Subject: Re: [PATCH v4 13/41] arm_mpam: resctrl: Add boilerplate cpuhp and domain allocation
Date: Wed, 11 Feb 2026 15:36:45 +0000	[thread overview]
Message-ID: <aYyiDRD6u6p4a98h@e134344.arm.com> (raw)
In-Reply-To: <f2951303-6fe9-4674-bd16-0dbef39cc1d4@intel.com>

Hi Reinette,

On Tue, Feb 10, 2026 at 02:57:29PM -0800, Reinette Chatre wrote:
> Hi Ben,
> 
> On 2/3/26 1:43 PM, Ben Horgan wrote:
> ...
> > diff --git a/drivers/resctrl/mpam_resctrl.c b/drivers/resctrl/mpam_resctrl.c
> > new file mode 100644
> > index 000000000000..4c2248c92955
> > --- /dev/null
> > +++ b/drivers/resctrl/mpam_resctrl.c
> > @@ -0,0 +1,343 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +// Copyright (C) 2025 Arm Ltd.
> > +
> > +#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__
> > +
> > +#include <linux/arm_mpam.h>
> > +#include <linux/cacheinfo.h>
> > +#include <linux/cpu.h>
> > +#include <linux/cpumask.h>
> > +#include <linux/errno.h>
> > +#include <linux/list.h>
> > +#include <linux/printk.h>
> > +#include <linux/rculist.h>
> > +#include <linux/resctrl.h>
> > +#include <linux/slab.h>
> > +#include <linux/types.h>
> > +
> > +#include <asm/mpam.h>
> > +
> > +#include "mpam_internal.h"
> > +
> > +/*
> > + * The classes we've picked to map to resctrl resources, wrapped
> > + * in with their resctrl structure.
> > + * Class pointer may be NULL.
> > + */
> > +static struct mpam_resctrl_res mpam_resctrl_controls[RDT_NUM_RESOURCES];
> > +
> > +#define for_each_mpam_resctrl_control(res, rid)					\
> > +	for (rid = 0, res = &mpam_resctrl_controls[rid];			\
> > +	     rid < RDT_NUM_RESOURCES;						\
> > +	     rid++, res = &mpam_resctrl_controls[rid])
> > +
> > +/* The lock for modifying resctrl's domain lists from cpuhp callbacks. */
> > +static DEFINE_MUTEX(domain_list_lock);
> > +
> > +static bool exposed_alloc_capable;
> > +static bool exposed_mon_capable;
> > +
> > +bool resctrl_arch_alloc_capable(void)
> > +{
> > +	return exposed_alloc_capable;
> > +}
> > +
> > +bool resctrl_arch_mon_capable(void)
> > +{
> > +	return exposed_mon_capable;
> > +}
> > +
> > +/*
> > + * MSC may raise an error interrupt if it sees an out or range partid/pmg,
> > + * and go on to truncate the value. Regardless of what the hardware supports,
> > + * only the system wide safe value is safe to use.
> > + */
> > +u32 resctrl_arch_get_num_closid(struct rdt_resource *ignored)
> > +{
> > +	return mpam_partid_max + 1;
> > +}
> > +
> > +struct rdt_resource *resctrl_arch_get_resource(enum resctrl_res_level l)
> > +{
> > +	if (l >= RDT_NUM_RESOURCES)
> > +		return NULL;
> > +
> > +	return &mpam_resctrl_controls[l].resctrl_res;
> > +}
> > +
> > +static int mpam_resctrl_control_init(struct mpam_resctrl_res *res)
> > +{
> > +	/* TODO: initialise the resctrl resources */
> > +
> > +	return 0;
> > +}
> > +
> > +static int mpam_resctrl_pick_domain_id(int cpu, struct mpam_component *comp)
> > +{
> > +	struct mpam_class *class = comp->class;
> > +
> > +	if (class->type == MPAM_CLASS_CACHE)
> > +		return comp->comp_id;
> > +
> > +	/* TODO: repaint domain ids to match the L3 domain ids */
> > +	/* Otherwise, expose the ID used by the firmware table code. */
> > +	return comp->comp_id;
> > +}
> > +
> > +static void mpam_resctrl_domain_hdr_init(int cpu, struct mpam_component *comp,
> > +					 struct rdt_domain_hdr *hdr)
> > +{
> > +	lockdep_assert_cpus_held();
> > +
> > +	INIT_LIST_HEAD(&hdr->list);
> > +	hdr->id = mpam_resctrl_pick_domain_id(cpu, comp);
> > +	cpumask_set_cpu(cpu, &hdr->cpu_mask);
> 
> One addition via the resctrl telemetry enabling is a new rdt_domain_hdr::rid
> used for some additional checks on the header.
> https://lore.kernel.org/all/20251217172121.12030-2-tony.luck@intel.com/
> I may be missing something here though since the additional checking that this
> new field supports should have complained loudly ... unless this was tested with
> only the L3 resource that happens to be 0.

Hmmm, thanks for pointing this out. I think I've been getting away with this as
in the resctrl common code checking for 'rid' only happens for monitors which we
do keep on the L3 resource and the control checking is only in the x86.  I'll
look into this a bit more and update for this change.

> 
> ...
> 
> > +static struct mpam_resctrl_dom *
> > +mpam_resctrl_get_domain_from_cpu(int cpu, struct mpam_resctrl_res *res)
> > +{
> > +	struct mpam_resctrl_dom *dom;
> > +	struct rdt_resource *r = &res->resctrl_res;
> > +
> > +	lockdep_assert_cpus_held();
> > +
> > +	list_for_each_entry_rcu(dom, &r->ctrl_domains, resctrl_ctrl_dom.hdr.list) {
> > +		if (cpumask_test_cpu(cpu, &dom->ctrl_comp->affinity))
> > +			return dom;
> > +	}
> 
> I notice here that that only the ctrl_domains list is searched ...

The monitor searching is added in:
 [PATCH v4 28/41] arm_mpam: resctrl: Pick classes for use as mbm counters
This does seems like a bad code split. Even more so as csu counters are
added before the mbm counters.

> 
> > +
> > +	return NULL;
> > +}
> > +
> > +int mpam_resctrl_online_cpu(unsigned int cpu)
> > +{
> > +	struct mpam_resctrl_res *res;
> > +	enum resctrl_res_level rid;
> > +
> > +	guard(mutex)(&domain_list_lock);
> > +	for_each_mpam_resctrl_control(res, rid) {
> > +		struct mpam_resctrl_dom *dom;
> > +
> > +		if (!res->class)
> > +			continue;	// dummy_resource;
> > +
> > +		dom = mpam_resctrl_get_domain_from_cpu(cpu, res);
> 
> Consider a system that only supports monitoring (exposed_alloc_capable == false,
> exposed_mon_capable == true). Since mpam_resctrl_get_domain_from_cpu() only
> searches control domains then it looks to me as though dom will always be false
> here?
> 
> > +		if (!dom) {
> > +			dom = mpam_resctrl_alloc_domain(cpu, res);
> 
> Would this (on hypothetical exposed_alloc_capable == false, exposed_mon_capable == true system)
> then cause a new domain to be allocated for each CPU with a single CPU in its cpumask
> instead of allocating a single monitoring domain with multiple CPUs in its mask?
> 
> > +		} else {
> > +			if (exposed_alloc_capable) {
> > +				struct rdt_ctrl_domain *ctrl_d = &dom->resctrl_ctrl_dom;
> > +
> > +				mpam_resctrl_online_domain_hdr(cpu, &ctrl_d->hdr);
> > +			}
> > +			if (exposed_mon_capable) {
> > +				struct rdt_l3_mon_domain *mon_d = &dom->resctrl_mon_dom;
> > +
> > +				mpam_resctrl_online_domain_hdr(cpu, &mon_d->hdr);
> > +			}
> > +		}
> > +		if (IS_ERR(dom))
> > +			return PTR_ERR(dom);
> > +	}
> > +
> > +	resctrl_online_cpu(cpu);
> > +
> > +	return 0;
> > +}
> > +
> > +void mpam_resctrl_offline_cpu(unsigned int cpu)
> > +{
> > +	struct mpam_resctrl_res *res;
> > +	enum resctrl_res_level rid;
> > +
> > +	resctrl_offline_cpu(cpu);
> > +
> > +	guard(mutex)(&domain_list_lock);
> > +	for_each_mpam_resctrl_control(res, rid) {
> > +		struct mpam_resctrl_dom *dom;
> > +		struct rdt_l3_mon_domain *mon_d;
> > +		struct rdt_ctrl_domain *ctrl_d;
> > +		bool ctrl_dom_empty, mon_dom_empty;
> > +
> > +		if (!res->class)
> > +			continue;	// dummy resource
> > +
> > +		dom = mpam_resctrl_get_domain_from_cpu(cpu, res);
> > +		if (WARN_ON_ONCE(!dom))
> 
> Similar to above ... it looks to me as though this WARN may always be
> encountered on a system that only supports monitoring.

I think monitor only systems, (exposed_alloc_capable == false,
exposed_mon_capable == true), are handled properly from
[PATCH v4 28/41] arm_mpam: resctrl: Pick classes for use as mbm counters
onwards in the series.

I'll look into making the division into commits better.

> 
> > +			continue;
> > +
> > +		if (exposed_alloc_capable) {
> > +			ctrl_d = &dom->resctrl_ctrl_dom;
> > +			ctrl_dom_empty = mpam_resctrl_offline_domain_hdr(cpu, &ctrl_d->hdr);
> > +			if (ctrl_dom_empty)
> > +				resctrl_offline_ctrl_domain(&res->resctrl_res, ctrl_d);
> > +		} else {
> > +			ctrl_dom_empty = true;
> > +		}
> > +
> > +		if (exposed_mon_capable) {
> > +			mon_d = &dom->resctrl_mon_dom;
> > +			mon_dom_empty = mpam_resctrl_offline_domain_hdr(cpu, &mon_d->hdr);
> > +			if (mon_dom_empty)
> > +				resctrl_offline_mon_domain(&res->resctrl_res, &mon_d->hdr);
> > +		} else {
> > +			mon_dom_empty = true;
> > +		}
> > +
> > +		if (ctrl_dom_empty && mon_dom_empty)
> > +			kfree(dom);
> > +	}
> > +}
> > +
> 
> Reinette
> 
> 

Thanks,

Ben


  reply	other threads:[~2026-02-11 15:37 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-03 21:43 [PATCH v4 00/41] arm_mpam: Add KVM/arm64 and resctrl glue code Ben Horgan
2026-02-03 21:43 ` [PATCH v4 01/41] arm64/sysreg: Add MPAMSM_EL1 register Ben Horgan
2026-02-03 21:43 ` [PATCH v4 02/41] KVM: arm64: Preserve host MPAM configuration when changing traps Ben Horgan
2026-02-03 21:43 ` [PATCH v4 03/41] KVM: arm64: Make MPAMSM_EL1 accesses UNDEF Ben Horgan
2026-02-03 21:43 ` [PATCH v4 04/41] arm64: mpam: Context switch the MPAM registers Ben Horgan
2026-02-05 16:16   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 05/41] arm64: mpam: Re-initialise MPAM regs when CPU comes online Ben Horgan
2026-02-05 16:20   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 06/41] arm64: mpam: Drop the CONFIG_EXPERT restriction Ben Horgan
2026-02-05 14:08   ` Jonathan Cameron
2026-02-05 16:21   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 07/41] arm64: mpam: Advertise the CPUs MPAM limits to the driver Ben Horgan
2026-02-03 21:43 ` [PATCH v4 08/41] arm64: mpam: Add cpu_pm notifier to restore MPAM sysregs Ben Horgan
2026-02-05 16:54   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 09/41] arm64: mpam: Initialise and context switch the MPAMSM_EL1 register Ben Horgan
2026-02-05 16:55   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 10/41] arm64: mpam: Add helpers to change a task or cpu's MPAM PARTID/PMG values Ben Horgan
2026-02-05 16:56   ` Catalin Marinas
2026-02-03 21:43 ` [PATCH v4 11/41] KVM: arm64: Force guest EL1 to use user-space's partid configuration Ben Horgan
2026-02-03 21:43 ` [PATCH v4 12/41] KVM: arm64: Use kernel-space partid configuration for hypercalls Ben Horgan
2026-02-03 21:43 ` [PATCH v4 13/41] arm_mpam: resctrl: Add boilerplate cpuhp and domain allocation Ben Horgan
2026-02-10 22:57   ` Reinette Chatre
2026-02-11 15:36     ` Ben Horgan [this message]
2026-02-03 21:43 ` [PATCH v4 14/41] arm_mpam: resctrl: Sort the order of the domain lists Ben Horgan
2026-02-03 21:43 ` [PATCH v4 15/41] arm_mpam: resctrl: Pick the caches we will use as resctrl resources Ben Horgan
2026-02-10 23:39   ` Reinette Chatre
2026-02-11 11:05     ` Ben Horgan
2026-02-12 16:22       ` Reinette Chatre
2026-02-03 21:43 ` [PATCH v4 16/41] arm_mpam: resctrl: Implement resctrl_arch_reset_all_ctrls() Ben Horgan
2026-02-13  3:32   ` Zeng Heng
2026-02-03 21:43 ` [PATCH v4 17/41] arm_mpam: resctrl: Add resctrl_arch_get_config() Ben Horgan
2026-02-03 21:43 ` [PATCH v4 18/41] arm_mpam: resctrl: Implement helpers to update configuration Ben Horgan
2026-02-14 10:39   ` Zeng Heng
2026-02-16 14:23     ` Ben Horgan
2026-02-25  6:39       ` Zeng Heng
2026-02-03 21:43 ` [PATCH v4 19/41] arm_mpam: resctrl: Add plumbing against arm64 task and cpu hooks Ben Horgan
2026-02-03 21:43 ` [PATCH v4 20/41] arm_mpam: resctrl: Add CDP emulation Ben Horgan
2026-02-09  1:16   ` Fenghua Yu
2026-02-09 15:36     ` Ben Horgan
2026-02-11 10:50       ` Ben Horgan
2026-02-03 21:43 ` [PATCH v4 21/41] arm_mpam: resctrl: Convert to/from MPAMs fixed-point formats Ben Horgan
2026-02-03 21:43 ` [PATCH v4 22/41] arm_mpam: resctrl: Add kunit test for control format conversions Ben Horgan
2026-02-03 21:43 ` [PATCH v4 23/41] arm_mpam: resctrl: Add rmid index helpers Ben Horgan
2026-02-03 21:43 ` [PATCH v4 24/41] arm_mpam: resctrl: Add kunit test for rmid idx conversions Ben Horgan
2026-02-03 21:43 ` [PATCH v4 25/41] arm_mpam: resctrl: Wait for cacheinfo to be ready Ben Horgan
2026-02-03 21:43 ` [PATCH v4 26/41] arm_mpam: resctrl: Add support for 'MB' resource Ben Horgan
2026-02-05 16:50   ` Jonathan Cameron
2026-02-13  7:38     ` Zeng Heng
2026-02-16 13:54       ` Ben Horgan
2026-02-18 16:22         ` Ben Horgan
2026-02-18 17:17           ` Reinette Chatre
2026-02-25  8:08           ` Zeng Heng
2026-02-18 16:40     ` Ben Horgan
2026-02-10  6:20   ` Shaopeng Tan (Fujitsu)
2026-02-18 16:42     ` Ben Horgan
2026-02-03 21:43 ` [PATCH v4 27/41] arm_mpam: resctrl: Add support for csu counters Ben Horgan
2026-02-05 16:55   ` Jonathan Cameron
2026-02-03 21:43 ` [PATCH v4 28/41] arm_mpam: resctrl: Pick classes for use as mbm counters Ben Horgan
2026-02-05 16:58   ` Jonathan Cameron
2026-02-03 21:43 ` [PATCH v4 29/41] arm_mpam: resctrl: Pre-allocate free running monitors Ben Horgan
2026-02-03 21:43 ` [PATCH v4 30/41] arm_mpam: resctrl: Allow resctrl to allocate monitors Ben Horgan
2026-02-03 21:43 ` [PATCH v4 31/41] arm_mpam: resctrl: Add resctrl_arch_rmid_read() and resctrl_arch_reset_rmid() Ben Horgan
2026-02-03 21:43 ` [PATCH v4 32/41] arm_mpam: resctrl: Update the rmid reallocation limit Ben Horgan
2026-02-03 21:43 ` [PATCH v4 33/41] arm_mpam: resctrl: Add empty definitions for assorted resctrl functions Ben Horgan
2026-02-03 21:43 ` [PATCH v4 34/41] arm64: mpam: Select ARCH_HAS_CPU_RESCTRL Ben Horgan
2026-02-03 21:43 ` [PATCH v4 35/41] arm_mpam: resctrl: Call resctrl_init() on platforms that can support resctrl Ben Horgan
2026-02-03 21:43 ` [PATCH v4 36/41] arm_mpam: Add quirk framework Ben Horgan
2026-02-03 21:43 ` [PATCH v4 37/41] arm_mpam: Add workaround for T241-MPAM-1 Ben Horgan
2026-02-03 21:43 ` [PATCH v4 38/41] arm_mpam: Add workaround for T241-MPAM-4 Ben Horgan
2026-02-13  7:02   ` Shaopeng Tan (Fujitsu)
2026-02-14  1:29     ` Zeng Heng
2026-02-20  2:30       ` Shaopeng Tan (Fujitsu)
2026-02-03 21:43 ` [PATCH v4 39/41] arm_mpam: Add workaround for T241-MPAM-6 Ben Horgan
2026-02-03 21:43 ` [PATCH v4 40/41] arm_mpam: Quirk CMN-650's CSU NRDY behaviour Ben Horgan
2026-02-03 21:43 ` [PATCH v4 41/41] arm64: mpam: Add initial MPAM documentation Ben Horgan
2026-02-05 16:57   ` Catalin Marinas
2026-02-05 17:05   ` Jonathan Cameron
2026-02-18 17:02     ` Ben Horgan
2026-02-09  8:25 ` [PATCH v4 00/41] arm_mpam: Add KVM/arm64 and resctrl glue code Shaopeng Tan (Fujitsu)
2026-02-09 10:04   ` Ben Horgan
2026-02-12 14:51     ` Ben Horgan
2026-02-13  7:18       ` Shaopeng Tan (Fujitsu)
2026-02-14  9:40 ` Zeng Heng
2026-02-16 12:22   ` Ben Horgan
2026-02-24 11:03     ` Zeng Heng
2026-02-24 14:19       ` Ben Horgan
2026-02-24 15:27         ` Ben Horgan
2026-02-24 17:53         ` Ben Horgan
2026-02-26  7:17           ` Zeng Heng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aYyiDRD6u6p4a98h@e134344.arm.com \
    --to=ben.horgan@arm.com \
    --cc=amitsinght@marvell.com \
    --cc=baisheng.gao@unisoc.com \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=carl@os.amperecomputing.com \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=dave.martin@arm.com \
    --cc=david@kernel.org \
    --cc=dfustini@baylibre.com \
    --cc=fenghuay@nvidia.com \
    --cc=gshan@redhat.com \
    --cc=james.morse@arm.com \
    --cc=joey.gouly@arm.com \
    --cc=jonathan.cameron@huawei.com \
    --cc=kobak@nvidia.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=lcherian@marvell.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=oupton@kernel.org \
    --cc=peternewman@google.com \
    --cc=punit.agrawal@oss.qualcomm.com \
    --cc=quic_jiles@quicinc.com \
    --cc=reinette.chatre@intel.com \
    --cc=rohit.mathew@arm.com \
    --cc=scott@os.amperecomputing.com \
    --cc=sdonthineni@nvidia.com \
    --cc=suzuki.poulose@arm.com \
    --cc=tan.shaopeng@fujitsu.com \
    --cc=tan.shaopeng@jp.fujitsu.com \
    --cc=will@kernel.org \
    --cc=xhao@linux.alibaba.com \
    --cc=zengheng4@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox