[PATCH 2/5] x86,fs/resctrl: Remove "arch_needs_linear"
From: Reinette Chatre
Date: Thu Sep 03 2026 - 13:30:58 EST
arch_needs_linear is used to reject any configuration attempt on
a non-linear Intel MBA resource yet there are no Intel SKUs that support
non-linear delay. If such non-existent non-linear Intel MBA resource is
encountered during enumeration then it will not be marked as alloc_capable
anyway and thus resctrl will never attempt configuration because of it not
being capable of allocation, not because of the arch_needs_linear value.
On Intel the MBA resource will thus always have:
delay_linear == true and arch_needs_linear == true
On AMD the MBA resource will always have:
delay_linear == false and arch_needs_linear == false
MPAM does not set arch_needs_linear.
rdt_get_mb_table() is only called during enumeration and since it always
returns false an Intel MBA resource without MBA_IS_LINEAR is not supported.
Drop the unnecessary venture to rdt_get_mb_table() to make it clear that
an Intel MBA resource without MBA_IS_LINEAR is not considered capable of
allocation. Drop the dead code that sets arch_needs_linear to false on Intel.
Since "if (!delay_linear && arch_needs_linear)" can never be true, drop
arch_needs_linear and its only usage during bandwidth validation.
Signed-off-by: Reinette Chatre <reinette.chatre@xxxxxxxxx>
---
Changes since RFC v1:
- Fix typo in changelog
Changes since RFC v2:
- Rework changelog.
- Group all r->membw assignments together.
---
arch/x86/kernel/cpu/resctrl/core.c | 39 ++++++------------------------
fs/resctrl/ctrlmondata.c | 8 ------
include/linux/resctrl.h | 2 --
3 files changed, 7 insertions(+), 42 deletions(-)
diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c
index 65cfde0d6a9b..0e34a1c541b9 100644
--- a/arch/x86/kernel/cpu/resctrl/core.c
+++ b/arch/x86/kernel/cpu/resctrl/core.c
@@ -181,27 +181,6 @@ static inline void cache_alloc_hsw_probe(void)
rdt_alloc_capable = true;
}
-/*
- * rdt_get_mb_table() - get a mapping of bandwidth(b/w) percentage values
- * exposed to user interface and the h/w understandable delay values.
- *
- * The non-linear delay values have the granularity of power of two
- * and also the h/w does not guarantee a curve for configured delay
- * values vs. actual b/w enforced.
- * Hence we need a mapping that is pre calibrated so the user can
- * express the memory b/w as a percentage value.
- */
-static inline bool rdt_get_mb_table(struct rdt_resource *r)
-{
- /*
- * There are no Intel SKUs as of now to support non-linear delay.
- */
- pr_info("MBA b/w map not implemented for cpu:%d, model:%d",
- boot_cpu_data.x86, boot_cpu_data.x86_model);
-
- return false;
-}
-
static __init bool __get_mem_config_intel(struct rdt_resource *r)
{
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
@@ -213,16 +192,13 @@ static __init bool __get_mem_config_intel(struct rdt_resource *r)
hw_res->num_closid = edx.split.cos_max + 1;
max_delay = eax.split.max_delay + 1;
r->membw.max_bw = MAX_MBA_BW;
- r->membw.arch_needs_linear = true;
- if (ecx & MBA_IS_LINEAR) {
- r->membw.delay_linear = true;
- r->membw.min_bw = MAX_MBA_BW - max_delay;
- r->membw.bw_gran = MAX_MBA_BW - max_delay;
- } else {
- if (!rdt_get_mb_table(r))
- return false;
- r->membw.arch_needs_linear = false;
- }
+
+ if (!(ecx & MBA_IS_LINEAR))
+ return false;
+
+ r->membw.delay_linear = true;
+ r->membw.min_bw = MAX_MBA_BW - max_delay;
+ r->membw.bw_gran = MAX_MBA_BW - max_delay;
if (boot_cpu_has(X86_FEATURE_PER_THREAD_MBA))
r->membw.throttle_mode = THREAD_THROTTLE_PER_THREAD;
@@ -255,7 +231,6 @@ static __init bool __rdt_get_mem_config_amd(struct rdt_resource *r)
/* AMD does not use delay */
r->membw.delay_linear = false;
- r->membw.arch_needs_linear = false;
/*
* AMD does not use memory delay throttle model to control
diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c
index cafebdff70dc..4562072b8ba6 100644
--- a/fs/resctrl/ctrlmondata.c
+++ b/fs/resctrl/ctrlmondata.c
@@ -45,14 +45,6 @@ static bool bw_validate(char *buf, u32 *data, struct rdt_resource *r)
int ret;
u32 bw;
- /*
- * Only linear delay values is supported for current Intel SKUs.
- */
- if (!r->membw.delay_linear && r->membw.arch_needs_linear) {
- rdt_last_cmd_puts("No support for non-linear MB domains\n");
- return false;
- }
-
ret = kstrtou32(buf, 10, &bw);
if (ret) {
rdt_last_cmd_printf("Invalid MB value %s\n", buf);
diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
index b63dc62690ca..66dc9813c888 100644
--- a/include/linux/resctrl.h
+++ b/include/linux/resctrl.h
@@ -249,7 +249,6 @@ enum membw_throttle_mode {
* @max_bw: Maximum memory bandwidth value, used as the reset value
* @bw_gran: Granularity at which the memory bandwidth is allocated
* @delay_linear: True if memory B/W delay is in linear scale
- * @arch_needs_linear: True if we can't configure non-linear resources
* @throttle_mode: Bandwidth throttling mode when threads request
* different memory bandwidths
* @mba_sc: True if MBA software controller(mba_sc) is enabled
@@ -259,7 +258,6 @@ struct resctrl_membw {
u32 max_bw;
u32 bw_gran;
u32 delay_linear;
- bool arch_needs_linear;
enum membw_throttle_mode throttle_mode;
bool mba_sc;
};
--
2.55.0