From b5f8ba07ccd1633bbc0d7d34f0e51ac8386dd062 Mon Sep 17 00:00:00 2001 From: Xiaochen Shen Date: Tue, 11 Nov 2025 10:57:01 +0800 Subject: [PATCH] x86/resctrl: Fix memory bandwidth counter width for Hygon CPUs The memory bandwidth calculation relies on reading the hardware counter and measuring the delta between samples. To ensure accurate measurement, the software reads the counter frequently enough to prevent it from rolling over twice between reads. The default base counter width is 24. Currently, Hygon CPUs do not support the CPUID 0xF.[ECX=1]:EAX to adjust the counter width. But the Hygon CPUs support wider bandwidth counter with the default width of 32 bits. Fix the issue by setting the default width to 32 bits (adjusting the offset to 8 bits) for Hygon CPUs. Hygon-SIG: commit none hygon x86/resctrl: Fix memory bandwidth counter width for Hygon CPUs Fixes: 266645df160e ("x86/resctrl: Add Hygon QoS support") Signed-off-by: Xiaochen Shen --- arch/x86/kernel/cpu/resctrl/core.c | 17 +++++++++++++---- arch/x86/kernel/cpu/resctrl/internal.h | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c index d9f945186d0a..b4f19ae107df 100644 --- a/arch/x86/kernel/cpu/resctrl/core.c +++ b/arch/x86/kernel/cpu/resctrl/core.c @@ -1076,10 +1076,19 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c) c->x86_cache_occ_scale = ebx; c->x86_cache_mbm_width_offset = eax & 0xff; - if ((c->x86_vendor == X86_VENDOR_AMD || - c->x86_vendor == X86_VENDOR_HYGON) && - !c->x86_cache_mbm_width_offset) - c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_AMD; + if (!c->x86_cache_mbm_width_offset) { + switch (c->x86_vendor) { + case X86_VENDOR_AMD: + c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_AMD; + break; + case X86_VENDOR_HYGON: + c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_HYGON; + break; + default: + /* Leave c->x86_cache_mbm_width_offset as 0 */ + break; + } + } } } diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h index 955999aecfca..168962166a91 100644 --- a/arch/x86/kernel/cpu/resctrl/internal.h +++ b/arch/x86/kernel/cpu/resctrl/internal.h @@ -23,6 +23,9 @@ #define MBA_IS_LINEAR 0x4 #define MBM_CNTR_WIDTH_OFFSET_AMD 20 +/* Hygon MBM counter width as an offset from MBM_CNTR_WIDTH_BASE */ +#define MBM_CNTR_WIDTH_OFFSET_HYGON 8 + #define RMID_VAL_ERROR BIT_ULL(63) #define RMID_VAL_UNAVAIL BIT_ULL(62) /* -- Gitee