All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Morse <james.morse@arm.com>
To: x86@kernel.org, linux-kernel@vger.kernel.org
Cc: Fenghua Yu <fenghua.yu@intel.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	H Peter Anvin <hpa@zytor.com>, Babu Moger <Babu.Moger@amd.com>,
	James Morse <james.morse@arm.com>,
	shameerali.kolothum.thodi@huawei.com,
	D Scott Phillips OS <scott@os.amperecomputing.com>,
	lcherian@marvell.com, bobo.shaobowang@huawei.com,
	tan.shaopeng@fujitsu.com, Jamie Iles <quic_jiles@quicinc.com>,
	Cristian Marussi <cristian.marussi@arm.com>,
	Xin Hao <xhao@linux.alibaba.com>,
	xingxin.hx@openanolis.org, baolin.wang@linux.alibaba.com
Subject: [PATCH v6 13/21] x86/resctrl: Add per-rmid arch private storage for overflow and chunks
Date: Fri,  2 Sep 2022 15:48:21 +0000	[thread overview]
Message-ID: <20220902154829.30399-14-james.morse@arm.com> (raw)
In-Reply-To: <20220902154829.30399-1-james.morse@arm.com>

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().

Reviewed-by: Jamie Iles <quic_jiles@quicinc.com>
Tested-by: Xin Hao <xhao@linux.alibaba.com>
Reviewed-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: Cristian Marussi <cristian.marussi@arm.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: James Morse <james.morse@arm.com>
---
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 46062099d69e..4de8e5bb93e1 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


  parent reply	other threads:[~2022-09-02 15:56 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-02 15:48 [PATCH v6 00/21] x86/resctrl: Make resctrl_arch_rmid_read() return values in bytes James Morse
2022-09-02 15:48 ` [PATCH v6 01/21] x86/resctrl: Kill off alloc_enabled James Morse
2022-09-23 18:02   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 02/21] x86/resctrl: Merge mon_capable and mon_enabled James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 03/21] x86/resctrl: Add domain online callback for resctrl work James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 04/21] x86/resctrl: Group struct rdt_hw_domain cleanup James Morse
2022-09-07  6:28   ` haoxin
2022-09-08 17:01     ` James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 05/21] x86/resctrl: Add domain offline callback for resctrl work James Morse
2022-09-07  6:29   ` haoxin
2022-09-08 17:00     ` James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 06/21] x86/resctrl: Remove set_mba_sc()s control array re-initialisation James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 07/21] x86/resctrl: Abstract and use supports_mba_mbps() James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 08/21] x86/resctrl: Create mba_sc configuration in the rdt_domain James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 09/21] x86/resctrl: Switch over to the resctrl mbps_val list James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 10/21] x86/resctrl: Remove architecture copy of mbps_val James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 11/21] x86/resctrl: Allow update_mba_bw() to update controls directly James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 12/21] x86/resctrl: Calculate bandwidth from the previous __mon_event_count() chunks James Morse
2022-09-07  6:47   ` haoxin
2022-09-08 17:00     ` James Morse
2022-09-08 21:13       ` Reinette Chatre
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` James Morse [this message]
2022-09-23 18:01   ` [tip: x86/cache] x86/resctrl: Add per-rmid arch private storage for overflow and chunks tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 14/21] x86/resctrl: Allow per-rmid arch private storage to be reset James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 15/21] x86/resctrl: Abstract __rmid_read() James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 16/21] x86/resctrl: Pass the required parameters into resctrl_arch_rmid_read() James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 17/21] x86/resctrl: Move mbm_overflow_count() " James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 18/21] x86/resctrl: Move get_corrected_mbm_count() " James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 19/21] x86/resctrl: Rename and change the units of resctrl_cqm_threshold James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 20/21] x86/resctrl: Add resctrl_rmid_realloc_limit to abstract x86's boot_cpu_data James Morse
2022-09-07  6:26   ` haoxin
2022-09-08 17:01     ` James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-02 15:48 ` [PATCH v6 21/21] x86/resctrl: Make resctrl_arch_rmid_read() return values in bytes James Morse
2022-09-23 18:01   ` [tip: x86/cache] " tip-bot2 for James Morse
2022-09-13  1:00 ` [PATCH v6 00/21] " tan.shaopeng
2022-09-22  9:40   ` James Morse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220902154829.30399-14-james.morse@arm.com \
    --to=james.morse@arm.com \
    --cc=Babu.Moger@amd.com \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=bobo.shaobowang@huawei.com \
    --cc=bp@alien8.de \
    --cc=cristian.marussi@arm.com \
    --cc=fenghua.yu@intel.com \
    --cc=hpa@zytor.com \
    --cc=lcherian@marvell.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=quic_jiles@quicinc.com \
    --cc=reinette.chatre@intel.com \
    --cc=scott@os.amperecomputing.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=tan.shaopeng@fujitsu.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=xhao@linux.alibaba.com \
    --cc=xingxin.hx@openanolis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.