diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 3390c72c77ba336298e1e416854b9e1c1d9cc368..ee4d487f689905368504d8ee4c25390fdb7fbe45 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/drivers/platform/mpam/mpam_resctrl.c b/drivers/platform/mpam/mpam_resctrl.c index cdcadc4111e1cbeddb31ed81b4ebe8c3808630cf..ae02d33dab3ff838015e1d3b84742930b3a10f49 100644 --- a/drivers/platform/mpam/mpam_resctrl.c +++ b/drivers/platform/mpam/mpam_resctrl.c @@ -966,10 +966,12 @@ 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; 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% */ @@ -993,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; @@ -1008,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; @@ -1023,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; @@ -1043,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; @@ -1058,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; @@ -1072,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; @@ -1095,7 +1103,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; diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c index 00132a77879dabf48ee4ebe4aec90aee52382ee9..3f0380a2386a7d878d9be3a08d4e7a23c4416a6b 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/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c index 70fdbaa12ba8fafd9880382ea565bb688b327460..b1f127432b4276650940bc02ba2c15e936dffc5a 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; diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h index 4f54c371d185f5b77dd39fc5d3318b80b0cbfd3f..e2e63b3bd50857d390c5f426f406cee3f15987cc 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;