Received: by 2002:a05:6a10:7420:0:0:0:0 with SMTP id hk32csp610631pxb; Thu, 17 Feb 2022 10:44:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJxF4Twf0hCHsVyGDXtXeJfA6S+ns1fi+8MAiFJeE52PaIT53KIMomTQpaF10pFTl0NX0WzF X-Received: by 2002:a50:d711:0:b0:410:a51a:77c5 with SMTP id t17-20020a50d711000000b00410a51a77c5mr4298406edi.154.1645123467508; Thu, 17 Feb 2022 10:44:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645123467; cv=none; d=google.com; s=arc-20160816; b=LLOe2P9xFum4eeSBnoefwSYgJXOTb4uWg0NUDNPQSAa9dSUzwKdVpq79SiQGUGjRNU iFbjyoP6Km4D/KP2H1r1YdfK0zhYVWj6qxgsJN9LC6+HLCVsWUNBxIjf6F7KJLagYpu6 kpO6KOSnDpDIHaELbvEFhgtT+98prpeo3joQKHbfRNhv1q7do0h+YW3a0jC894q5Id9k 5Z+Cy8/KZbTbvianQIUadCftMOp1E8S95bkkco9EutH1GsLvp31osIBnPCSxQgfhcIzy 82dMGM1iTQn6KQOdwzUvB0kFvou9rmXimM+LMelWyfSsikWvrgHnYXftZDKXtuoPx878 fMBA== 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=KwPSM+So+8bbHZB+um8ScLPCBjpLxYB5HrQZupnTNt4=; b=FAUQV93H9GjHuqvQHg+8ZXkEQ/hG29u2UeOtnLyNHjqtUDq6D+hubU9B6N3EhqTepd X3NmS+o8TB7OW1W1akg/ozWl5JsCQBzwRDyJ52BjY2cutqvJLaZbrq04yZnMycT2rr7X O76y40V7urZhZpVMRe1VwLOvH23FsynLFv+ivqXLA3zCadvyFDp8sQNbTEOJsXfSkpl9 tRj5JuWbdzMR1NcaSkVXAUDtKtTKtfxKuiFZ77AgGbjcBfu4JzJ96mTrdMnR93+cw9Hy k0VAEmcMr6iLbqlkNTSWKUuXDUC69vmVgjzvLFE99s7EzdrJKel1hzCK3z30jYjHdloj R9QA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id nc32si903822ejc.545.2022.02.17.10.44.03; Thu, 17 Feb 2022 10:44:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S244357AbiBQSYJ (ORCPT + 99 others); Thu, 17 Feb 2022 13:24:09 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:56852 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244296AbiBQSX4 (ORCPT ); Thu, 17 Feb 2022 13:23:56 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id BFFCE3A5F8 for ; Thu, 17 Feb 2022 10:23:32 -0800 (PST) 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 6C56215BE; Thu, 17 Feb 2022 10:23: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 3CBD13F718; Thu, 17 Feb 2022 10:23: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 , lcherian@marvell.com, bobo.shaobowang@huawei.com, tan.shaopeng@fujitsu.com Subject: [PATCH v3 13/21] x86/recstrl: Add per-rmid arch private storage for overflow and chunks Date: Thu, 17 Feb 2022 18:21:02 +0000 Message-Id: <20220217182110.7176-14-james.morse@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220217182110.7176-1-james.morse@arm.com> References: <20220217182110.7176-1-james.morse@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A renamed __rmid_read() is intended as the function that an architecture agnostic resctrl filesystem driver can use to read a value in bytes from a counter. Currently the function returns the MBM values in chunks directly from hardware. For bandwidth counters the resctrl filesystem uses this to calculate the number of bytes ever seen. MPAM's scaling of counters can be changed at runtime, reducing the resolution but increasing the range. When this is changed the prev_msr values need to be converted by the architecture code. Add an array for per-rmid private storage. The prev_msr and chunks values will move here to allow resctrl_arch_rmid_read() to always return the number of bytes read by this counter without assistance from the filesystem. The values are moved in later patches when the overflow and correction calls are moved into __rmid_read(). Signed-off-by: James Morse ---- Changes since v2: * Capitalisation * Use __rmid_read() as this patch is earlier in the series. * kfree() one array in arch_domain_mbm_alloc() when allocating the other fails, instead of relying on domain_free(). * Remove the documentation that domain_free() has to be called to cleanup if this call fails. --- arch/x86/kernel/cpu/resctrl/core.c | 35 ++++++++++++++++++++++++++ arch/x86/kernel/cpu/resctrl/internal.h | 14 +++++++++++ 2 files changed, 49 insertions(+) diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index 90ebb7d71af2..de62b0b87ced 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -413,6 +413,8 @@ static void setup_default_ctrlval(struct rdt_resource *r, u32 *dc) static void domain_free(struct rdt_hw_domain *hw_dom) { + kfree(hw_dom->arch_mbm_total); + kfree(hw_dom->arch_mbm_local); kfree(hw_dom->ctrl_val); kfree(hw_dom); } @@ -438,6 +440,34 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) return 0; } +/** + * arch_domain_mbm_alloc() - Allocate arch private storage for the MBM counters + * @num_rmid: The size of the MBM counter array + * @hw_dom: The domain that owns the allocated arrays + */ +static int arch_domain_mbm_alloc(u32 num_rmid, struct rdt_hw_domain *hw_dom) +{ + size_t tsize; + + if (is_mbm_total_enabled()) { + tsize = sizeof(*hw_dom->arch_mbm_total); + hw_dom->arch_mbm_total = kcalloc(num_rmid, tsize, GFP_KERNEL); + if (!hw_dom->arch_mbm_total) + return -ENOMEM; + } + if (is_mbm_local_enabled()) { + tsize = sizeof(*hw_dom->arch_mbm_local); + hw_dom->arch_mbm_local = kcalloc(num_rmid, tsize, GFP_KERNEL); + if (!hw_dom->arch_mbm_local) { + kfree(hw_dom->arch_mbm_total); + hw_dom->arch_mbm_total = NULL; + return -ENOMEM; + } + } + + return 0; +} + /* * domain_add_cpu - Add a cpu to a resource's domain list. * @@ -487,6 +517,11 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r) return; } + if (r->mon_capable && arch_domain_mbm_alloc(r->num_rmid, hw_dom)) { + domain_free(hw_dom); + return; + } + list_add_tail(&d->list, add_pos); err = resctrl_online_domain(r, d); diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index c50c8911ef59..156d526c6952 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -303,17 +303,31 @@ struct mbm_state { bool delta_comp; }; +/** + * struct arch_mbm_state - values used to compute resctrl_arch_rmid_read()s + * return value. + * @prev_msr: Value of IA32_QM_CTR last time it was read for the RMID used to + * find this struct. + */ +struct arch_mbm_state { + u64 prev_msr; +}; + /** * struct rdt_hw_domain - Arch private attributes of a set of CPUs that share * a resource * @d_resctrl: Properties exposed to the resctrl file system * @ctrl_val: array of cache or mem ctrl values (indexed by CLOSID) + * @arch_mbm_total: arch private state for MBM total bandwidth + * @arch_mbm_local: arch private state for MBM local bandwidth * * Members of this structure are accessed via helpers that provide abstraction. */ struct rdt_hw_domain { struct rdt_domain d_resctrl; u32 *ctrl_val; + struct arch_mbm_state *arch_mbm_total; + struct arch_mbm_state *arch_mbm_local; }; static inline struct rdt_hw_domain *resctrl_to_arch_dom(struct rdt_domain *r) -- 2.30.2