mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Reinette Chatre <reinette.chatre@intel.com>
To: Chen Yu <yu.c.chen@intel.com>, <tony.luck@intel.com>
Cc: <tglx@kernel.org>, <bp@alien8.de>, <mingo@redhat.com>,
	<dave.hansen@linux.intel.com>, <hpa@zytor.com>,
	<fenghuay@nvidia.com>, <babu.moger@amd.com>,
	<hongyu.ning@intel.com>, <chen.yu@linux.dev>, <x86@kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v9 07/12] x86/resctrl: Add a global ERDT monitor scale
Date: Fri, 23 Oct 2026 17:02:05 -0700	[thread overview]
Message-ID: <4e594656-b883-47c3-975c-087d10b98c74@intel.com> (raw)
In-Reply-To: <ec2671aec51023ffacc8bd265a57f7aa09195d23.1791933001.git.yu.c.chen@intel.com>

Hi Chenyu,

On 10/13/26 7:59 PM, Chen Yu wrote:
> The limbo handler polls the LLC occupancy of stale RMIDs and frees an RMID

"stale RMIDs"? This is a new concept unfamiliar to resctrl.

> once its occupancy drops below max_threshold_occupancy. User space writes

Please do not interchangeably use the name of the resctrl file and the variable
that backs it because the variable that backs the file may not have the value
that user space wrote to the file.

> that threshold in bytes, but the hardware counts occupancy in units of the
> occupancy scale, so the threshold is rounded down to a multiple of that
> scale. The scale is the number of bytes one counter unit represents, i.e.

This does not sound right, the threshold is explicitly noted as:
 	"This is the threshold cache occupancy in *bytes* ..."

> the granularity of the occupancy counter.
> 
> ERDT may provide per-domain monitoring scale factors, but resctrl rounds
> max_threshold_occupancy through a single global
> resctrl_rmid_realloc_threshold value that is visible to user space.
> 
> Prepare for that by adding erdt_scale/erdt_get_scale() and teaching

"Prepare for that" - Prepare for what?

> resctrl_arch_round_mon_val() to consult the ERDT scale when firmware has
> populated one.
> 
> When CMRC parsing provides per-domain up_scale values, erdt_scale will be
> updated with max(). The reason to use max is because rounding is a floor:
> a larger scale yields a slightly lower threshold, i.e. an RMID has to
> drop to a slightly lower occupancy before it is reused.
> 
> For now erdt_scale is intentionally left at its default value of 0.

This is a clear signal that the patch ordering needs to change.

> 
> Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Chen Yu <yu.c.chen@intel.com>
> ---
> Changes since v8:
> - New patch. erdt_scale and erdt_get_scale() were introduced inside
>   "x86/resctrl: Parse ACPI CMRC table" without any mention in its
>   changelog. Split them out and describe why a single global scale is
>   used. (Reinette Chatre)
> - Reword the erdt_scale comment: it is not used by the limbo handler.
>   (Reinette Chatre)
> 
>  arch/x86/kernel/cpu/resctrl/erdt.c     | 16 ++++++++++++++++
>  arch/x86/kernel/cpu/resctrl/internal.h |  1 +
>  arch/x86/kernel/cpu/resctrl/monitor.c  |  5 ++++-
>  3 files changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kernel/cpu/resctrl/erdt.c b/arch/x86/kernel/cpu/resctrl/erdt.c
> index d4b630358d6d..09072e478bde 100644
> --- a/arch/x86/kernel/cpu/resctrl/erdt.c
> +++ b/arch/x86/kernel/cpu/resctrl/erdt.c
> @@ -38,6 +38,22 @@ static u16 first_rmdd_domain_id;
>   */
>  static unsigned int erdt_max_rmid;
>  
> +/*
> + * Used only to round the global resctrl_rmid_realloc_threshold for the limbo
> + * handler. resctrl_rmid_realloc_threshold is exposed to user space as a single
> + * global value, so ERDT uses one scale derived from the per-domain
> + * cmrc->up_scale values. max() keeps this single threshold conservative across
> + * domains because the rounding is a floor: a larger scale yields a slightly
> + * lower threshold, i.e. an RMID has to drop to a slightly lower occupancy
> + * before it is reused.

This documents changes that do not exist at this point in series. Please reorder
this patch to ensure its dependencies land first.

> + */
> +static unsigned int erdt_scale;
> +
> +unsigned int erdt_get_scale(void)
> +{
> +	return erdt_scale;

The name and usage implies that this is a global scale. This will become more confusing
when trying to land the memory bandwidth monitoring changes that have separate scale values.

Having this change pretend it is a global change and then add a snippet to final
patch to constrain it with a "if (!erdt_cpu_has(X86_FEATURE_CQM_OCCUP_LLC))" just makes
this work difficult to consume. 

If this is specific to the CMT scale only then let the global variable and its accessor
make that obvious. Let this change land after the CMRC parsing and erdt_cpu_has()
introduction so that it can be introduced as one coherent change.

> +}
> +
>  static void __iomem *erdt_ioremap(resource_size_t base, u32 num_pages, const char *desc)
>  {
>  	void __iomem *addr;
> diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h
> index 48aa64c1ff96..75dd4736937d 100644
> --- a/arch/x86/kernel/cpu/resctrl/internal.h
> +++ b/arch/x86/kernel/cpu/resctrl/internal.h
> @@ -284,6 +284,7 @@ static inline void intel_aet_mon_domain_setup(int cpu, int id, struct rdt_resour
>  static inline bool intel_handle_aet_option(bool force_off, char *tok) { return false; }
>  #endif
>  
> +unsigned int erdt_get_scale(void);
>  void erdt_init(void);
>  void erdt_exit(void);
>  bool erdt_try_bind_cpu(int cpu);
> diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
> index e42ee2769a39..f1a28a3c81bc 100644
> --- a/arch/x86/kernel/cpu/resctrl/monitor.c
> +++ b/arch/x86/kernel/cpu/resctrl/monitor.c
> @@ -423,7 +423,10 @@ __init void resctrl_arch_update_snc(void)
>  
>  unsigned int resctrl_arch_round_mon_val(unsigned int val)
>  {
> -	unsigned int scale = boot_cpu_data.x86_cache_occ_scale;
> +	unsigned int scale = erdt_get_scale();
> +
> +	if (!scale)
> +		scale = boot_cpu_data.x86_cache_occ_scale;
>  
>  	/* h/w works in units of "boot_cpu_data.x86_cache_occ_scale" */

The fixup of this comment found in patch #12 needs to be squashed here.

Reinette




  reply	other threads:[~2026-10-24  0:02 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-14  2:56 [PATCH v9 00/12] Introduce MMIO-based CMT access for Enhanced RDT Chen Yu
2026-10-14  2:57 ` [PATCH v9 01/12] x86/topology: Export topo_lookup_cpuid() for resctrl use Chen Yu
2026-10-14  2:58 ` [PATCH v9 02/12] x86/resctrl: Require 64-bit x86 for resctrl support Chen Yu
2026-10-23 23:46   ` Reinette Chatre
2026-10-14  2:58 ` [PATCH v9 03/12] x86/resctrl: Parse ACPI ERDT table and save CACD cpumask per RMD Chen Yu
2026-10-23 23:50   ` Reinette Chatre
2026-10-14  2:58 ` [PATCH v9 04/12] x86/resctrl: Do not enable ERDT when Sub-NUMA Cluster is enabled Chen Yu
2026-10-23 23:54   ` Reinette Chatre
2026-10-14  2:58 ` [PATCH v9 05/12] x86/resctrl: Attach ACPI ERDT information to L3 mon domain on CPU online Chen Yu
2026-10-23 23:57   ` Reinette Chatre
2026-10-24  0:37     ` Reinette Chatre
2026-10-14  2:59 ` [PATCH v9 06/12] x86,fs/resctrl: Move resctrl_arch_round_mon_val() out of line Chen Yu
2026-10-23 23:59   ` Reinette Chatre
2026-10-14  2:59 ` [PATCH v9 07/12] x86/resctrl: Add a global ERDT monitor scale Chen Yu
2026-10-24  0:02   ` Reinette Chatre [this message]
2026-10-14  2:59 ` [PATCH v9 08/12] x86/resctrl: Parse ACPI CMRC table Chen Yu
2026-10-14  3:00 ` [PATCH v9 09/12] x86/resctrl: Refactor the monitor read function Chen Yu
2026-10-14  3:00 ` [PATCH v9 10/12] fs/resctrl: Do not invoke smp_processor_id() in preemptible context Chen Yu
2026-10-14  3:00 ` [PATCH v9 11/12] x86/resctrl: Introduce erdt_cpu_has() and erdt_support() Chen Yu
2026-10-14  3:01 ` [PATCH v9 12/12] x86/resctrl: Add MMIO-based LLC occupancy monitoring support Chen Yu
2026-10-24  0:08   ` Reinette Chatre
2026-10-19 12:45 ` [PATCH v9 00/12] Introduce MMIO-based CMT access for Enhanced RDT Chen Yu

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=4e594656-b883-47c3-975c-087d10b98c74@intel.com \
    --to=reinette.chatre@intel.com \
    --cc=babu.moger@amd.com \
    --cc=bp@alien8.de \
    --cc=chen.yu@linux.dev \
    --cc=dave.hansen@linux.intel.com \
    --cc=fenghuay@nvidia.com \
    --cc=hongyu.ning@intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@kernel.org \
    --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

all inboxes | Powered by JetHome®