public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Reinette Chatre <reinette.chatre@intel.com>
To: "Luck, Tony" <tony.luck@intel.com>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Cc: Fenghua Yu <fenghuay@nvidia.com>,
	Maciej Wieczor-Retman <maciej.wieczor-retman@intel.com>,
	Peter Newman <peternewman@google.com>,
	James Morse <james.morse@arm.com>,
	Babu Moger <babu.moger@amd.com>,
	"Drew Fustini" <dfustini@baylibre.com>,
	Dave Martin <Dave.Martin@arm.com>, Chen Yu <yu.c.chen@intel.com>,
	<x86@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
	<patches@lists.linux.dev>
Subject: Re: [PATCH v9 21/31] x86/resctrl: Read telemetry events
Date: Tue, 9 Sep 2025 20:43:20 -0700	[thread overview]
Message-ID: <919e104e-aeec-48d7-89bf-8d96ebce7e35@intel.com> (raw)
In-Reply-To: <aLiH0QxFCP9EpmWn@agluck-desk3>

Hi Tony,

On 9/3/25 11:24 AM, Luck, Tony wrote:

> Agreed. See new mark_telem_region_unusable() in updated patch below.
> Also pushed to
> git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git rdt-aet-v10-wip
> 
> -Tony
> 
> P.S. In addition to all the extra #include files you suggested, I found
> a few others missing. So those are added as needed in the series.
> 
> From 163824a2e10de9f63e20f0bc9f86b8c14f58bfcb Mon Sep 17 00:00:00 2001
> From: Tony Luck <tony.luck@intel.com>
> Date: Mon, 25 Aug 2025 10:47:06 -0700
> Subject: [PATCH 21/31] x86/resctrl: Read telemetry events
> 
> Telemetry events are enumerated by the INTEL_PMT_TELEMETRY subsystem.
> resctrl enables events with resctrl_enable_mon_event() passing a pointer
> to the pmt_event structure for the event within the struct event_group.
> The file system stores it in mon_evt::arch_priv.

This is getting to be very detailed description of code as opposed to
what the code does ... hmmm ... looks like I already made an attempt
with a proposal in v8 that was just ignored without any reason. <sigh>

> 
> Mark regions that did not pass the checks in skip_telemetry_region()
> so they will not be used by intel_aet_read_event().

Apart from skip_telemetry_region() -> skip_telem_region() I think this
should lighten up on the code details. Compare with, for example:

	Mark telemetry regions that did not pass the sanity checks by
	clearing their MMIO address fields so that they will not be
	used when reading events.  

(i.e, more about what the code does instead of actual code)

> 
> Add a check to resctrl_arch_rmid_read() for resource id
> RDT_RESOURCE_PERF_PKG and directly call intel_aet_read_event()
> passing the enum resctrl_event_id for the event and the arch_priv
> pointer that was supplied when the event was enabled.

Also heavy on code details while written as though reader is familiar
with function (intel_aet_read_event()) introduced in this patch. Compare
with, for example:
	Introduce intel_aet_read_event() to read telemetry events for
	resource RDT_RESOURCE_PERF_PKG. There may be multiple aggregators ...
	
> 
> There may be multiple aggregators tracking each package, so scan all of
> them and add up all counters. Aggregators may return an invalid data
> indication if they have received no records for a given RMID. Return
> success to the user if one or more aggregators provide valid data.
> 
> Resctrl now uses readq() so depends on X86_64. Update Kconfig.
> 
> Signed-off-by: Tony Luck <tony.luck@intel.com>
> ---
>  arch/x86/kernel/cpu/resctrl/internal.h  |  7 +++
>  arch/x86/kernel/cpu/resctrl/intel_aet.c | 65 ++++++++++++++++++++++++-
>  arch/x86/kernel/cpu/resctrl/monitor.c   |  3 ++
>  arch/x86/Kconfig                        |  2 +-
>  4 files changed, 75 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
> index 9ddfbbe5c3cf..8986071dd72a 100644
> --- a/arch/x86/kernel/cpu/resctrl/internal.h
> +++ b/arch/x86/kernel/cpu/resctrl/internal.h
> @@ -172,9 +172,16 @@ void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
>  #ifdef CONFIG_X86_CPU_RESCTRL_INTEL_AET
>  bool intel_aet_get_events(void);
>  void __exit intel_aet_exit(void);
> +int intel_aet_read_event(int domid, int rmid, enum resctrl_event_id evtid,

Patch 24 goes through effort of making RMID unsigned while intel_aet_read_event()
casts an unsigned RMID to signed?

> +			 void *arch_priv, u64 *val);
>  #else
>  static inline bool intel_aet_get_events(void) { return false; }
>  static inline void __exit intel_aet_exit(void) { }
> +static inline int intel_aet_read_event(int domid, int rmid, enum resctrl_event_id evtid,
> +				       void *arch_priv, u64 *val)
> +{
> +	return -EINVAL;
> +}
>  #endif
>  
>  #endif /* _ASM_X86_RESCTRL_INTERNAL_H */
> diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/resctrl/intel_aet.c
> index e36b3790733b..170158d40e27 100644
> --- a/arch/x86/kernel/cpu/resctrl/intel_aet.c
> +++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c
> @@ -12,13 +12,17 @@
>  #define pr_fmt(fmt)   "resctrl: " fmt
>  
>  #include <linux/array_size.h>
> +#include <linux/bits.h>
>  #include <linux/cleanup.h>
>  #include <linux/compiler_types.h>
> +#include <linux/container_of.h>
>  #include <linux/cpu.h>
>  #include <linux/err.h>
> +#include <linux/errno.h>
>  #include <linux/init.h>
>  #include <linux/intel_pmt_features.h>
>  #include <linux/intel_vsec.h>
> +#include <linux/io.h>
>  #include <linux/overflow.h>
>  #include <linux/printk.h>
>  #include <linux/resctrl.h>
> @@ -131,13 +135,28 @@ static bool skip_telem_region(struct telemetry_region *tr, struct event_group *e
>  	return false;
>  }
>  
> +/*
> + * Clear the address field of regions that did not pass the checks in
> + * skip_telem_region() so they will not be used by intel_aet_read_event().
> + * This is safe to do because intel_pmt_get_regions_by_feature() allocates
> + * a new pmt_feature_group structure to return to each caller and only makes
> + * use of the pmt_feature_group::kref field when intel_pmt_put_feature_group()
> + * returns the structure.
> + */
> +static void mark_telem_region_unusable(struct telemetry_region *tr)
> +{
> +	tr->addr = NULL;
> +}
> +
>  static bool enable_events(struct event_group *e, struct pmt_feature_group *p)
>  {
>  	bool usable_events = false;
>  
>  	for (int i = 0; i < p->count; i++) {
> -		if (skip_telem_region(&p->regions[i], e))
> +		if (skip_telem_region(&p->regions[i], e)) {
> +			mark_telem_region_unusable(&p->regions[i]);
>  			continue;
> +		}
>  		usable_events = true;
>  	}
>  
> @@ -215,3 +234,47 @@ void __exit intel_aet_exit(void)
>  		(*peg)->pfg = NULL;
>  	}
>  }
> +
> +#define DATA_VALID	BIT_ULL(63)
> +#define DATA_BITS	GENMASK_ULL(62, 0)
> +
> +/*
> + * Read counter for an event on a domain (summing all aggregators
> + * on the domain). If an aggregator hasn't received any data for a
> + * specific RMID, the MMIO read indicates that data is not valid.
> + * Return success if at least one aggregator has valid data.
> + */
> +int intel_aet_read_event(int domid, int rmid, enum resctrl_event_id eventid,
> +			 void *arch_priv, u64 *val)
> +{
> +	struct pmt_event *pevt = arch_priv;
> +	struct event_group *e;
> +	bool valid = false;
> +	u64 evtcount;
> +	void *pevt0;
> +	int idx;
> +
> +	pevt0 = pevt - pevt->idx;
> +	e = container_of(pevt0, struct event_group, evts);
> +	idx = rmid * e->num_events;

Looks like idx can also be unsigned (since rmid and num_events are unsigned) and
should be printed with %u?

> +	idx += pevt->idx;
> +
> +	if (idx * sizeof(u64) + sizeof(u64) > e->mmio_size) {
> +		pr_warn_once("MMIO index %d out of range\n", idx);
> +		return -EIO;
> +	}
> +
> +	for (int i = 0; i < e->pfg->count; i++) {
> +		if (!e->pfg->regions[i].addr)
> +			continue;
> +		if (e->pfg->regions[i].plat_info.package_id != domid)
> +			continue;
> +		evtcount = readq(e->pfg->regions[i].addr + idx * sizeof(u64));
> +		if (!(evtcount & DATA_VALID))
> +			continue;
> +		*val += evtcount & DATA_BITS;
> +		valid = true;
> +	}
> +
> +	return valid ? 0 : -EINVAL;
> +}

Reinette

  reply	other threads:[~2025-09-10  3:43 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-29 19:33 [PATCH v9 00/31] x86,fs/resctrl telemetry monitoring Tony Luck
2025-08-29 19:33 ` [PATCH v9 01/31] x86,fs/resctrl: Consolidate monitor event descriptions Tony Luck
2025-08-29 19:33 ` [PATCH v9 02/31] x86,fs/resctrl: Replace architecture event enabled checks Tony Luck
2025-08-29 19:33 ` [PATCH v9 03/31] x86/resctrl: Remove 'rdt_mon_features' global variable Tony Luck
2025-08-29 19:33 ` [PATCH v9 04/31] x86,fs/resctrl: Prepare for more monitor events Tony Luck
2025-08-29 19:33 ` [PATCH v9 05/31] x86,fs/resctrl: Improve domain type checking Tony Luck
2025-09-09 21:12   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 06/31] x86/resctrl: Move L3 initialization into new helper function Tony Luck
2025-09-09 21:13   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 07/31] x86,fs/resctrl: Refactor domain_remove_cpu_mon() ready for new domain types Tony Luck
2025-09-09 21:23   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 08/31] x86/resctrl: Clean up domain_remove_cpu_ctrl() Tony Luck
2025-09-09 21:25   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 09/31] x86,fs/resctrl: Use struct rdt_domain_hdr instead of struct rdt_mon_domain Tony Luck
2025-09-09 21:26   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 10/31] x86,fs/resctrl: Rename struct rdt_mon_domain and rdt_hw_mon_domain Tony Luck
2025-09-09 21:26   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 11/31] x86,fs/resctrl: Rename some L3 specific functions Tony Luck
2025-09-09 21:27   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 12/31] fs/resctrl: Make event details accessible to functions when reading events Tony Luck
2025-09-09 22:12   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 13/31] x86,fs/resctrl: Handle events that can be read from any CPU Tony Luck
2025-09-09 22:13   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 14/31] x86,fs/resctrl: Support binary fixed point event counters Tony Luck
2025-09-09 22:13   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 15/31] x86,fs/resctrl: Add an architectural hook called for each mount Tony Luck
2025-09-09 22:17   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 16/31] x86,fs/resctrl: Add and initialize rdt_resource for package scope monitor Tony Luck
2025-08-29 19:33 ` [PATCH v9 17/31] x86/resctrl: Discover hardware telemetry events Tony Luck
2025-09-01  8:39   ` Ilpo Järvinen
2025-09-03 18:12     ` Luck, Tony
2025-09-10  3:39       ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 18/31] x86,fs/resctrl: Fill in details of events for guid 0x26696143 and 0x26557651 Tony Luck
2025-09-01  8:57   ` Ilpo Järvinen
2025-09-10  3:39   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 19/31] x86,fs/resctrl: Add architectural event pointer Tony Luck
2025-09-10  3:40   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 20/31] x86/resctrl: Find and enable usable telemetry events Tony Luck
2025-09-01  8:58   ` Ilpo Järvinen
2025-09-03 18:19     ` Luck, Tony
2025-09-10  3:40       ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 21/31] x86/resctrl: Read " Tony Luck
2025-09-01  9:15   ` Ilpo Järvinen
2025-09-03 18:24     ` Luck, Tony
2025-09-10  3:43       ` Reinette Chatre [this message]
2025-08-29 19:33 ` [PATCH v9 22/31] x86/resctrl: Handle domain creation/deletion for RDT_RESOURCE_PERF_PKG Tony Luck
2025-09-10 15:56   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 23/31] x86/resctrl: Add energy/perf choices to rdt boot option Tony Luck
2025-09-10 15:56   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 24/31] x86/resctrl: Handle number of RMIDs supported by telemetry resources Tony Luck
2025-09-10 15:57   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 25/31] fs/resctrl: Move allocation/free of closid_num_dirty_rmid Tony Luck
2025-09-10 17:55   ` Reinette Chatre
2025-09-11 22:26     ` Luck, Tony
2025-09-12 17:19       ` Luck, Tony
2025-08-29 19:33 ` [PATCH v9 26/31] fs,x86/resctrl: Compute number of RMIDs as minimum across resources Tony Luck
2025-09-10 17:57   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 27/31] fs/resctrl: Move RMID initialization to first mount Tony Luck
2025-09-10 17:58   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 28/31] x86/resctrl: Enable RDT_RESOURCE_PERF_PKG Tony Luck
2025-09-10 17:58   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 29/31] fs/resctrl: Provide interface to create architecture specific debugfs area Tony Luck
2025-09-10 17:58   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 30/31] x86/resctrl: Add debugfs files to show telemetry aggregator status Tony Luck
2025-09-10 17:59   ` Reinette Chatre
2025-08-29 19:33 ` [PATCH v9 31/31] x86,fs/resctrl: Update Documentation for package events Tony Luck
2025-09-10 17:59   ` Reinette Chatre
2025-09-03 18:27 ` [PATCH v9 00/31] x86,fs/resctrl telemetry monitoring Luck, Tony

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=919e104e-aeec-48d7-89bf-8d96ebce7e35@intel.com \
    --to=reinette.chatre@intel.com \
    --cc=Dave.Martin@arm.com \
    --cc=babu.moger@amd.com \
    --cc=dfustini@baylibre.com \
    --cc=fenghuay@nvidia.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=james.morse@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maciej.wieczor-retman@intel.com \
    --cc=patches@lists.linux.dev \
    --cc=peternewman@google.com \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=yu.c.chen@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox