From nobody Thu Apr 2 14:47:32 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85324C38145 for ; Fri, 2 Sep 2022 15:56:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236511AbiIBPz6 (ORCPT ); Fri, 2 Sep 2022 11:55:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237368AbiIBPyx (ORCPT ); Fri, 2 Sep 2022 11:54:53 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 4F03DE0DD for ; Fri, 2 Sep 2022 08:49:18 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 415BF1595; Fri, 2 Sep 2022 08:49:24 -0700 (PDT) Received: from merodach.members.linode.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 971B33F766; Fri, 2 Sep 2022 08:49:15 -0700 (PDT) From: James Morse To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Fenghua Yu , Reinette Chatre , Thomas Gleixner , Ingo Molnar , Borislav Petkov , H Peter Anvin , Babu Moger , James Morse , shameerali.kolothum.thodi@huawei.com, D Scott Phillips OS , lcherian@marvell.com, bobo.shaobowang@huawei.com, tan.shaopeng@fujitsu.com, Jamie Iles , Cristian Marussi , Xin Hao , xingxin.hx@openanolis.org, baolin.wang@linux.alibaba.com Subject: [PATCH v6 09/21] x86/resctrl: Switch over to the resctrl mbps_val list Date: Fri, 2 Sep 2022 15:48:17 +0000 Message-Id: <20220902154829.30399-10-james.morse@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220902154829.30399-1-james.morse@arm.com> References: <20220902154829.30399-1-james.morse@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Updates to resctrl's software controller follow the same path as other configuration updates, but they don't modify the hardware state. rdtgroup_schemata_write() uses parse_line() and the resource's parse_ctrlval() function to stage the configuration. resctrl_arch_update_domains() then updates the mbps_val[] array instead, and resctrl_arch_update_domains() skips the rdt_ctrl_update() call that would update hardware. This complicates the interface between resctrl's filesystem parts and architecture specific code. It should be possible for mba_sc to be completely implemented by the filesystem parts of resctrl. This would allow it to work on a second architecture with no additional code. resctrl_arch_update_domains() using the mbps_val[] array prevents this. Change parse_bw() to write the configuration value directly to the mbps_val[] array in the domain structure. Change rdtgroup_schemata_write() to skip the call to resctrl_arch_update_domains(), meaning all the mba_sc specific code in resctrl_arch_update_domains() can be removed. On the read-side, show_doms() and update_mba_bw() are changed to read the mbps_val[] array from the domain structure. With this, resctrl_arch_get_config() no longer needs to consider mba_sc resources. Reviewed-by: Jamie Iles Tested-by: Xin Hao Reviewed-by: Shaopeng Tan Tested-by: Shaopeng Tan Tested-by: Cristian Marussi Reviewed-by: Reinette Chatre Signed-off-by: James Morse --- Changes since v4: * Wording of comments. * Restored mbps_val[] reset code to set_mba_sc(). * Moved mbps_val[] reset in rdtgroup_init_mba() to reduce noise. Changes since v3: * Added the rdtgroup_init_mba() hunk to avoid ~0 being written to the ctrl_val array, and to only reset mbps_val[] when its going to be used. Changes since v2: * Fixed some names in the commit message. * Added missing 'or mbps_val[]' code to rdtgroup_size_show() Changes since v1: * Squashed out struct resctrl_mba_sc * Removed stray paragraphs from commit message --- arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 44 ++++++++++++++--------- arch/x86/kernel/cpu/resctrl/monitor.c | 10 +++--- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 27 ++++++++++---- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cp= u/resctrl/ctrlmondata.c index 87666275eed9..9f45207a6c74 100644 --- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c +++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c @@ -61,6 +61,7 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_= schema *s, struct rdt_domain *d) { struct resctrl_staged_config *cfg; + u32 closid =3D data->rdtgrp->closid; struct rdt_resource *r =3D s->res; unsigned long bw_val; =20 @@ -72,6 +73,12 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl= _schema *s, =20 if (!bw_validate(data->buf, &bw_val, r)) return -EINVAL; + + if (is_mba_sc(r)) { + d->mbps_val[closid] =3D bw_val; + return 0; + } + cfg->new_ctrl =3D bw_val; cfg->have_new_ctrl =3D true; =20 @@ -261,14 +268,13 @@ static u32 get_config_index(u32 closid, enum resctrl_= conf_type type) =20 static bool apply_config(struct rdt_hw_domain *hw_dom, struct resctrl_staged_config *cfg, u32 idx, - cpumask_var_t cpu_mask, bool mba_sc) + cpumask_var_t cpu_mask) { struct rdt_domain *dom =3D &hw_dom->d_resctrl; - u32 *dc =3D !mba_sc ? hw_dom->ctrl_val : hw_dom->mbps_val; =20 - if (cfg->new_ctrl !=3D dc[idx]) { + if (cfg->new_ctrl !=3D hw_dom->ctrl_val[idx]) { cpumask_set_cpu(cpumask_any(&dom->cpu_mask), cpu_mask); - dc[idx] =3D cfg->new_ctrl; + hw_dom->ctrl_val[idx] =3D cfg->new_ctrl; =20 return true; } @@ -284,14 +290,12 @@ int resctrl_arch_update_domains(struct rdt_resource *= r, u32 closid) enum resctrl_conf_type t; cpumask_var_t cpu_mask; struct rdt_domain *d; - bool mba_sc; int cpu; u32 idx; =20 if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL)) return -ENOMEM; =20 - mba_sc =3D is_mba_sc(r); msr_param.res =3D NULL; list_for_each_entry(d, &r->domains, list) { hw_dom =3D resctrl_to_arch_dom(d); @@ -301,7 +305,7 @@ int resctrl_arch_update_domains(struct rdt_resource *r,= u32 closid) continue; =20 idx =3D get_config_index(closid, t); - if (!apply_config(hw_dom, cfg, idx, cpu_mask, mba_sc)) + if (!apply_config(hw_dom, cfg, idx, cpu_mask)) continue; =20 if (!msr_param.res) { @@ -315,11 +319,7 @@ int resctrl_arch_update_domains(struct rdt_resource *r= , u32 closid) } } =20 - /* - * Avoid writing the control msr with control values when - * MBA software controller is enabled - */ - if (cpumask_empty(cpu_mask) || mba_sc) + if (cpumask_empty(cpu_mask)) goto done; cpu =3D get_cpu(); /* Update resource control msr on this CPU if it's in cpu_mask. */ @@ -406,6 +406,14 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_fil= e *of, =20 list_for_each_entry(s, &resctrl_schema_all, list) { r =3D s->res; + + /* + * Writes to mba_sc resources update the software controller, + * not the control msr. + */ + if (is_mba_sc(r)) + continue; + ret =3D resctrl_arch_update_domains(r, rdtgrp->closid); if (ret) goto out; @@ -433,9 +441,7 @@ u32 resctrl_arch_get_config(struct rdt_resource *r, str= uct rdt_domain *d, struct rdt_hw_domain *hw_dom =3D resctrl_to_arch_dom(d); u32 idx =3D get_config_index(closid, type); =20 - if (!is_mba_sc(r)) - return hw_dom->ctrl_val[idx]; - return hw_dom->mbps_val[idx]; + return hw_dom->ctrl_val[idx]; } =20 static void show_doms(struct seq_file *s, struct resctrl_schema *schema, i= nt closid) @@ -450,8 +456,12 @@ static void show_doms(struct seq_file *s, struct resct= rl_schema *schema, int clo if (sep) seq_puts(s, ";"); =20 - ctrl_val =3D resctrl_arch_get_config(r, dom, closid, - schema->conf_type); + if (is_mba_sc(r)) + ctrl_val =3D dom->mbps_val[closid]; + else + ctrl_val =3D resctrl_arch_get_config(r, dom, closid, + schema->conf_type); + seq_printf(s, r->format_str, dom->id, max_data_width, ctrl_val); sep =3D true; diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/re= sctrl/monitor.c index 497cadf3285d..16028b2f756a 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -447,13 +447,11 @@ static void update_mba_bw(struct rdtgroup *rgrp, stru= ct rdt_domain *dom_mbm) hw_dom_mba =3D resctrl_to_arch_dom(dom_mba); =20 cur_bw =3D pmbm_data->prev_bw; - user_bw =3D resctrl_arch_get_config(r_mba, dom_mba, closid, CDP_NONE); + user_bw =3D dom_mba->mbps_val[closid]; delta_bw =3D pmbm_data->delta_bw; - /* - * resctrl_arch_get_config() chooses the mbps/ctrl value to return - * based on is_mba_sc(). For now, reach into the hw_dom. - */ - cur_msr_val =3D hw_dom_mba->ctrl_val[closid]; + + /* MBA resource doesn't support CDP */ + cur_msr_val =3D resctrl_arch_get_config(r_mba, dom_mba, closid, CDP_NONE); =20 /* * For Ctrl groups read data from child monitor groups. diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/r= esctrl/rdtgroup.c index f7ebd019e7a5..55d8a12287c3 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -1356,11 +1356,13 @@ static int rdtgroup_size_show(struct kernfs_open_fi= le *of, struct seq_file *s, void *v) { struct resctrl_schema *schema; + enum resctrl_conf_type type; struct rdtgroup *rdtgrp; struct rdt_resource *r; struct rdt_domain *d; unsigned int size; int ret =3D 0; + u32 closid; bool sep; u32 ctrl; =20 @@ -1386,8 +1388,11 @@ static int rdtgroup_size_show(struct kernfs_open_fil= e *of, goto out; } =20 + closid =3D rdtgrp->closid; + list_for_each_entry(schema, &resctrl_schema_all, list) { r =3D schema->res; + type =3D schema->conf_type; sep =3D false; seq_printf(s, "%*s:", max_name_width, schema->name); list_for_each_entry(d, &r->domains, list) { @@ -1396,9 +1401,12 @@ static int rdtgroup_size_show(struct kernfs_open_fil= e *of, if (rdtgrp->mode =3D=3D RDT_MODE_PSEUDO_LOCKSETUP) { size =3D 0; } else { - ctrl =3D resctrl_arch_get_config(r, d, - rdtgrp->closid, - schema->conf_type); + if (is_mba_sc(r)) + ctrl =3D d->mbps_val[closid]; + else + ctrl =3D resctrl_arch_get_config(r, d, + closid, + type); if (r->rid =3D=3D RDT_RESOURCE_MBA) size =3D ctrl; else @@ -2818,14 +2826,19 @@ static int rdtgroup_init_cat(struct resctrl_schema = *s, u32 closid) } =20 /* Initialize MBA resource with default values. */ -static void rdtgroup_init_mba(struct rdt_resource *r) +static void rdtgroup_init_mba(struct rdt_resource *r, u32 closid) { struct resctrl_staged_config *cfg; struct rdt_domain *d; =20 list_for_each_entry(d, &r->domains, list) { + if (is_mba_sc(r)) { + d->mbps_val[closid] =3D MBA_MAX_MBPS; + continue; + } + cfg =3D &d->staged_config[CDP_NONE]; - cfg->new_ctrl =3D is_mba_sc(r) ? MBA_MAX_MBPS : r->default_ctrl; + cfg->new_ctrl =3D r->default_ctrl; cfg->have_new_ctrl =3D true; } } @@ -2840,7 +2853,9 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgr= p) list_for_each_entry(s, &resctrl_schema_all, list) { r =3D s->res; if (r->rid =3D=3D RDT_RESOURCE_MBA) { - rdtgroup_init_mba(r); + rdtgroup_init_mba(r, rdtgrp->closid); + if (is_mba_sc(r)) + continue; } else { ret =3D rdtgroup_init_cat(s, rdtgrp->closid); if (ret < 0) --=20 2.30.2