From: Reinette Chatre <reinette.chatre@intel.com>
To: Babu Moger <babu.moger@amd.com>, <corbet@lwn.net>,
<tony.luck@intel.com>, <james.morse@arm.com>,
<tglx@linutronix.de>, <mingo@redhat.com>, <bp@alien8.de>,
<dave.hansen@linux.intel.com>
Cc: <Dave.Martin@arm.com>, <x86@kernel.org>, <hpa@zytor.com>,
<akpm@linux-foundation.org>, <paulmck@kernel.org>,
<rostedt@goodmis.org>, <Neeraj.Upadhyay@amd.com>,
<david@redhat.com>, <arnd@arndb.de>, <fvdl@google.com>,
<seanjc@google.com>, <jpoimboe@kernel.org>,
<pawan.kumar.gupta@linux.intel.com>, <xin@zytor.com>,
<manali.shukla@amd.com>, <tao1.su@linux.intel.com>,
<sohil.mehta@intel.com>, <kai.huang@intel.com>,
<xiaoyao.li@intel.com>, <peterz@infradead.org>,
<xin3.li@intel.com>, <kan.liang@linux.intel.com>,
<mario.limonciello@amd.com>, <thomas.lendacky@amd.com>,
<perry.yuan@amd.com>, <gautham.shenoy@amd.com>,
<chang.seok.bae@intel.com>, <linux-doc@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <peternewman@google.com>,
<eranian@google.com>
Subject: Re: [PATCH v16 23/34] fs/resctrl: Support counter read/reset with mbm_event assignment mode
Date: Wed, 30 Jul 2025 13:03:17 -0700 [thread overview]
Message-ID: <26db5cff-dc25-417e-bac2-e05584e8f987@intel.com> (raw)
In-Reply-To: <dea9cd70b311b6a7e1eb85b1e6087c701bcb488e.1753467772.git.babu.moger@amd.com>
Hi Babu,
On 7/25/25 11:29 AM, Babu Moger wrote:
> When "mbm_event" counter assignment mode is enabled, the architecture
> requires a counter ID to read the event data.
>
> Introduce an is_mbm_cntr field in struct rmid_read to indicate whether
> counter assignment mode is in use.
>
> Update the logic to call resctrl_arch_cntr_read() and
> resctrl_arch_reset_cntr() when the assignment mode is active. Report
> 'Unassigned' in case the user attempts to read the event without assigning
> a hardware counter.
>
> Declare mbm_cntr_get() in fs/resctrl/internal.h to make it accessible to
> other functions within fs/resctrl.
From what I can tell this is not needed by this patch. It is also a hint that
there may be some monitoring specific code outside of monitor.c. Looks like this
is done to support later patch #29 "fs/resctrl: Introduce mbm_L3_assignments to
list assignments in a group" where mbm_L3_assignments_show() should rather
be in monitor.c
>
> Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Babu Moger <babu.moger@amd.com>
> ---
...
> ---
> Documentation/filesystems/resctrl.rst | 6 ++++
> fs/resctrl/ctrlmondata.c | 22 +++++++++---
> fs/resctrl/internal.h | 5 +++
> fs/resctrl/monitor.c | 52 ++++++++++++++++++++-------
> 4 files changed, 67 insertions(+), 18 deletions(-)
>
> diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst
> index 446736dbd97f..4c24c5f3f4c1 100644
> --- a/Documentation/filesystems/resctrl.rst
> +++ b/Documentation/filesystems/resctrl.rst
> @@ -434,6 +434,12 @@ When monitoring is enabled all MON groups will also contain:
> for the L3 cache they occupy). These are named "mon_sub_L3_YY"
> where "YY" is the node number.
>
> + When the 'mbm_event' counter assignment mode is enabled, reading
> + an MBM event of a MON group returns 'Unassigned' if no hardware
> + counter is assigned to it. For CTRL_MON groups, 'Unassigned' is
> + returned if the MBM event does not have an assigned counter in the
> + CTRL_MON group nor in any of its associated MON groups.
> +
> "mon_hw_id":
> Available only with debug option. The identifier used by hardware
> for the monitor group. On x86 this is the RMID.
> diff --git a/fs/resctrl/ctrlmondata.c b/fs/resctrl/ctrlmondata.c
> index ad7ffc6acf13..31787ce6ec91 100644
> --- a/fs/resctrl/ctrlmondata.c
> +++ b/fs/resctrl/ctrlmondata.c
> @@ -563,10 +563,15 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
> rr->r = r;
> rr->d = d;
> rr->first = first;
> - rr->arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, evtid);
> - if (IS_ERR(rr->arch_mon_ctx)) {
> - rr->err = -EINVAL;
> - return;
> + if (resctrl_arch_mbm_cntr_assign_enabled(r) &&
> + resctrl_is_mbm_event(evtid)) {
> + rr->is_mbm_cntr = true;
> + } else {
> + rr->arch_mon_ctx = resctrl_arch_mon_ctx_alloc(r, evtid);
> + if (IS_ERR(rr->arch_mon_ctx)) {
> + rr->err = -EINVAL;
> + return;
> + }
> }
>
> cpu = cpumask_any_housekeeping(cpumask, RESCTRL_PICK_ANY_CPU);
> @@ -582,7 +587,8 @@ void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
> else
> smp_call_on_cpu(cpu, smp_mon_event_count, rr, false);
>
> - resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx);
> + if (rr->arch_mon_ctx)
> + resctrl_arch_mon_ctx_free(r, evtid, rr->arch_mon_ctx);
> }
>
> int rdtgroup_mondata_show(struct seq_file *m, void *arg)
> @@ -653,10 +659,16 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg)
>
> checkresult:
>
> + /*
> + * -ENOENT is a special case, set only when "mbm_event" counter assignment
> + * mode is enabled and no counter has been assigned.
> + */
> if (rr.err == -EIO)
> seq_puts(m, "Error\n");
> else if (rr.err == -EINVAL)
> seq_puts(m, "Unavailable\n");
> + else if (rr.err == -ENOENT)
> + seq_puts(m, "Unassigned\n");
> else
> seq_printf(m, "%llu\n", rr.val);
>
> diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h
> index 216588842444..eeee83a5067a 100644
> --- a/fs/resctrl/internal.h
> +++ b/fs/resctrl/internal.h
> @@ -110,6 +110,8 @@ struct mon_data {
> * domains in @r sharing L3 @ci.id
> * @evtid: Which monitor event to read.
> * @first: Initialize MBM counter when true.
> + * @is_mbm_cntr: Is the counter valid? true if "mbm_event" counter assignment mode is
> + * enabled and it is an MBM event.
Since a counter may not be assigned to event being read I do not believe that "Is the counter
valid?" is accurate and should rather be dropped. Rest of text looks accurate to me.
> * @ci_id: Cacheinfo id for L3. Only set when @d is NULL. Used when summing domains.
> * @err: Error encountered when reading counter.
> * @val: Returned value of event counter. If @rgrp is a parent resource group,
> @@ -124,6 +126,7 @@ struct rmid_read {
> struct rdt_mon_domain *d;
> enum resctrl_event_id evtid;
> bool first;
> + bool is_mbm_cntr;
> unsigned int ci_id;
> int err;
> u64 val;
> @@ -391,6 +394,8 @@ int rdtgroup_assign_cntr_event(struct rdt_mon_domain *d, struct rdtgroup *rdtgrp
> struct mon_evt *mevt);
> void rdtgroup_unassign_cntr_event(struct rdt_mon_domain *d, struct rdtgroup *rdtgrp,
> struct mon_evt *mevt);
> +int mbm_cntr_get(struct rdt_resource *r, struct rdt_mon_domain *d,
> + struct rdtgroup *rdtgrp, enum resctrl_event_id evtid);
>
Not necessary? mbm_cntr_get() can remain internal to monitor.c
> #ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
> int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
> diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
> index 070965d45770..a8b53b0ad0b7 100644
> --- a/fs/resctrl/monitor.c
> +++ b/fs/resctrl/monitor.c
> @@ -362,13 +362,25 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
> u32 closid = rdtgrp->closid;
> u32 rmid = rdtgrp->mon.rmid;
> struct rdt_mon_domain *d;
> + int cntr_id = -ENOENT;
> struct cacheinfo *ci;
> struct mbm_state *m;
> int err, ret;
> u64 tval = 0;
>
> + if (rr->is_mbm_cntr) {
> + cntr_id = mbm_cntr_get(rr->r, rr->d, rdtgrp, rr->evtid);
> + if (cntr_id < 0) {
> + rr->err = -ENOENT;
> + return -EINVAL;
> + }
> + }
> +
> if (rr->first) {
> - resctrl_arch_reset_rmid(rr->r, rr->d, closid, rmid, rr->evtid);
> + if (rr->is_mbm_cntr)
> + resctrl_arch_reset_cntr(rr->r, rr->d, closid, rmid, cntr_id, rr->evtid);
> + else
> + resctrl_arch_reset_rmid(rr->r, rr->d, closid, rmid, rr->evtid);
> m = get_mbm_state(rr->d, closid, rmid, rr->evtid);
> if (m)
> memset(m, 0, sizeof(struct mbm_state));
> @@ -379,8 +391,12 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
> /* Reading a single domain, must be on a CPU in that domain. */
> if (!cpumask_test_cpu(cpu, &rr->d->hdr.cpu_mask))
> return -EINVAL;
> - rr->err = resctrl_arch_rmid_read(rr->r, rr->d, closid, rmid,
> - rr->evtid, &tval, rr->arch_mon_ctx);
> + if (rr->is_mbm_cntr)
> + rr->err = resctrl_arch_cntr_read(rr->r, rr->d, closid, rmid, cntr_id,
> + rr->evtid, &tval);
> + else
> + rr->err = resctrl_arch_rmid_read(rr->r, rr->d, closid, rmid,
> + rr->evtid, &tval, rr->arch_mon_ctx);
> if (rr->err)
> return rr->err;
>
> @@ -405,8 +421,12 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
> list_for_each_entry(d, &rr->r->mon_domains, hdr.list) {
> if (d->ci_id != rr->ci_id)
> continue;
> - err = resctrl_arch_rmid_read(rr->r, d, closid, rmid,
> - rr->evtid, &tval, rr->arch_mon_ctx);
> + if (rr->is_mbm_cntr)
> + err = resctrl_arch_cntr_read(rr->r, d, closid, rmid, cntr_id,
> + rr->evtid, &tval);
> + else
> + err = resctrl_arch_rmid_read(rr->r, d, closid, rmid,
> + rr->evtid, &tval, rr->arch_mon_ctx);
> if (!err) {
> rr->val += tval;
> ret = 0;
> @@ -613,11 +633,16 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_mon_domain *
> rr.r = r;
> rr.d = d;
> rr.evtid = evtid;
> - rr.arch_mon_ctx = resctrl_arch_mon_ctx_alloc(rr.r, rr.evtid);
> - if (IS_ERR(rr.arch_mon_ctx)) {
> - pr_warn_ratelimited("Failed to allocate monitor context: %ld",
> - PTR_ERR(rr.arch_mon_ctx));
> - return;
> + if (resctrl_arch_mbm_cntr_assign_enabled(r) &&
> + resctrl_arch_mbm_cntr_assign_enabled(r)) {
Duplicate check?
> + rr.is_mbm_cntr = true;
> + } else {
> + rr.arch_mon_ctx = resctrl_arch_mon_ctx_alloc(rr.r, rr.evtid);
> + if (IS_ERR(rr.arch_mon_ctx)) {
> + pr_warn_ratelimited("Failed to allocate monitor context: %ld",
> + PTR_ERR(rr.arch_mon_ctx));
> + return;
> + }
> }
>
> __mon_event_count(rdtgrp, &rr);
> @@ -629,7 +654,8 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_mon_domain *
> if (is_mba_sc(NULL))
> mbm_bw_count(rdtgrp, &rr);
>
> - resctrl_arch_mon_ctx_free(rr.r, rr.evtid, rr.arch_mon_ctx);
> + if (rr.arch_mon_ctx)
> + resctrl_arch_mon_ctx_free(rr.r, rr.evtid, rr.arch_mon_ctx);
> }
>
> static void mbm_update(struct rdt_resource *r, struct rdt_mon_domain *d,
> @@ -983,8 +1009,8 @@ static void rdtgroup_assign_cntr(struct rdt_resource *r, struct rdt_mon_domain *
> * Return:
> * Valid counter ID on success, or -ENOENT on failure.
> */
> -static int mbm_cntr_get(struct rdt_resource *r, struct rdt_mon_domain *d,
> - struct rdtgroup *rdtgrp, enum resctrl_event_id evtid)
> +int mbm_cntr_get(struct rdt_resource *r, struct rdt_mon_domain *d,
> + struct rdtgroup *rdtgrp, enum resctrl_event_id evtid)
> {
> int cntr_id;
>
Not necessary?
Reinette
next prev parent reply other threads:[~2025-07-30 20:03 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-25 18:29 [PATCH v16 00/34] x86,fs/resctrl: Support AMD Assignable Bandwidth Monitoring Counters (ABMC) Babu Moger
2025-07-25 18:29 ` [PATCH v16 01/34] x86,fs/resctrl: Consolidate monitor event descriptions Babu Moger
2025-07-30 19:47 ` Reinette Chatre
2025-07-30 20:23 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 02/34] x86,fs/resctrl: Replace architecture event enabled checks Babu Moger
2025-07-25 18:29 ` [PATCH v16 03/34] x86/resctrl: Remove 'rdt_mon_features' global variable Babu Moger
2025-07-25 18:29 ` [PATCH v16 04/34] x86,fs/resctrl: Prepare for more monitor events Babu Moger
2025-07-25 18:29 ` [PATCH v16 05/34] x86/cpufeatures: Add support for Assignable Bandwidth Monitoring Counters (ABMC) Babu Moger
2025-07-30 19:47 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 06/34] x86/resctrl: Add ABMC feature in the command line options Babu Moger
2025-07-25 18:29 ` [PATCH v16 07/34] x86,fs/resctrl: Consolidate monitoring related data from rdt_resource Babu Moger
2025-07-25 18:29 ` [PATCH v16 08/34] x86,fs/resctrl: Detect Assignable Bandwidth Monitoring feature details Babu Moger
2025-07-30 19:49 ` Reinette Chatre
2025-08-06 21:04 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 09/34] x86/resctrl: Add support to enable/disable AMD ABMC feature Babu Moger
2025-07-25 18:29 ` [PATCH v16 10/34] fs/resctrl: Introduce the interface to display monitoring modes Babu Moger
2025-08-06 21:02 ` Moger, Babu
2025-08-06 21:30 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 11/34] fs/resctrl: Add resctrl file to display number of assignable counters Babu Moger
2025-08-06 21:12 ` Moger, Babu
2025-08-06 21:31 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 12/34] fs/resctrl: Introduce mbm_cntr_cfg to track assignable counters per domain Babu Moger
2025-07-25 18:29 ` [PATCH v16 13/34] fs/resctrl: Introduce interface to display number of free MBM counters Babu Moger
2025-08-06 21:19 ` Moger, Babu
2025-08-06 21:31 ` Reinette Chatre
2025-08-06 22:04 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 14/34] x86/resctrl: Add data structures and definitions for ABMC assignment Babu Moger
2025-07-25 18:29 ` [PATCH v16 15/34] fs/resctrl: Introduce event configuration field in struct mon_evt Babu Moger
2025-07-25 18:29 ` [PATCH v16 16/34] x86,fs/resctrl: Implement resctrl_arch_config_cntr() to assign a counter with ABMC Babu Moger
2025-07-30 19:50 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 17/34] fs/resctrl: Add the functionality to assign MBM events Babu Moger
2025-07-30 19:52 ` Reinette Chatre
2025-08-07 18:29 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 18/34] fs/resctrl: Add the functionality to unassign " Babu Moger
2025-07-30 19:53 ` Reinette Chatre
2025-08-07 18:33 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 19/34] fs/resctrl: Pass struct rdtgroup instead of individual members Babu Moger
2025-07-30 19:54 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 20/34] fs/resctrl: Introduce counter ID read, reset calls in mbm_event mode Babu Moger
2025-07-30 19:59 ` Reinette Chatre
2025-08-07 19:59 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 21/34] x86/resctrl: Refactor resctrl_arch_rmid_read() Babu Moger
2025-07-30 19:59 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 22/34] x86/resctrl: Implement resctrl_arch_reset_cntr() and resctrl_arch_cntr_read() Babu Moger
2025-07-30 20:01 ` Reinette Chatre
2025-08-08 2:05 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 23/34] fs/resctrl: Support counter read/reset with mbm_event assignment mode Babu Moger
2025-07-30 20:03 ` Reinette Chatre [this message]
2025-08-08 2:20 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 24/34] fs/resctrl: Add definitions for MBM event configuration Babu Moger
2025-07-30 20:03 ` Reinette Chatre
2025-08-08 2:24 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 25/34] fs/resctrl: Add event configuration directory under info/L3_MON/ Babu Moger
2025-07-30 20:04 ` Reinette Chatre
2025-08-08 13:56 ` Moger, Babu
2025-08-08 15:12 ` Reinette Chatre
2025-08-08 17:47 ` Moger, Babu
2025-08-08 18:23 ` Reinette Chatre
2025-08-08 18:48 ` Moger, Babu
2025-08-08 20:26 ` Reinette Chatre
2025-07-25 18:29 ` [PATCH v16 26/34] fs/resctrl: Provide interface to update the event configurations Babu Moger
2025-07-30 20:05 ` Reinette Chatre
2025-08-08 18:27 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 27/34] fs/resctrl: Introduce mbm_assign_on_mkdir to enable assignments on mkdir Babu Moger
2025-07-30 20:08 ` Reinette Chatre
2025-08-08 20:29 ` Moger, Babu
2025-08-08 21:00 ` Reinette Chatre
2025-08-08 21:10 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 28/34] fs/resctrl: Auto assign counters on mkdir and clean up on group removal Babu Moger
2025-07-30 20:08 ` Reinette Chatre
2025-08-11 23:39 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 29/34] fs/resctrl: Introduce mbm_L3_assignments to list assignments in a group Babu Moger
2025-07-30 20:09 ` Reinette Chatre
2025-08-11 23:42 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 30/34] fs/resctrl: Introduce the interface to modify " Babu Moger
2025-07-30 20:10 ` Reinette Chatre
2025-08-11 23:51 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 31/34] fs/resctrl: Disable BMEC event configuration when mbm_event mode is enabled Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:16 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 32/34] fs/resctrl: Introduce the interface to switch between monitor modes Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:18 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 33/34] x86/resctrl: Configure mbm_event mode if supported Babu Moger
2025-07-30 20:11 ` Reinette Chatre
2025-08-12 19:21 ` Moger, Babu
2025-07-25 18:29 ` [PATCH v16 34/34] MAINTAINERS: resctrl: add myself as reviewer Babu Moger
2025-07-30 20:14 ` Reinette Chatre
2025-08-12 19:23 ` Moger, Babu
2025-07-30 19:47 ` [PATCH v16 00/34] x86,fs/resctrl: Support AMD Assignable Bandwidth Monitoring Counters (ABMC) Reinette Chatre
2025-07-30 23:31 ` Moger, Babu
2025-07-30 23:57 ` Reinette Chatre
2025-07-31 14:17 ` Moger, Babu
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=26db5cff-dc25-417e-bac2-e05584e8f987@intel.com \
--to=reinette.chatre@intel.com \
--cc=Dave.Martin@arm.com \
--cc=Neeraj.Upadhyay@amd.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=babu.moger@amd.com \
--cc=bp@alien8.de \
--cc=chang.seok.bae@intel.com \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=david@redhat.com \
--cc=eranian@google.com \
--cc=fvdl@google.com \
--cc=gautham.shenoy@amd.com \
--cc=hpa@zytor.com \
--cc=james.morse@arm.com \
--cc=jpoimboe@kernel.org \
--cc=kai.huang@intel.com \
--cc=kan.liang@linux.intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=manali.shukla@amd.com \
--cc=mario.limonciello@amd.com \
--cc=mingo@redhat.com \
--cc=paulmck@kernel.org \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=perry.yuan@amd.com \
--cc=peternewman@google.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=seanjc@google.com \
--cc=sohil.mehta@intel.com \
--cc=tao1.su@linux.intel.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=xin3.li@intel.com \
--cc=xin@zytor.com \
/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.