lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8f97f875-f032-4a87-9b37-9dbae2537b6a@intel.com>
Date: Wed, 22 Oct 2025 21:17:54 -0700
From: Reinette Chatre <reinette.chatre@...el.com>
To: Tony Luck <tony.luck@...el.com>, Fenghua Yu <fenghuay@...dia.com>, "Maciej
 Wieczor-Retman" <maciej.wieczor-retman@...el.com>, Peter Newman
	<peternewman@...gle.com>, James Morse <james.morse@....com>, Babu Moger
	<babu.moger@....com>, Drew Fustini <dfustini@...libre.com>, Dave Martin
	<Dave.Martin@....com>, Chen Yu <yu.c.chen@...el.com>
CC: <x86@...nel.org>, <linux-kernel@...r.kernel.org>,
	<patches@...ts.linux.dev>
Subject: Re: [PATCH v12 06/31] x86,fs/resctrl: Use struct rdt_domain_hdr when
 reading counters

Hi Tony,

On 10/13/25 3:33 PM, Tony Luck wrote:
> struct rmid_read contains data passed around to read event counts. Use the
> generic domain header struct rdt_domain_hdr in struct rmid_read in order to
> support other telemetry events' domains besides an L3 one. Adjust the code

"telemetry events" -> "monitoring events"?

> interacting with it to the new struct layout.

How does this justify the changes to resctrl_arch_rmid_read() and 
resctrl_arch_cntr_read()? If these functions really needed to be changed in
support of the change to struct rmid_read then resctrl_arch_reset_cntr()
and resctrl_arch_reset_rmid() would need to be changed also, no? All four of
these functions are called in the same way before this change but this patch
inconsistently changes the calling convention of only two of them without any motivation.

Seems like the resctrl_arch_rmid_read() change is sneaked in to support later
reading of telemetry events while the change to resctrl_arch_cntr_read() is a
remnant of a previous version of code in support of telemetry events?

> 
> Signed-off-by: Tony Luck <tony.luck@...el.com>
> ---
>  include/linux/resctrl.h               |  8 +++---
>  fs/resctrl/internal.h                 | 18 +++++++------
>  arch/x86/kernel/cpu/resctrl/monitor.c | 20 +++++++++++---
>  fs/resctrl/ctrlmondata.c              |  9 +------
>  fs/resctrl/monitor.c                  | 38 ++++++++++++++++++---------
>  5 files changed, 56 insertions(+), 37 deletions(-)
> 
> diff --git a/include/linux/resctrl.h b/include/linux/resctrl.h
> index 0b55809af5d7..0fef3045cac3 100644
> --- a/include/linux/resctrl.h
> +++ b/include/linux/resctrl.h
> @@ -514,7 +514,7 @@ void resctrl_offline_cpu(unsigned int cpu);
>   * resctrl_arch_rmid_read() - Read the eventid counter corresponding to rmid
>   *			      for this resource and domain.
>   * @r:			resource that the counter should be read from.
> - * @d:			domain that the counter should be read from.
> + * @hdr:		Header of domain that the counter should be read from.
>   * @closid:		closid that matches the rmid. Depending on the architecture, the
>   *			counter may match traffic of both @closid and @rmid, or @rmid
>   *			only.
> @@ -535,7 +535,7 @@ void resctrl_offline_cpu(unsigned int cpu);
>   * Return:
>   * 0 on success, or -EIO, -EINVAL etc on error.
>   */
> -int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,
> +int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain_hdr *hdr,
>  			   u32 closid, u32 rmid, enum resctrl_event_id eventid,
>  			   u64 *val, void *arch_mon_ctx);
>  

This change is not related to a change to struct rmid_read.

> @@ -630,7 +630,7 @@ void resctrl_arch_config_cntr(struct rdt_resource *r, struct rdt_mon_domain *d,
>   *			      assigned to the RMID, event pair for this resource
>   *			      and domain.
>   * @r:		Resource that the counter should be read from.
> - * @d:		Domain that the counter should be read from.
> + * @hdr:	Header of domain that the counter should be read from.
>   * @closid:	CLOSID that matches the RMID.
>   * @rmid:	The RMID to which @cntr_id is assigned.
>   * @cntr_id:	The counter to read.
> @@ -644,7 +644,7 @@ void resctrl_arch_config_cntr(struct rdt_resource *r, struct rdt_mon_domain *d,
>   * Return:
>   * 0 on success, or -EIO, -EINVAL etc on error.
>   */
> -int resctrl_arch_cntr_read(struct rdt_resource *r, struct rdt_mon_domain *d,
> +int resctrl_arch_cntr_read(struct rdt_resource *r, struct rdt_domain_hdr *hdr,
>  			   u32 closid, u32 rmid, int cntr_id,
>  			   enum resctrl_event_id eventid, u64 *val);
>  

Same with this change.



...

> diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c
> index 4076336fbba6..521f78f42f07 100644
> --- a/fs/resctrl/monitor.c
> +++ b/fs/resctrl/monitor.c
> @@ -159,7 +159,7 @@ void __check_limbo(struct rdt_mon_domain *d, bool force_free)
>  			break;
>  
>  		entry = __rmid_entry(idx);
> -		if (resctrl_arch_rmid_read(r, d, entry->closid, entry->rmid,
> +		if (resctrl_arch_rmid_read(r, &d->hdr, entry->closid, entry->rmid,
>  					   QOS_L3_OCCUP_EVENT_ID, &val,
>  					   arch_mon_ctx)) {
>  			rmid_dirty = true;
> @@ -425,7 +425,11 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
>  	u64 tval = 0;
>  
>  	if (rr->is_mbm_cntr) {
> -		cntr_id = mbm_cntr_get(rr->r, rr->d, rdtgrp, rr->evtid);
> +		if (!rr->hdr || !domain_header_is_valid(rr->hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
> +			return -EINVAL;

I do not think returning an error directly is a pattern that should continue. This
error is dropped by caller while rmid_read::err is what continues on. This can be
something like:
			rr->err = -EIO;
			return -EINVAL;

> +		d = container_of(rr->hdr, struct rdt_mon_domain, hdr);
> +
> +		cntr_id = mbm_cntr_get(rr->r, d, rdtgrp, rr->evtid);
>  		if (cntr_id < 0) {
>  			rr->err = -ENOENT;
>  			return -EINVAL;
> @@ -433,25 +437,29 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
>  	}
>  
>  	if (rr->first) {
> +		if (!rr->hdr || !domain_header_is_valid(rr->hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
> +			return -EINVAL;

Same here .

> +		d = container_of(rr->hdr, struct rdt_mon_domain, hdr);
> +
>  		if (rr->is_mbm_cntr)
> -			resctrl_arch_reset_cntr(rr->r, rr->d, closid, rmid, cntr_id, rr->evtid);
> +			resctrl_arch_reset_cntr(rr->r, 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);
> +			resctrl_arch_reset_rmid(rr->r, d, closid, rmid, rr->evtid);
> +		m = get_mbm_state(d, closid, rmid, rr->evtid);
>  		if (m)
>  			memset(m, 0, sizeof(struct mbm_state));
>  		return 0;
>  	}
>  
> -	if (rr->d) {
> +	if (rr->hdr) {
>  		/* Reading a single domain, must be on a CPU in that domain. */
> -		if (!cpumask_test_cpu(cpu, &rr->d->hdr.cpu_mask))
> +		if (!cpumask_test_cpu(cpu, &rr->hdr->cpu_mask))
>  			return -EINVAL;
>  		if (rr->is_mbm_cntr)
> -			rr->err = resctrl_arch_cntr_read(rr->r, rr->d, closid, rmid, cntr_id,
> +			rr->err = resctrl_arch_cntr_read(rr->r, rr->hdr, closid, rmid, cntr_id,
>  							 rr->evtid, &tval);
>  		else
> -			rr->err = resctrl_arch_rmid_read(rr->r, rr->d, closid, rmid,
> +			rr->err = resctrl_arch_rmid_read(rr->r, rr->hdr, closid, rmid,
>  							 rr->evtid, &tval, rr->arch_mon_ctx);
>  		if (rr->err)
>  			return rr->err;
> @@ -477,10 +485,10 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
>  		if (d->ci_id != rr->ci->id)
>  			continue;
>  		if (rr->is_mbm_cntr)
> -			err = resctrl_arch_cntr_read(rr->r, d, closid, rmid, cntr_id,
> +			err = resctrl_arch_cntr_read(rr->r, &d->hdr, closid, rmid, cntr_id,
>  						     rr->evtid, &tval);
>  		else
> -			err = resctrl_arch_rmid_read(rr->r, d, closid, rmid,
> +			err = resctrl_arch_rmid_read(rr->r, &d->hdr, closid, rmid,
>  						     rr->evtid, &tval, rr->arch_mon_ctx);
>  		if (!err) {
>  			rr->val += tval;
> @@ -511,9 +519,13 @@ static void mbm_bw_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
>  	u64 cur_bw, bytes, cur_bytes;
>  	u32 closid = rdtgrp->closid;
>  	u32 rmid = rdtgrp->mon.rmid;
> +	struct rdt_mon_domain *d;
>  	struct mbm_state *m;
>  
> -	m = get_mbm_state(rr->d, closid, rmid, rr->evtid);
> +	if (!domain_header_is_valid(rr->hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
> +		return;
> +	d = container_of(rr->hdr, struct rdt_mon_domain, hdr);
> +	m = get_mbm_state(d, closid, rmid, rr->evtid);
>  	if (WARN_ON_ONCE(!m))
>  		return;
>  
> @@ -686,7 +698,7 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_mon_domain *
>  	struct rmid_read rr = {0};
>  
>  	rr.r = r;
> -	rr.d = d;
> +	rr.hdr = &d->hdr;
>  	rr.evtid = evtid;
>  	if (resctrl_arch_mbm_cntr_assign_enabled(r)) {
>  		rr.is_mbm_cntr = true;

Reinette

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ