Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1462646pxf; Fri, 12 Mar 2021 10:02:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJyBNj2Egq+ClEg5sfk+0O92JuQ47xiv12Mi70XC8jXV0sMqcBsRMYMzky2QXP4m2uFT2IcF X-Received: by 2002:a50:82c5:: with SMTP id 63mr15475308edg.97.1615572146094; Fri, 12 Mar 2021 10:02:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615572146; cv=none; d=google.com; s=arc-20160816; b=sexsvGspht/YujsH4N++odqD/f8fqP7uYHRHjPJXoED0v27N9XOT2SdIvXCBp25BEr kqskbdnCfuP3t9sPjSttyB0p5cn5GzhvxMbJC27b8je0oUxzEw8bJPCHTUYKm2rkAvpF Cnv6wUmP0gz0dnLybo6jl2BvMn0YVMT2hKEh0/KEZ3phM2SzVaMbLMjMJM0bzfj/Am6A dp2Fb5gibTNBBLSJWq5gYfBQ2D2raotXYumgmNU+A8p7Gs50vzeU2SVt4mXSU2lRRNTr rTHI+SsTfWK6wZYYhpOoAu4ukO52yAocLb6708INw3M67HbAxxGBEK0Uh8CKANdhXEpP CX4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=GBSns0XsZ7GSt/drTFVGstrmzX5oJ9jNjfg0cDtRzYo=; b=E1sm3XN8VKnqiODMkLcPRVkRhllDVak7IWvf5QKmCIUr9vU14DjdyrI5mFg6PH4RqI SJnbDM2ZdQbATjYF/KSB5VdGSje+qXLeg5udoTitMnassuCdz3gPjFjpcfDRgDKtrLyF 9BZA9UYZw6E7hkB2YiNXPRFjwMNUsj9iLi/U9Fa5CqZHWdyk/T0tV/WRjbLxKUA2h98A 4p+IISJ7cmjKf5qZp1NWzrUiKzDxNbVAryJhM89uNBGxt4638lSXjk+G2gF5QcwvBwPK eEr1RMnZbvQaW/Y89QGcP0EQ0gV59oeinmdiQ0Vfbkm6JFROxccfcnT9ZDCHpHrJ/URJ B80A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o10si4788624edc.254.2021.03.12.10.02.03; Fri, 12 Mar 2021 10:02:26 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233362AbhCLSAw (ORCPT + 99 others); Fri, 12 Mar 2021 13:00:52 -0500 Received: from foss.arm.com ([217.140.110.172]:58804 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232257AbhCLSAc (ORCPT ); Fri, 12 Mar 2021 13:00:32 -0500 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 19296ED1; Fri, 12 Mar 2021 10:00:32 -0800 (PST) Received: from merodach.members.linode.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4C8923F7D7; Fri, 12 Mar 2021 10:00:30 -0800 (PST) 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, Jamie Iles , D Scott Phillips OS Subject: [PATCH v2 20/24] x86/resctrl: Apply offset correction when config is staged Date: Fri, 12 Mar 2021 17:58:45 +0000 Message-Id: <20210312175849.8327-21-james.morse@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210312175849.8327-1-james.morse@arm.com> References: <20210312175849.8327-1-james.morse@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When resctrl comes to write the CAT MSR values, it applies an adjustment based on the style of the resource. CODE and DATA resources have their closid mapped into an odd/even range. Previously this decision was based on the resource. Move this logic to apply_config() so that in future it can be based on the style of the configuration, not the resource. This makes it possible to merge the resources. Once the resources are merged, there may be multiple configurations to apply for a single closid and resource. resctrl_arch_update_domains() should supply the low and high indexes based on the changes it has made to the ctrl_val array as this allows the hardware to be updated once for a set of changes. Reviewed-by: Jamie Iles Signed-off-by: James Morse --- Changes since v1: * Removing the patch that moved the closid to the staged config means the min/max and return from apply_config() appears here. --- arch/x86/kernel/cpu/resctrl/core.c | 15 +------- arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 44 ++++++++++++++++++----- arch/x86/kernel/cpu/resctrl/internal.h | 4 +-- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 7 ---- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index f1d0d64e5d97..cb3186bc248b 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -195,11 +195,6 @@ struct rdt_hw_resource rdt_resources_all[] = { }, }; -static unsigned int cbm_idx(struct rdt_resource *r, unsigned int closid) -{ - return closid * r->cache.cbm_idx_mult + r->cache.cbm_idx_offset; -} - /* * cache_alloc_hsw_probe() - Have to probe for Intel haswell server CPUs * as they do not have CPUID enumeration support for Cache allocation. @@ -438,7 +433,7 @@ cat_wrmsr(struct rdt_domain *d, struct msr_param *m, struct rdt_resource *r) struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); for (i = m->low; i < m->high; i++) - wrmsrl(hw_res->msr_base + cbm_idx(r, i), hw_dom->ctrl_val[i]); + wrmsrl(hw_res->msr_base + i, hw_dom->ctrl_val[i]); } struct rdt_domain *get_domain_from_cpu(int cpu, struct rdt_resource *r) @@ -549,14 +544,6 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) m.low = 0; m.high = hw_res->num_closid; - - /* - * temporary: the array is full-size, but cat_wrmsr() still re-maps - * the index. - */ - if (hw_res->conf_type != CDP_BOTH) - m.high /= 2; - hw_res->msr_update(d, &m, r); return 0; } diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c index 72a8cf52de47..12a898d42689 100644 --- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c +++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c @@ -246,35 +246,47 @@ static int parse_line(char *line, struct resctrl_schema *s, return -EINVAL; } -static void apply_config(struct rdt_hw_domain *hw_dom, - struct resctrl_staged_config *cfg, int closid, +static unsigned int cbm_idx(struct rdt_resource *r, unsigned int closid) +{ + if (r->rid == RDT_RESOURCE_MBA) + return closid; + + return closid * r->cache.cbm_idx_mult + r->cache.cbm_idx_offset; +} + +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) { struct rdt_domain *dom = &hw_dom->resctrl; u32 *dc = !mba_sc ? hw_dom->ctrl_val : hw_dom->mbps_val; - if (cfg->new_ctrl != dc[closid]) { + if (cfg->new_ctrl != dc[idx]) { cpumask_set_cpu(cpumask_any(&dom->cpu_mask), cpu_mask); - dc[closid] = cfg->new_ctrl; + dc[idx] = cfg->new_ctrl; + + return true; } + + return false; } int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid) { struct resctrl_staged_config *cfg; struct rdt_hw_domain *hw_dom; + bool msr_param_init = false; struct msr_param msr_param; enum resctrl_conf_type t; cpumask_var_t cpu_mask; struct rdt_domain *d; bool mba_sc; int cpu; + u32 idx; if (!zalloc_cpumask_var(&cpu_mask, GFP_KERNEL)) return -ENOMEM; - msr_param.low = closid; - msr_param.high = msr_param.low + 1; msr_param.res = r; mba_sc = is_mba_sc(r); @@ -285,10 +297,23 @@ int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid) if (!cfg->have_new_ctrl) continue; - apply_config(hw_dom, cfg, closid, cpu_mask, mba_sc); + idx = cbm_idx(r, closid); + if (!apply_config(hw_dom, cfg, idx, cpu_mask, mba_sc)) + continue; + + if (!msr_param_init) { + msr_param.low = idx; + msr_param.high = idx; + msr_param_init = true; + } else { + msr_param.low = min(msr_param.low, idx); + msr_param.high = max(msr_param.high, idx); + } } } + msr_param.high =+ 1; + /* * Avoid writing the control msr with control values when * MBA software controller is enabled @@ -405,11 +430,12 @@ void resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d, u32 closid, enum resctrl_conf_type type, u32 *value) { struct rdt_hw_domain *hw_dom = resctrl_to_arch_dom(d); + u32 idx = cbm_idx(r, closid); if (!is_mba_sc(r)) - *value = hw_dom->ctrl_val[closid]; + *value = hw_dom->ctrl_val[idx]; else - *value = hw_dom->mbps_val[closid]; + *value = hw_dom->mbps_val[idx]; } static void show_doms(struct seq_file *s, struct resctrl_schema *schema, int closid) diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index 9bafe3b32035..ac36249f43ba 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -324,8 +324,8 @@ static inline struct rdt_hw_domain *resctrl_to_arch_dom(struct rdt_domain *r) */ struct msr_param { struct rdt_resource *res; - int low; - int high; + u32 low; + u32 high; }; static inline bool is_llc_occupancy_enabled(void) diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index a3e5c8b1b0cb..801bff59db06 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -2368,13 +2368,6 @@ static int reset_all_ctrls(struct rdt_resource *r) msr_param.low = 0; msr_param.high = hw_res->num_closid; - /* - * temporary: the array is full-sized, but cat_wrmsr() still re-maps - * the index. - */ - if (hw_res->cdp_enabled) - msr_param.high /= 2; - /* * Disable resource control for this resource by setting all * CBMs in all domains to the maximum mask value. Pick one CPU -- 2.30.0