* [PATCH MPAM 6.16.rc1] arm_mpam: Enforce to recalculate mbw_min on configuration @ 2025-06-26 9:52 Gavin Shan 2025-07-14 10:15 ` James Morse 0 siblings, 1 reply; 3+ messages in thread From: Gavin Shan @ 2025-06-26 9:52 UTC (permalink / raw) To: linux-kernel Cc: james.morse, sdonthineni, rohit.mathew, carl, gshan, shan.gavin mpam_feat_mbw_max is exposed to user by resctrlfs, but mpam_feat_mbw_min should be recalculated based on the maximal memory bandwidth in every configuration, which has been missed unfortunately. When a new group is created, the default and maximal memory bandwidth percentage (100%) is configured, the configuration instance (struct mpam_config) on the stack is updated, including the minimal and maximal memory bandwidth. It's copied to the domain's configuration instance. On next time when user tries to configure by writing 'schemata', the minimal memory bandwidth isn't never recalculated because mpam_feat_mbw_min has been seen in the configuration, which inherits from the domain's instance. For example, the value of register MPAMCFG_MBW_MIN is never changed no matter what configuration is set. # uname -r 6.16.0-rc1-gavin # mount -tresctrl none /sys/fs/resctrl # mkdir -p /sys/fs/resctrl/test # cd /sys/fs/resctrl/test # echo "MB:1=2" > schemata MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 000005ff MPAMCFG_MBW_MIN 0000f000 # echo "MB:1=100" > schemata MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 0000ffff MPAMCFG_MBW_MIN 0000f000 Fix the issue by enforcing the calculation of the minimal memory bandwidth in very configuration. With this applied, The register MPAMCFG_MBW_MIN is updated with the expected value in every configuration. # cd /sys/fs/resctrl/test # echo "MB:1=2" > schemata MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 000005ff MPAMCFG_MBW_MIN 00000200 # echo "MB:1=100" > schemata MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 0000ffff MPAMCFG_MBW_MIN 0000f000 Fixes: 75f4101bb338 ("arm_mpam: Generate a configuration for min controls") Signed-off-by: Gavin Shan <gshan@redhat.com> --- Appliable to James Morse's latest MPAM branch https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git (branch: mpam/snapshot/v6.16-rc1) --- drivers/platform/arm64/mpam/mpam_devices.c | 27 ++++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/drivers/platform/arm64/mpam/mpam_devices.c b/drivers/platform/arm64/mpam/mpam_devices.c index df8730491de2..4845dcb8e601 100644 --- a/drivers/platform/arm64/mpam/mpam_devices.c +++ b/drivers/platform/arm64/mpam/mpam_devices.c @@ -3192,6 +3192,9 @@ static void mpam_extend_config(struct mpam_class *class, struct mpam_config *cfg u16 min, min_hw_granule, delta; u16 max_hw_value, res0_bits; + if (!mpam_has_feature(mpam_feat_mbw_max, cfg)) + return; + /* * Calculate the values the 'min' control can hold. * e.g. on a platform with bwa_wd = 8, min_hw_granule is 0x00ff because @@ -3211,23 +3214,17 @@ static void mpam_extend_config(struct mpam_class *class, struct mpam_config *cfg * * Resctrl can only configure the MAX. */ - if (mpam_has_feature(mpam_feat_mbw_max, cfg) && - !mpam_has_feature(mpam_feat_mbw_min, cfg)) { - delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; - if (cfg->mbw_max > delta) - min = cfg->mbw_max - delta; - else - min = 0; + delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; + if (cfg->mbw_max > delta) + min = cfg->mbw_max - delta; + else + min = 0; - cfg->mbw_min = max(min, min_hw_granule); - mpam_set_feature(mpam_feat_mbw_min, cfg); - } + cfg->mbw_min = max(min, min_hw_granule); + mpam_set_feature(mpam_feat_mbw_min, cfg); + if (mpam_has_quirk(T241_FORCE_MBW_MIN_TO_ONE, class)) + cfg->mbw_min = max(cfg->mbw_min, min_hw_granule + 1); - if (mpam_has_quirk(T241_FORCE_MBW_MIN_TO_ONE, class) && - cfg->mbw_min <= min_hw_granule) { - cfg->mbw_min = min_hw_granule + 1; - mpam_set_feature(mpam_feat_mbw_min, cfg); - } } /* TODO: split into write_config/sync_config */ -- 2.49.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH MPAM 6.16.rc1] arm_mpam: Enforce to recalculate mbw_min on configuration 2025-06-26 9:52 [PATCH MPAM 6.16.rc1] arm_mpam: Enforce to recalculate mbw_min on configuration Gavin Shan @ 2025-07-14 10:15 ` James Morse 2025-07-21 4:59 ` Gavin Shan 0 siblings, 1 reply; 3+ messages in thread From: James Morse @ 2025-07-14 10:15 UTC (permalink / raw) To: Gavin Shan, linux-kernel; +Cc: sdonthineni, rohit.mathew, carl, shan.gavin Hi Gavin, On 26/06/2025 10:52, Gavin Shan wrote: > mpam_feat_mbw_max is exposed to user by resctrlfs, but mpam_feat_mbw_min > should be recalculated based on the maximal memory bandwidth in every > configuration, which has been missed unfortunately. When a new group is > created, the default and maximal memory bandwidth percentage (100%) is > configured, the configuration instance (struct mpam_config) on the stack > is updated, including the minimal and maximal memory bandwidth. It's > copied to the domain's configuration instance. On next time when user > tries to configure by writing 'schemata', the minimal memory bandwidth > isn't never recalculated because mpam_feat_mbw_min has been seen in the > configuration, which inherits from the domain's instance. > > For example, the value of register MPAMCFG_MBW_MIN is never changed no > matter what configuration is set. Thanks for catching this. I think this was introduced by the patch that picked the component copy of the configuration, modified it - and passed it back into the driver. That had the additional side effect of changes going missing as the mpam_update_config() had the same config twice... I fixed that shortly after rc1, with that fixed I don't think this can happen - resctrl never sets the 'min', meaning mpam_extent_config() will always regenerate the value. This shouldn't happen with the latest version of the tree. https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git/log/?h=mpam/snapshot/v6.16-rc4 > diff --git a/drivers/platform/arm64/mpam/mpam_devices.c b/drivers/platform/arm64/mpam/mpam_devices.c > index df8730491de2..4845dcb8e601 100644 > --- a/drivers/platform/arm64/mpam/mpam_devices.c > +++ b/drivers/platform/arm64/mpam/mpam_devices.c > @@ -3192,6 +3192,9 @@ static void mpam_extend_config(struct mpam_class *class, struct mpam_config *cfg > u16 min, min_hw_granule, delta; > u16 max_hw_value, res0_bits; > > + if (!mpam_has_feature(mpam_feat_mbw_max, cfg)) > + return; N.B. - The T421 quirk needs to ensure the minimum value is never set to 0 - which is what mpam_reprogram_ris_partid() will do if there is no minimum config set. The aim of the quirk is that on affected platforms the mbm_min will always be set, and never be zero in any configuration. Whether it then gets applied to the hardware depends on whether the hardware has the feature. This makes it simpler to think about - and easier to test on platforms that aren't affected by the errata. I'd prefer not to to try and spot configurations where its going to matter as it will be hard to debug the workaround going wrong! > @@ -3211,23 +3214,17 @@ static void mpam_extend_config(struct mpam_class *class, struct mpam_config *cfg > * > * Resctrl can only configure the MAX. > */ > - if (mpam_has_feature(mpam_feat_mbw_max, cfg) && > - !mpam_has_feature(mpam_feat_mbw_min, cfg)) { > - delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; > - if (cfg->mbw_max > delta) > - min = cfg->mbw_max - delta; > - else > - min = 0; > + delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; > + if (cfg->mbw_max > delta) > + min = cfg->mbw_max - delta; > + else > + min = 0; > > - cfg->mbw_min = max(min, min_hw_granule); > - mpam_set_feature(mpam_feat_mbw_min, cfg); > - } > + cfg->mbw_min = max(min, min_hw_granule); While resctrl doesn't use it - the idea is the mpam_devices interface should support any mpam control being set. This overwrites what the user asked for. The devices/resctrl split might look strange - but its so the resctrl ABI implications are contained to one file, and another user of the mpam_devices interface can be added later. (KVM in-kernel MSC emulation was one proposal, another came from people who believe they need to change the hardware policy more frequently than they can with a syscall ... I don't like either of these!) Thanks, James ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH MPAM 6.16.rc1] arm_mpam: Enforce to recalculate mbw_min on configuration 2025-07-14 10:15 ` James Morse @ 2025-07-21 4:59 ` Gavin Shan 0 siblings, 0 replies; 3+ messages in thread From: Gavin Shan @ 2025-07-21 4:59 UTC (permalink / raw) To: James Morse, linux-kernel Cc: sdonthineni, rohit.mathew, carl, shan.gavin, Koba Ko Hi James, On 7/14/25 8:15 PM, James Morse wrote: > On 26/06/2025 10:52, Gavin Shan wrote: >> mpam_feat_mbw_max is exposed to user by resctrlfs, but mpam_feat_mbw_min >> should be recalculated based on the maximal memory bandwidth in every >> configuration, which has been missed unfortunately. When a new group is >> created, the default and maximal memory bandwidth percentage (100%) is >> configured, the configuration instance (struct mpam_config) on the stack >> is updated, including the minimal and maximal memory bandwidth. It's >> copied to the domain's configuration instance. On next time when user >> tries to configure by writing 'schemata', the minimal memory bandwidth >> isn't never recalculated because mpam_feat_mbw_min has been seen in the >> configuration, which inherits from the domain's instance. >> >> For example, the value of register MPAMCFG_MBW_MIN is never changed no >> matter what configuration is set. > > Thanks for catching this. I think this was introduced by the patch that picked > the component copy of the configuration, modified it - and passed it back into > the driver. That had the additional side effect of changes going missing as the > mpam_update_config() had the same config twice... > > I fixed that shortly after rc1, with that fixed I don't think this can happen - > resctrl never sets the 'min', meaning mpam_extent_config() will always regenerate > the value. > > This shouldn't happen with the latest version of the tree. > https://git.kernel.org/pub/scm/linux/kernel/git/morse/linux.git/log/?h=mpam/snapshot/v6.16-rc4 > The issue still exists in v6.16-rc4 and v6.16-rc5. Here are the dumped registers on the varied MBW configurations, and MPAMCFG_MBW_MIN doesn't alter. # uname -r 6.16.0-rc5-gavin # mount -tresctrl none /sys/fs/resctrl # mkdir -p /sys/fs/resctrl/all # mkdir -p /sys/fs/resctrl/test # cd /sys/fs/resctrl/test # echo "MB:1=100" > schemata # cat /proc/dump MPAMCFG_PART_SEL 00000002 MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 0000ffff MPAMCFG_MBW_MIN 0000f000 # echo "MB:1=2" > schemata # cat /proc/dump MPAMCFG_PART_SEL 00000002 MAPMF_MBW_IDR 00000c07 MPAMCFG_MBW_MAX 000005ff MPAMCFG_MBW_MIN 0000f000 The problem is mpam_feat_mbw_min is always set in 'struct mpam_config'. With this, cfg->mbw_min won't be recalculated. I guess we probably just need to simply drop the check to that cfg->mbw_min can be recalculated every time? Could you please fix it up in place if the resolution looks good to you, I also can post (v2) to include the changes if you prefer. I don't know how it can be handled since the code isn't merged to upstream yet. static void mpam_extend_config(struct mpam_class *class, struct mpam_config *cfg) { : /* The mpam_feat_mbw_min needs to be dropped */ if (mpam_has_feature(mpam_feat_mbw_max, cfg) && !mpam_has_feature(mpam_feat_mbw_min, cfg)) { delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; if (cfg->mbw_max > delta) min = cfg->mbw_max - delta; else min = 0; cfg->mbw_min = max(min, min_hw_granule); mpam_set_feature(mpam_feat_mbw_min, cfg); } if (mpam_has_quirk(T241_FORCE_MBW_MIN_TO_ONE, class) && cfg->mbw_min <= min_hw_granule) { cfg->mbw_min = min_hw_granule + 1; mpam_set_feature(mpam_feat_mbw_min, cfg); } } > >> diff --git a/drivers/platform/arm64/mpam/mpam_devices.c > b/drivers/platform/arm64/mpam/mpam_devices.c >> index df8730491de2..4845dcb8e601 100644 >> --- a/drivers/platform/arm64/mpam/mpam_devices.c >> +++ b/drivers/platform/arm64/mpam/mpam_devices.c >> @@ -3192,6 +3192,9 @@ static void mpam_extend_config(struct mpam_class *class, struct > mpam_config *cfg >> u16 min, min_hw_granule, delta; >> u16 max_hw_value, res0_bits; >> >> + if (!mpam_has_feature(mpam_feat_mbw_max, cfg)) >> + return; > > N.B. - The T421 quirk needs to ensure the minimum value is never set to 0 - which is what > mpam_reprogram_ris_partid() will do if there is no minimum config set. > > The aim of the quirk is that on affected platforms the mbm_min will always be set, and > never be zero in any configuration. Whether it then gets applied to the hardware depends > on whether the hardware has the feature. > This makes it simpler to think about - and easier to test on platforms that aren't > affected by the errata. > > I'd prefer not to to try and spot configurations where its going to matter as it will be > hard to debug the workaround going wrong! > Ok, thanks for the explanation. In that case, we shouldn't bail early. The mpam_feat_mbw_min check in mpam_extend_config() needs to be dropped, as explained above. > >> @@ -3211,23 +3214,17 @@ static void mpam_extend_config(struct mpam_class *class, struct > mpam_config *cfg >> * >> * Resctrl can only configure the MAX. >> */ >> - if (mpam_has_feature(mpam_feat_mbw_max, cfg) && >> - !mpam_has_feature(mpam_feat_mbw_min, cfg)) { >> - delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; >> - if (cfg->mbw_max > delta) >> - min = cfg->mbw_max - delta; >> - else >> - min = 0; >> + delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; >> + if (cfg->mbw_max > delta) >> + min = cfg->mbw_max - delta; >> + else >> + min = 0; >> >> - cfg->mbw_min = max(min, min_hw_granule); >> - mpam_set_feature(mpam_feat_mbw_min, cfg); >> - } >> + cfg->mbw_min = max(min, min_hw_granule); > > While resctrl doesn't use it - the idea is the mpam_devices interface should support any > mpam control being set. This overwrites what the user asked for. > > The devices/resctrl split might look strange - but its so the resctrl ABI implications are > contained to one file, and another user of the mpam_devices interface can be added later. > (KVM in-kernel MSC emulation was one proposal, another came from people who believe they > need to change the hardware policy more frequently than they can with a syscall ... I > don't like either of these!) > hmm, it's intresting to know we can't tolerate the time consumed to finish a syscall. The MPAM would have static configurations, meaning it's static after the configuration is given. Could you share who is looking into MPAM virtualization? Actually, David and I also looked into MPAM virtualization support, but we had everything emulated in QEMU in the draft design. Thanks, Gavin > > Thanks, > > James > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-07-21 4:59 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-26 9:52 [PATCH MPAM 6.16.rc1] arm_mpam: Enforce to recalculate mbw_min on configuration Gavin Shan 2025-07-14 10:15 ` James Morse 2025-07-21 4:59 ` Gavin Shan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).