From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB6054D9908 for ; Wed, 16 Sep 2026 23:13:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.14 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789600414; cv=none; b=Qt/+8YDws0ncpvxiJpYd/L1BGu4s5vWzsHk/avNYog/aDYtyc0G/7nz5DoP82L20m6cyFunKwcgXInsRze88KUjUgf7uEsQDxEsTIzicXrRsz/gqfA9eC+LNoK6izL+STE6JxhKQ75t9gxPl5h9PrIWN3CK1nMoTW/axLL2ArlE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789600414; c=relaxed/simple; bh=vMkHeDQIC1JCCg3KkGmer0kIWP3pCj5wuRSLO20edJ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W6y7VoLctYPUQi0ufQvEB1/nXVnqovq9KmPHqTh3yKe4atLDv7xpdn5D0MYqQLln/h0JwCtrf9iEh6+ehWGXGcMTTPbgAlfBc74WtiGOKo3IzO6qLzY2qxZRxlaz1NtP0rG7CZMcp1tLhifybN2NcKgaeFYYVCA6PyyiTsC5y0Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=FYVQwxh2; arc=none smtp.client-ip=198.175.65.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="FYVQwxh2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789600413; x=1821136413; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=vMkHeDQIC1JCCg3KkGmer0kIWP3pCj5wuRSLO20edJ4=; b=FYVQwxh27Cp2AShBurZeLEyrnC0pdMT3gCmQmRKNCXLQ9r+sX3xmVeA5 vCTP60xAOHQKSsub6DOOFOYcQgq9wQxUeXu76galEeao7yzoxBoJbQ+bv Y6XIVVK/wMvTyUWkugvtbH2JJhf9LBvmxVJCezfmu+Ozf959wRLqfx5yt cDAktG4HciJRMRcFEI0Ogg1U1EUI4D5nFL2oCvwrvQdmOLPvDKnoDBXIB B9f6enEda1t4YDdoJ79n8Hwmxs5X74LQ/kV/7P8SPwAwUKC2x3H9pgL8M iaDL17rairUEIeCwSiD7Yo97p0qLlOtu7baMdX5xyi9dP5WDRJdEV/TaZ Q==; X-CSE-ConnectionGUID: RnsyzssCSc+5aRjOYwpH4w== X-CSE-MsgGUID: 1vINy99oSDaEso/IKuaS5A== X-IronPort-AV: E=McAfee;i="6800,10657,11905"; a="93861334" X-IronPort-AV: E=Sophos;i="6.27,103,1787036400"; d="scan'208";a="93861334" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2026 16:13:31 -0700 X-CSE-ConnectionGUID: 7w1MFBkXRbWH3HsfnE/dnQ== X-CSE-MsgGUID: xrsazRYZRVW38TrbM/KBKg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,103,1787036400"; d="scan'208";a="277231430" Received: from khuang2-desk.gar.corp.intel.com (HELO agluck-desk3.home.arpa) ([10.124.223.219]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2026 16:13:31 -0700 From: Tony Luck To: Fenghua Yu , Reinette Chatre , Maciej Wieczor-Retman , Peter Newman , James Morse , Babu Moger , Drew Fustini , Dave Martin , Chen Yu , David E Box , x86@kernel.org Cc: Christoph Hellwig , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Tony Luck Subject: [PATCH v12 03/25] x86/resctrl: Enumerate monitor features in rdt_get_l3_mon_config() Date: Wed, 16 Sep 2026 16:12:58 -0700 Message-ID: <20260916231320.14502-4-tony.luck@intel.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916231320.14502-1-tony.luck@intel.com> References: <20260916231320.14502-1-tony.luck@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The original implementation of Intel Cache QoS Monitoring (CQM) planned to integrate with the "perf" and "cgroup" subsystems. With that plan it made sense for parameters from CPUID to be stored in fields of the cpuinfo_x86 structure. But that plan was abandoned and the resctrl file system user interface replaced it. Change rdt_get_l3_mon_config() to make an explicit cpuid_count() call to enumerate L3 monitoring features in preparation for the removal of resctrl fields from cpuinfo_x86. Signed-off-by: Tony Luck --- v12: Better comment for the cpuid_count() call. s/0xff/GENMASK(7, 0)/ Update commit comment to say that this is in preparation to remove the resctrl elements from boot_cpu_data. --- arch/x86/include/asm/resctrl.h | 9 ++++---- arch/x86/kernel/cpu/resctrl/monitor.c | 32 ++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/resctrl.h b/arch/x86/include/asm/resctrl.h index 8f6edcdcfd87..9bfa9b14002b 100644 --- a/arch/x86/include/asm/resctrl.h +++ b/arch/x86/include/asm/resctrl.h @@ -44,6 +44,7 @@ DECLARE_PER_CPU(struct resctrl_pqr_state, pqr_state); extern bool rdt_alloc_capable; extern bool rdt_mon_capable; +extern unsigned int __ro_after_init rdt_l3_mon_scale; DECLARE_STATIC_KEY_FALSE(rdt_enable_key); DECLARE_STATIC_KEY_FALSE(rdt_alloc_enable_key); @@ -132,11 +133,9 @@ 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; - - /* h/w works in units of "boot_cpu_data.x86_cache_occ_scale" */ - val /= scale; - return val * scale; + /* Round down to nearest h/w monitoring unit */ + val /= rdt_l3_mon_scale; + return val * rdt_l3_mon_scale; } static inline void resctrl_arch_set_cpu_default_closid_rmid(int cpu, u32 closid, diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 3838e0a13d36..89b83cc7e800 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -32,6 +32,11 @@ */ bool rdt_mon_capable; +/* + * Scale factor to convert L3 monitor events to bytes. + */ +unsigned int __ro_after_init rdt_l3_mon_scale; + #define CF(cf) ((unsigned long)(1048576 * (cf) + 0.5)) static int snc_nodes_per_l3_cache = 1; @@ -418,16 +423,37 @@ static __init int snc_get_config(void) int __init rdt_get_l3_mon_config(struct rdt_resource *r) { - unsigned int mbm_offset = boot_cpu_data.x86_cache_mbm_width_offset; struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r); + unsigned int mbm_offset; unsigned int threshold; u32 eax, ebx, ecx, edx; + u32 num_rmid; + + /* Resource monitoring leaf is 0xf. L3 monitoring details in subleaf 1 */ + cpuid_count(0xf, 1, &eax, &ebx, &ecx, &edx); + mbm_offset = eax & GENMASK(7, 0); + rdt_l3_mon_scale = ebx; + num_rmid = ecx + 1; + + if (!mbm_offset) { + switch (boot_cpu_data.x86_vendor) { + case X86_VENDOR_AMD: + mbm_offset = MBM_CNTR_WIDTH_OFFSET_AMD; + break; + case X86_VENDOR_HYGON: + mbm_offset = MBM_CNTR_WIDTH_OFFSET_HYGON; + break; + default: + /* Leave mbm_offset as 0 */ + break; + } + } snc_nodes_per_l3_cache = snc_get_config(); 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; - r->mon.num_rmid = (boot_cpu_data.x86_cache_max_rmid + 1) / snc_nodes_per_l3_cache; + hw_res->mon_scale = rdt_l3_mon_scale / snc_nodes_per_l3_cache; + r->mon.num_rmid = num_rmid / snc_nodes_per_l3_cache; hw_res->mbm_width = MBM_CNTR_WIDTH_BASE; if (mbm_offset > 0 && mbm_offset <= MBM_CNTR_WIDTH_OFFSET_MAX) -- 2.55.0