The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: "Chen, Yu C" <yu.c.chen@intel.com>
To: Reinette Chatre <reinette.chatre@intel.com>
Cc: <tony.luck@intel.com>, <tglx@kernel.org>, <bp@alien8.de>,
	<mingo@redhat.com>, <dave.hansen@linux.intel.com>,
	<hpa@zytor.com>, <fenghuay@nvidia.com>, <babu.moger@amd.com>,
	<chen.yu@linux.dev>, <x86@kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v6 9/9] x86/resctrl: Add MMIO-based LLC occupancy monitoring support
Date: Wed, 26 Aug 2026 00:11:28 +0800	[thread overview]
Message-ID: <7cb2f870-1358-467e-9406-80ec41d8a8c0@intel.com> (raw)
In-Reply-To: <9c33a763-e39f-45e1-a6b7-297dc79263f7@intel.com>

Hi Reinette,

On 8/20/2026 7:10 AM, Reinette Chatre wrote:
> Hi Chenyu,
> 
> On 7/25/26 2:23 AM, Chen Yu wrote:
>> Add erdt_mon_read() to read LLC occupancy via MMIO and use it when
>> the platform supports ERDT. Register the L3 occupancy event with
>> ERDT enabled when available, falling back to the MSR-based path
>> otherwise.
>>
>> Use the CMRC (Cache Monitoring Registers for CPU Agents Description)
>> ACPI sub-table to read LLC occupancy counters for each RMID via MMIO
>> when ERDT is enabled. This CMRC information is stored in the
>> rdt_hw_l3_mon_domain, which could be accessed directly.
> 
> Please write in imperative tone.
> 

OK, let me try to rewrite it(I suppose you were refereeing to:
This CMRC information is stored -> Store the CMRC information)

>>
>> Currently, the per-domain limbo handler is still in use. There is no need
>> to switch to a global limbo handler, because even after such a switch, the
>> worker thread would still have to iterate through all domains one by one.
>> The per-domain handler already accomplishes this using a worker thread rather
>> than costly IPIs, so there is no clear benefit to switching to a global handler.
> 
> Could you please elaborate how a global limbo handler would require IPIs?
> 

The global limbo handler does not require IPIs. Previously, I wondered 
what the
benefit would be of switching from a per-domain limbo handler to a 
global one.

per-domain handler:
N workers, each worker calculates the current occupancy of that domain
for a rmid. If the occupancy of all the domains drops below the threshold,
recycle that rmid. No IPI involved.

global handler:
One worker iterates over every domain. If the occupancy of all domains 
drops
below the threshold, it recycles the RMID - with no IPI involved.

For both the per-domain and the global handler, no IPI is involved, and
we still have to iterate over every domain. So it seems that there is 
not much
benefit in switching to the global handler, IIUC.

>> diff --git a/arch/x86/include/asm/resctrl.h b/arch/x86/include/asm/resctrl.h
>> index 5491853113dd..0948f64856ef 100644
>> --- a/arch/x86/include/asm/resctrl.h
>> +++ b/arch/x86/include/asm/resctrl.h
>> @@ -132,7 +132,13 @@ static inline void __resctrl_sched_in(struct task_struct *tsk)
>>   
>>   static inline unsigned int resctrl_arch_round_mon_val(unsigned int val)
>>   {
>> -	unsigned int scale = boot_cpu_data.x86_cache_occ_scale;
>> +	unsigned int scale = boot_cpu_data.x86_cache_occ_scale, escale;
> 
> related to earlier topic, "scale" being unsigned int is ok since
> x86_cache_occ_scale is initialized from 32bits. As I understand it the
> ERDT scale value is initialized from 64 bits instead so the existing
> types do not seem to accommodate?
> 

As you mentioned in another thread, there seems to be an inconsistency
in the spec, I'll check with the team.

>>   
>> @@ -39,6 +43,9 @@ static int erdt_scale;
>>   
>>   bool erdt_support(int flag)
>>   {
>> +	if (flag == X86_FEATURE_CQM_OCCUP_LLC)
>> +		return valid_subtbl_mask & BIT(ACPI_ERDT_TYPE_CMRC);
>> +
> 
> Is the plan to keep adding more if() statements as new flags need to be tested?
> 
> 

Yes. For example, to also support MBM:

  	if (flag == X86_FEATURE_CQM_OCCUP_LLC)
  		return valid_subtbl_mask & BIT(ACPI_ERDT_TYPE_CMRC);

	if (flag == X86_FEATURE_CQM_MBM_TOTAL)
		return valid_subtbl_mask & BIT(ACPI_ERDT_TYPE_MMRC);

  	return false;
  }

>> @@ -430,12 +434,15 @@ int __init rdt_get_l3_mon_config(struct rdt_resource *r)
>>   	struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
>>   	unsigned int threshold;
>>   	u32 eax, ebx, ecx, edx;
>> +	int max_rmid;
>>   
>>   	snc_nodes_per_l3_cache = snc_get_config();
>>   
>> +	max_rmid = erdt_cpu_has(X86_FEATURE_CQM_OCCUP_LLC) ?
>> +						erdt_get_max_rmid() : boot_cpu_data.x86_cache_max_rmid;
> 
> This does not look right. Wouldn't this use the ERDT supported RMID for the MBM events also
> even though they are read via MSR?
> 

Got it, this is a bug that might impact the MBM. Let me use min() to get
the minimal rmid between the erdt and the legacy one.

>>   	resctrl_rmid_realloc_limit = boot_cpu_data.x86_cache_size * 1024;
>>   	hw_res->mon_scale = boot_cpu_data.x86_cache_occ_scale / snc_nodes_per_l3_cache;
> 
> Should the scale used by ERDT also be adjusted when SNC enabled?
> 

My understanding is that the reason hw_res->mon_scale is divided by
snc_nodes_per_l3_cache is that one LLC is composed of several SNC nodes.
Therefore, when we sum up the monitor data from all SNC domains, we need
to scale down mon_scale per domain to avoid "over-counting". For the 
platform
on which we are enabling MMIO-based CMT, I am not sure whether SNC will be
supported. But we can still adjust the scale for each SNC configuration to
ensure future compatibility. Let me change the code.

thanks,
Chenyu

  reply	other threads:[~2026-08-25 16:11 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-25  9:20 [PATCH v6 0/9] Introduce MMIO-based CMT access for Enhanced RDT Chen Yu
2026-07-25  9:22 ` [PATCH v6 1/9] x86/topology: Export topo_lookup_cpuid() for resctrl use Chen Yu
2026-08-19 22:55   ` Reinette Chatre
2026-08-22  4:16     ` Chen Yu
2026-07-25  9:22 ` [PATCH v6 2/9] x86/resctrl: Require 64-bit x86 for resctrl support Chen Yu
2026-08-19 22:55   ` Reinette Chatre
2026-08-20 15:20     ` Luck, Tony
2026-08-20 15:54       ` Reinette Chatre
2026-08-20 17:01         ` Luck, Tony
2026-08-20 17:12           ` Dave Hansen
2026-08-20 17:48             ` Reinette Chatre
2026-08-21  2:37               ` Borislav Petkov
2026-08-21 15:47                 ` Reinette Chatre
2026-08-21 15:54                   ` Borislav Petkov
2026-08-25 13:12                   ` Chen Yu
2026-08-24 14:18                     ` Dave Hansen
2026-08-24 15:15                       ` Chen, Yu C
2026-08-25  2:40                       ` Borislav Petkov
2026-08-21 11:28             ` Peter Zijlstra
2026-08-21 15:52               ` Borislav Petkov
2026-08-21 16:58                 ` Luck, Tony
2026-08-22  0:04                   ` Borislav Petkov
2026-07-25  9:22 ` [PATCH v6 3/9] x86/resctrl: Parse ACPI ERDT table and save CACD cpumask for RMDD domains Chen Yu
2026-08-19 23:01   ` Reinette Chatre
2026-08-25  8:06     ` Chen Yu
2026-08-24 15:54       ` Reinette Chatre
2026-08-25 16:18         ` Chen, Yu C
2026-07-25  9:23 ` [PATCH v6 4/9] x86/resctrl: Attach ACPI ERDT information to L3 mon domain on CPU online Chen Yu
2026-08-19 23:04   ` Reinette Chatre
2026-08-25  5:54     ` Chen, Yu C
2026-07-25  9:23 ` [PATCH v6 5/9] x86/resctrl: Parse ACPI CMRC table Chen Yu
2026-08-19 23:06   ` Reinette Chatre
2026-08-25  9:19     ` Chen, Yu C
2026-08-25 15:39       ` Reinette Chatre
2026-08-25 16:11         ` Chen, Yu C
2026-08-25 16:38           ` Luck, Tony
2026-07-25  9:23 ` [PATCH v6 6/9] x86/resctrl: Refactor the monitor read function Chen Yu
2026-08-19 23:07   ` Reinette Chatre
2026-08-25 10:03     ` Chen, Yu C
2026-07-25  9:23 ` [PATCH v6 7/9] fs/resctrl: Do not invoke smp_processor_id() in preemptible context Chen Yu
2026-08-19 23:08   ` Reinette Chatre
2026-08-25 11:17     ` Chen, Yu C
2026-07-25  9:23 ` [PATCH v6 8/9] x86/resctrl: Introduce erdt_cpu_has() and erdt_support() Chen Yu
2026-08-19 23:08   ` Reinette Chatre
2026-08-25 11:55     ` Chen, Yu C
2026-07-25  9:23 ` [PATCH v6 9/9] x86/resctrl: Add MMIO-based LLC occupancy monitoring support Chen Yu
2026-08-19 23:10   ` Reinette Chatre
2026-08-25 16:11     ` Chen, Yu C [this message]
2026-08-25 17:10       ` Reinette Chatre
2026-08-13  6:43 ` [PATCH v6 0/9] 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=7cb2f870-1358-467e-9406-80ec41d8a8c0@intel.com \
    --to=yu.c.chen@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=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=reinette.chatre@intel.com \
    --cc=tglx@kernel.org \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox