Re: [RFC PATCH 13/38] arm_mpam: resctrl: Add CDP emulation

Ben Horgan
2025-12-16T13:49:22Z

Hi James,

On 12/5/25 21:58, James Morse wrote:
> Intel RDT's CDP feature allows the cache to use a different control value
> depending on whether the accesses was for instruction fetch or a data
> access. MPAM's equivalent feature is the other way up: the CPU assigns a
> different partid label to traffic depending on whether it was instruction
> fetch or a data access, which causes the cache to use a different control
> value based solely on the partid.
>
> MPAM can emulate CDP, with the side effect that the alternative partid is
> seen by all MSC, it can't be enabled per-MSC.
>
> Add the resctrl hooks to turn this on or off. Add the helpers that
> match a closid against a task, which need to be aware that the value
> written to hardware is not the same as the one resctrl is using.
>
> Update the 'arm64_mpam_global_default' variable the arch code uses
> during context switch to know when the per-cpu value should be used
> instead.
>
> Awkwardly, the MB controls don't implement CDP. To emulate this, the
> MPAM equivalent needs programming twice by the resctrl glue, as
> resctrl expects the bandwidth controls to be applied independently for
> both data and isntruction-fetch.
>
> CC: Dave Martin <Dave.Martin@arm.com>
> CC: Ben Horgan <ben.horgan@arm.com>
> CC: Amit Singh Tomar <amitsinght@marvell.com>
> Signed-off-by: James Morse <james.morse@arm.com>
> ---
> arch/arm64/include/asm/mpam.h | 1 +
> drivers/resctrl/mpam_resctrl.c | 115 ++++++++++++++++++++++++++++++++-
> include/linux/arm_mpam.h | 3 +
> 3 files changed, 118 insertions(+), 1 deletion(-)
>
[...]
>
> @@ -272,6 +369,7 @@ u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_ctrl_domain *d,
> int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_ctrl_domain *d,
> u32 closid, enum resctrl_conf_type t, u32 cfg_val)
> {
> + int err;
> u32 partid;
> struct mpam_config cfg;
> struct mpam_props *cprops;
> @@ -311,7 +409,22 @@ int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_ctrl_domain *d,
> return -EINVAL;
> }
>
> - return mpam_apply_config(dom->ctrl_comp, partid, &cfg);
> + /*
> + * When CDP is enabled, but the resource doesn't support it, we need to
> + * apply the same configuration to the other partid.
> + */
> + if (mpam_resctrl_hide_cdp(r->rid)) {
> + partid = resctrl_get_config_index(closid, CDP_CODE);
> + err = mpam_apply_config(dom->ctrl_comp, partid, &cfg);
> + if (err)
> + return err;
> +
> + partid = resctrl_get_config_index(closid, CDP_DATA);
> + return mpam_apply_config(dom->ctrl_comp, partid, &cfg);

This is indeed awkward. As we are programming twice, if instruction and
data use b/w equally then the MB setting will be as if it was double.
However, if we halved the configured value, and most of the bandwidth
was for data, then it would be as if it was halved. For controls where
the actual parts are chosen, rather than just the size then this
programming twice will work as expected. Therefore, I think your chosen
policy is the least surprising and I'll keep this as is.

> +
> + } else {
> + return mpam_apply_config(dom->ctrl_comp, partid, &cfg);
> + }
> }
[...]

Thanks,

Ben