From: Jonathan Cameron <jonathan.cameron@huawei.com>
To: Ben Horgan <ben.horgan@arm.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>, <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>,
<reinette.chatre@intel.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>
Subject: Re: [PATCH v2 07/45] arm64: mpam: Context switch the MPAM registers
Date: Mon, 5 Jan 2026 17:04:51 +0000 [thread overview]
Message-ID: <20260105170451.00005669@huawei.com> (raw)
In-Reply-To: <20251219181147.3404071-8-ben.horgan@arm.com>
On Fri, 19 Dec 2025 18:11:09 +0000
Ben Horgan <ben.horgan@arm.com> wrote:
> From: James Morse <james.morse@arm.com>
>
> MPAM allows traffic in the SoC to be labeled by the OS, these labels are
> used to apply policy in caches and bandwidth regulators, and to monitor
> traffic in the SoC. The label is made up of a PARTID and PMG value. The x86
> equivalent calls these CLOSID and RMID, but they don't map precisely.
>
> MPAM has two CPU system registers that is used to hold the PARTID and PMG
> values that traffic generated at each exception level will use. These can
> be set per-task by the resctrl file system. (resctrl is the defacto
> interface for controlling this stuff).
>
> Add a helper to switch this.
>
> struct task_struct's separate CLOSID and RMID fields are insufficient to
> implement resctrl using MPAM, as resctrl can change the PARTID (CLOSID) and
> PMG (sort of like the RMID) separately. On x86, the rmid is an independent
> number, so a race that writes a mismatched closid and rmid into hardware is
> benign. On arm64, the pmg bits extend the partid.
> (i.e. partid-5 has a pmg-0 that is not the same as partid-6's pmg-0). In
> this case, mismatching the values will 'dirty' a pmg value that resctrl
> believes is clean, and is not tracking with its 'limbo' code.
>
> To avoid this, the partid and pmg are always read and written as a pair.
> Instead of making struct task_struct's closid and rmid fields an
> endian-unsafe union, add the value to struct thread_info and always use
> READ_ONCE()/WRITE_ONCE() when accessing this field.
I'm still hammering on this one ;)
The comment below is better way of putting that it would basically leave
some fields that look like they can be used which can't. Given they
are under ifdef CONFIG_X86_CPU_RESCTRL anyway it would be very odd
to use a union. Would just be a new appropriately ifdef protected variable
right next to them in the file. I'd be tempted to just drop the bit
about union and say why it makes sense to instead put it in
struct thread_info (basically because it's arch specific and we can
avoid even more ifdef mess?)
>
> Resctrl allows a per-cpu 'default' value to be set, this overrides the
> values when scheduling a task in the default control-group, which has
> PARTID 0. The way 'code data prioritisation' gets emulated means the
> register value for the default group needs to be a variable.
>
> The current system register value is kept in a per-cpu variable to avoid
> writing to the system register if the value isn't going to change. Writes
> to this register may reset the hardware state for regulating bandwidth.
>
> Finally, there is no reason to context switch these registers unless there
> is a driver changing the values in struct task_struct. Hide the whole thing
> behind a static key. This also allows the driver to disable MPAM in
> response to errors reported by hardware. Move the existing static key to
> belong to the arch code, as in the future the MPAM driver may become a
> loadable module.
>
> All this should depend on whether there is an MPAM driver, hide it behind
> CONFIG_ARM64_MPAM.
>
> CC: Amit Singh Tomar <amitsinght@marvell.com>
> Signed-off-by: James Morse <james.morse@arm.com>
> Signed-off-by: Ben Horgan <ben.horgan@arm.com>
> ---
> CONFIG_MPAM -> CONFIG_ARM64_MPAM in commit message
> Remove extra DECLARE_STATIC_KEY_FALSE
> Function name in comment, __mpam_sched_in() -> mpam_thread_switch()
> Remove unused headers
> Expand comment (Jonathan)
> ---
> arch/arm64/Kconfig | 2 +
> arch/arm64/include/asm/mpam.h | 73 ++++++++++++++++++++++++++++
> arch/arm64/include/asm/thread_info.h | 3 ++
> arch/arm64/kernel/Makefile | 1 +
> arch/arm64/kernel/mpam.c | 13 +++++
> arch/arm64/kernel/process.c | 7 +++
> drivers/resctrl/mpam_devices.c | 2 -
> drivers/resctrl/mpam_internal.h | 4 +-
> 8 files changed, 101 insertions(+), 4 deletions(-)
> create mode 100644 arch/arm64/include/asm/mpam.h
> create mode 100644 arch/arm64/kernel/mpam.c
>
> diff --git a/arch/arm64/include/asm/mpam.h b/arch/arm64/include/asm/mpam.h
> new file mode 100644
> index 000000000000..2ab3dca6977c
> --- /dev/null
> +++ b/arch/arm64/include/asm/mpam.h
> +/*
> + * The resctrl filesystem writes to the partid/pmg values for threads and CPUs,
> + * which may race with reads in mpam_thread_switch(). Ensure only one of the old
> + * or new values are used. Particular care should be taken with the pmg field as
> + * mpam_thread_switch() may read a partid and pmg that don't match, causing this
> + * value to be stored with cache allocations, despite being considered 'free' by
> + * resctrl.
> + *
> + * A value in struct thread_info is used instead of struct task_struct as the
> + * cpu's u64 register format is used. In struct task_struct there are two u32,
> + * rmid and closid for the x86 case, but as we can't use them here do something
> + * else. Creating a union would mean only accesses from the created u64 would be
> + * endian safe and so be less clear.
I'd just put this as something:
* The closid and rmid in task_struct can't be directly reused as a u64 is needed.
* As such, a suitable variable in struct thread_info is used instead with the
* benefit of that being clearly an architecture specific location.
or be more cynical and keep it for the patch description only. To me location
of this u64 doesn't really feel like a design decision we need to record for the ages.
With something like the suggested text, or the paragraph just dropped
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
> + */
> +static inline u64 mpam_get_regval(struct task_struct *tsk)
> +{
> +#ifdef CONFIG_ARM64_MPAM
> + return READ_ONCE(task_thread_info(tsk)->mpam_partid_pmg);
> +#else
> + return 0;
> +#endif
> +}
next prev parent reply other threads:[~2026-01-05 17:05 UTC|newest]
Thread overview: 120+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-19 18:11 [PATCH v2 00/45] arm_mpam: Add KVM/arm64 and resctrl glue code Ben Horgan
2025-12-19 18:11 ` [PATCH v2 01/45] arm_mpam: Stop using uninitialized variables in __ris_msmon_read() Ben Horgan
2025-12-23 11:58 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 02/45] arm_mpam: Remove duplicate linux/srcu.h header Ben Horgan
2025-12-23 12:10 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 03/45] arm_mpam: Use non-atomic bitops when modifying feature bitmap Ben Horgan
2026-01-05 16:34 ` Jonathan Cameron
2026-01-06 11:11 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 04/45] arm64/sysreg: Add MPAMSM_EL1 register Ben Horgan
2026-01-05 16:36 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 05/45] KVM: arm64: Preserve host MPAM configuration when changing traps Ben Horgan
2025-12-19 20:01 ` Oliver Upton
2026-01-02 11:43 ` Ben Horgan
2026-01-05 16:43 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 06/45] KVM: arm64: Make MPAMSM_EL1 accesses UNDEF Ben Horgan
2026-01-05 16:47 ` Jonathan Cameron
2026-01-05 16:57 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 07/45] arm64: mpam: Context switch the MPAM registers Ben Horgan
2026-01-05 17:04 ` Jonathan Cameron [this message]
2026-01-06 11:14 ` Ben Horgan
2026-01-06 14:03 ` Jonathan Cameron
2026-01-08 10:06 ` Shaopeng Tan (Fujitsu)
2026-01-09 9:28 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 08/45] arm64: mpam: Re-initialise MPAM regs when CPU comes online Ben Horgan
2026-01-05 17:06 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 09/45] arm64: mpam: Advertise the CPUs MPAM limits to the driver Ben Horgan
2026-01-05 17:08 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 10/45] arm64: mpam: Add cpu_pm notifier to restore MPAM sysregs Ben Horgan
2026-01-05 17:09 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 11/45] arm64: mpam: Initialise and context switch the MPAMSM_EL1 register Ben Horgan
2026-01-05 17:20 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 12/45] arm64: mpam: Add helpers to change a task or cpu's MPAM PARTID/PMG values Ben Horgan
2026-01-05 17:21 ` Jonathan Cameron
2026-01-08 10:18 ` Shaopeng Tan (Fujitsu)
2026-01-09 9:37 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 13/45] KVM: arm64: Force guest EL1 to use user-space's partid configuration Ben Horgan
2025-12-19 20:10 ` Oliver Upton
2026-01-02 11:48 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 14/45] KVM: arm64: Use kernel-space partid configuration for hypercalls Ben Horgan
2025-12-19 18:11 ` [PATCH v2 15/45] arm_mpam: resctrl: Add boilerplate cpuhp and domain allocation Ben Horgan
2026-01-05 17:40 ` Jonathan Cameron
2026-01-06 11:17 ` Ben Horgan
2026-01-08 10:36 ` Shaopeng Tan (Fujitsu)
2026-01-09 9:55 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 16/45] arm_mpam: resctrl: Sort the order of the domain lists Ben Horgan
2026-01-05 17:42 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 17/45] arm_mpam: resctrl: Pick the caches we will use as resctrl resources Ben Horgan
2026-01-05 17:46 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 18/45] arm_mpam: resctrl: Implement resctrl_arch_reset_all_ctrls() Ben Horgan
2026-01-05 17:51 ` Jonathan Cameron
2026-01-06 11:19 ` Ben Horgan
2026-01-09 3:45 ` Zeng Heng
2026-01-13 17:18 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 19/45] arm_mpam: resctrl: Add resctrl_arch_get_config() Ben Horgan
2026-01-05 17:53 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 20/45] arm_mpam: resctrl: Implement helpers to update configuration Ben Horgan
2026-01-05 17:58 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 21/45] arm_mpam: resctrl: Add plumbing against arm64 task and cpu hooks Ben Horgan
2026-01-05 18:02 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 22/45] arm_mpam: resctrl: Add CDP emulation Ben Horgan
2026-01-05 18:07 ` Jonathan Cameron
2026-01-06 11:21 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 23/45] arm_mpam: resctrl: Add rmid index helpers Ben Horgan
2026-01-06 11:21 ` Jonathan Cameron
2026-01-06 11:33 ` Ben Horgan
2026-01-06 14:04 ` Jonathan Cameron
2026-01-06 15:23 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 24/45] arm_mpam: resctrl: Convert to/from MPAMs fixed-point formats Ben Horgan
2026-01-06 11:55 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 25/45] arm_mpam: resctrl: Add support for 'MB' resource Ben Horgan
2025-12-27 8:10 ` [PATCH v2 0/45] arm_mpam: Add KVM/arm64 and resctrl glue code Zeng Heng
2026-01-06 12:19 ` [PATCH v2 25/45] arm_mpam: resctrl: Add support for 'MB' resource Jonathan Cameron
2026-01-07 14:21 ` Ben Horgan
2026-01-08 10:42 ` Shaopeng Tan (Fujitsu)
2026-01-12 16:45 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 26/45] arm_mpam: resctrl: Add kunit test for control format conversions Ben Horgan
2026-01-06 12:30 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 27/45] arm_mpam: resctrl: Add support for csu counters Ben Horgan
2026-01-06 12:40 ` Jonathan Cameron
2026-01-08 10:44 ` Shaopeng Tan (Fujitsu)
2026-01-08 10:52 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 28/45] arm_mpam: resctrl: Pick classes for use as mbm counters Ben Horgan
2026-01-06 14:01 ` Jonathan Cameron
2026-01-07 15:19 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 29/45] arm_mpam: resctrl: Pre-allocate free running monitors Ben Horgan
2026-01-06 14:22 ` Jonathan Cameron
2026-01-08 14:25 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 30/45] arm_mpam: resctrl: Pre-allocate assignable monitors Ben Horgan
2026-01-06 14:29 ` Jonathan Cameron
2026-01-08 14:33 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 31/45] arm_mpam: resctrl: Add kunit test for ABMC/CDP interactions Ben Horgan
2025-12-19 18:11 ` [PATCH v2 32/45] arm_mpam: resctrl: Add resctrl_arch_config_cntr() for ABMC use Ben Horgan
2026-01-06 14:33 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 33/45] arm_mpam: resctrl: Allow resctrl to allocate monitors Ben Horgan
2026-01-06 14:37 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 34/45] arm_mpam: resctrl: Add resctrl_arch_rmid_read() and resctrl_arch_reset_rmid() Ben Horgan
2026-01-06 14:43 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 35/45] arm_mpam: resctrl: Add resctrl_arch_cntr_read() & resctrl_arch_reset_cntr() Ben Horgan
2026-01-06 14:44 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 36/45] arm_mpam: resctrl: Update the rmid reallocation limit Ben Horgan
2026-01-06 14:46 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 37/45] arm_mpam: resctrl: Add empty definitions for assorted resctrl functions Ben Horgan
2026-01-06 14:48 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 38/45] arm64: mpam: Select ARCH_HAS_CPU_RESCTRL Ben Horgan
2026-01-06 14:49 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 39/45] arm_mpam: resctrl: Call resctrl_init() on platforms that can support resctrl Ben Horgan
2026-01-06 14:58 ` Jonathan Cameron
2026-01-08 14:53 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 40/45] arm_mpam: Generate a configuration for min controls Ben Horgan
2026-01-06 15:09 ` Jonathan Cameron
2026-01-08 15:35 ` Ben Horgan
2025-12-19 18:11 ` [PATCH v2 41/45] arm_mpam: Add quirk framework Ben Horgan
2026-01-06 15:14 ` Jonathan Cameron
2026-01-06 15:15 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 42/45] arm_mpam: Add workaround for T241-MPAM-1 Ben Horgan
2025-12-19 18:11 ` [PATCH v2 43/45] arm_mpam: Add workaround for T241-MPAM-4 Ben Horgan
2026-01-06 15:20 ` Jonathan Cameron
2025-12-19 18:11 ` [PATCH v2 44/45] arm_mpam: Add workaround for T241-MPAM-6 Ben Horgan
2025-12-19 18:11 ` [PATCH v2 45/45] arm_mpam: Quirk CMN-650's CSU NRDY behaviour Ben Horgan
2026-01-08 19:22 ` (subset) [PATCH v2 00/45] arm_mpam: Add KVM/arm64 and resctrl glue code Catalin Marinas
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=20260105170451.00005669@huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=amitsinght@marvell.com \
--cc=baisheng.gao@unisoc.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=ben.horgan@arm.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=kobak@nvidia.com \
--cc=kvmarm@lists.linux.dev \
--cc=lcherian@marvell.com \
--cc=linux-arm-kernel@lists.infradead.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=will@kernel.org \
--cc=xhao@linux.alibaba.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