From 8709725ad4996325f6cb22cdb18cd2c456dc4196 Mon Sep 17 00:00:00 2001 From: Zeng Heng Date: Thu, 22 May 2025 20:23:58 +0800 Subject: [PATCH 1/5] fs/resctrl: Fix the crash caused by mounting resctrl but not support RDT hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8T2RT -------------------------------- Fix the crash caused by mounting the resctrl filesystem on a platform that does not support any RDT resources. WARNING: CPU: 0 PID: 13291 at mm/page_alloc.c:4780 __alloc_pages Call Trace: __kmalloc_large_node+0x8f/0x190 __kmalloc+0xb8/0x120 closid_init+0x4a/0x90 rdt_get_tree+0x109/0x400 vfs_get_tree+0x25/0xe0 do_new_mount+0x164/0x1c0 __se_sys_mount+0x165/0x1d0 do_syscall_64+0x56/0x100 Fixes: 1e7284b7981c ("fs/resctrl: Remove the limit on the number of CLOSID") Signed-off-by: Zeng Heng --- fs/resctrl/rdtgroup.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c index 70fdbaa12ba8..b1f127432b42 100644 --- a/fs/resctrl/rdtgroup.c +++ b/fs/resctrl/rdtgroup.c @@ -148,7 +148,7 @@ int closids_supported(void) return closid_free_map_len; } -static void closid_init(void) +static int closid_init(void) { struct resctrl_schema *s; u32 rdt_min_closid = ~0; @@ -157,12 +157,20 @@ static void closid_init(void) list_for_each_entry(s, &resctrl_schema_all, list) rdt_min_closid = min(rdt_min_closid, s->num_closid); + if (rdt_min_closid == ~0) + return -EOPNOTSUPP; + closid_free_map = bitmap_alloc(rdt_min_closid, GFP_KERNEL); + if (!closid_free_map) + return -ENOMEM; + bitmap_fill(closid_free_map, rdt_min_closid); /* RESCTRL_RESERVED_CLOSID is always reserved for the default group */ __clear_bit(RESCTRL_RESERVED_CLOSID, closid_free_map); closid_free_map_len = rdt_min_closid; + + return 0; } static void closid_exit(void) @@ -2685,7 +2693,9 @@ static int rdt_get_tree(struct fs_context *fc) if (ret) goto out_schemata_free; - closid_init(); + ret = closid_init(); + if (ret) + goto out_schemata_free; if (resctrl_arch_mon_capable()) flags |= RFTYPE_MON; -- Gitee From 56c2fe9d5ef998ee5fcd879368846bb160ae5b95 Mon Sep 17 00:00:00 2001 From: Zeng Heng Date: Thu, 22 May 2025 20:23:59 +0800 Subject: [PATCH 2/5] arm64/mpam: Fix num_rmids information hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8T2RT -------------------------------- Select the maximum number of RMIDs supported by the system as the RMIDs number. Fixes: cc622cf0fb21 ("arm_mpam: resctrl: Pick a value for num_rmid") Signed-off-by: Zeng Heng --- drivers/platform/mpam/mpam_resctrl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c index cdcadc4111e1..cb3112d9a43f 100644 --- a/drivers/platform/mpam/mpam_resctrl.c +++ b/drivers/platform/mpam/mpam_resctrl.c @@ -1095,7 +1095,7 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) * For mpam, each control group has its own pmg/rmid * space. */ - r->num_rmid = mpam_partid_max * mpam_pmg_max; + r->num_rmid = resctrl_arch_system_num_rmid_idx(); } return 0; -- Gitee From 900c053f0887a51614dfb379a40ac10d72580b03 Mon Sep 17 00:00:00 2001 From: Zeng Heng Date: Thu, 22 May 2025 20:24:00 +0800 Subject: [PATCH 3/5] arm64/mpam: Set 1 as the minimum setting value for MBA hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8T2RT -------------------------------- The MPAM hardware does not allow setting 0 as the bandwidth limit value. Otherwise, it would exhibit undefined behavior. Fixes: 58db5c68e84a ("untested: arm_mpam: resctrl: Add support for MB resource") Signed-off-by: Zeng Heng --- drivers/platform/mpam/mpam_resctrl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c index cb3112d9a43f..bef118332244 100644 --- a/drivers/platform/mpam/mpam_resctrl.c +++ b/drivers/platform/mpam/mpam_resctrl.c @@ -970,6 +970,7 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->membw.delay_linear = true; r->membw.throttle_mode = THREAD_THROTTLE_UNDEFINED; + r->membw.min_bw = 1; r->membw.bw_gran = get_mba_granularity(cprops); /* Round up to at least 1% */ -- Gitee From 19548e27f4eac3564fa89979b56f9e5e73c857d8 Mon Sep 17 00:00:00 2001 From: James Morse Date: Thu, 22 May 2025 20:24:01 +0800 Subject: [PATCH 4/5] x86/resctrl: Add max_bw to struct resctrl_membw hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IC35SV -------------------------------- __rdt_get_mem_config_amd() and __get_mem_config_intel() both use the default_ctrl property as a maximum value. This is because the MBA schema works differently between these platforms. Doing this complicates determining whether the default_ctrl property belongs to the arch code, or can be derived from the schema format. Deriving the maximum or default value from the schema format would avoid the architecture code having to tell resctrl such obvious things as the maximum percentage is 100, and the maximum bitmap is all ones. Maximum bandwidth is always going to vary per platform. Add max_bw as a special case. This is currently used for the maximum MBA percentage on Intel platforms, but can be removed from the architecture code if 'percentage' becomes a schema format resctrl supports directly. This value isn't needed for other schema formats. This will allow the default_ctrl to be generated from the schema properties when it is needed. Signed-off-by: James Morse Signed-off-by: Borislav Petkov (AMD) Reviewed-by: Shaopeng Tan Reviewed-by: Tony Luck Reviewed-by: Reinette Chatre Reviewed-by: Fenghua Yu Reviewed-by: Babu Moger Tested-by: Carl Worth # arm64 Tested-by: Shaopeng Tan Tested-by: Peter Newman Tested-by: Amit Singh Tomar # arm64 Tested-by: Shanker Donthineni # arm64 Tested-by: Babu Moger Link: https://lore.kernel.org/r/20250311183715.16445-8-james.morse@arm.com Signed-off-by: Zeng Heng --- arch/x86/kernel/cpu/resctrl/core.c | 2 ++ fs/resctrl/ctrlmondata.c | 4 ++-- include/linux/resctrl.h | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 3390c72c77ba..ee4d487f6899 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -200,6 +200,7 @@ 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->default_ctrl = MAX_MBA_BW; + r->membw.max_bw = MAX_MBA_BW; r->membw.arch_needs_linear = true; if (ecx & MBA_IS_LINEAR) { r->membw.delay_linear = true; @@ -238,6 +239,7 @@ static __init bool __rdt_get_mem_config_amd(struct rdt_resource *r) cpuid_count(0x80000020, subleaf, &eax.full, &ebx, &ecx, &edx.full); hw_res->num_closid = edx.split.cos_max + 1; r->default_ctrl = MAX_MBA_BW_AMD; + r->membw.max_bw = MAX_MBA_BW_AMD; /* AMD does not use delay */ r->membw.delay_linear = false; diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c index 00132a77879d..3f0380a2386a 100644 --- a/fs/resctrl/ctrlmondata.c +++ b/fs/resctrl/ctrlmondata.c @@ -57,11 +57,11 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r) return false; } - if ((bw < r->membw.min_bw || bw > r->default_ctrl) && + if ((bw < r->membw.min_bw || bw > r->membw.max_bw) && !is_mba_sc(r)) { rdt_last_cmd_printf("%s value %ld out of range [%d,%d]\n", r->name, bw, r->membw.min_bw, - r->default_ctrl); + r->membw.max_bw); return false; } diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index 4f54c371d185..e2e63b3bd508 100644 --- a/include/linux/resctrl.h +++ b/include/linux/resctrl.h @@ -163,6 +163,7 @@ enum membw_throttle_mode { /** * struct resctrl_membw - Memory bandwidth allocation related data * @min_bw: Minimum memory bandwidth percentage user can request + * @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 @@ -175,6 +176,7 @@ enum membw_throttle_mode { */ struct resctrl_membw { u32 min_bw; + u32 max_bw; u32 bw_gran; u32 delay_linear; bool arch_needs_linear; -- Gitee From f8db4f15cf38365c14cfe8f7b2d5b74e4043bd0b Mon Sep 17 00:00:00 2001 From: Zeng Heng Date: Thu, 22 May 2025 20:24:02 +0800 Subject: [PATCH 5/5] arm64/mpam: Update QoS partition default value hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IC35SV -------------------------------- No longer use the configurable maximum value as the default for QoS configuration. Instead, we have updated the recommended value to be the default. Signed-off-by: Zeng Heng --- drivers/platform/mpam/mpam_resctrl.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c index bef118332244..ae02d33dab3f 100644 --- a/drivers/platform/mpam/mpam_resctrl.c +++ b/drivers/platform/mpam/mpam_resctrl.c @@ -966,6 +966,7 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_MB; r->default_ctrl = MAX_MBA_BW; + r->membw.max_bw = MAX_MBA_BW; r->data_width = 3; r->membw.delay_linear = true; @@ -994,6 +995,7 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_CACHE; r->default_ctrl = MAX_MBA_BW; + r->membw.max_bw = MAX_MBA_BW; r->data_width = 3; r->cache_level = class->level; @@ -1009,7 +1011,8 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->format_str = "%d=%0*u"; r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_CACHE; - r->default_ctrl = MAX_MBA_BW; + r->default_ctrl = 0; + r->membw.max_bw = MAX_MBA_BW; r->data_width = 3; r->cache_level = class->level; @@ -1024,7 +1027,8 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->format_str = "%d=%0*u"; r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_MB; - r->default_ctrl = MAX_MBA_BW; + r->default_ctrl = 0; + r->membw.max_bw = MAX_MBA_BW; r->data_width = 3; r->membw.delay_linear = true; @@ -1044,7 +1048,8 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->format_str = "%d=%0*u"; r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_CACHE; - r->default_ctrl = GENMASK(cprops->intpri_wd - 1, 0); + r->default_ctrl = 0; + r->membw.max_bw = GENMASK(cprops->intpri_wd - 1, 0); r->data_width = 3; r->cache_level = class->level; @@ -1059,7 +1064,8 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->format_str = "%d=%0*u"; r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_MB; - r->default_ctrl = GENMASK(cprops->intpri_wd - 1, 0); + r->default_ctrl = 3; + r->membw.max_bw = GENMASK(cprops->intpri_wd - 1, 0); r->data_width = 3; r->membw.bw_gran = 1; @@ -1073,6 +1079,7 @@ static int mpam_resctrl_resource_init(struct mpam_resctrl_res *res) r->schema_fmt = RESCTRL_SCHEMA_RANGE; r->fflags = RFTYPE_RES_MB; r->default_ctrl = 1; + r->membw.max_bw = 1; r->data_width = 1; r->membw.bw_gran = 1; -- Gitee