From nobody Fri Apr 3 00:00:13 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (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 CC6183ED5B0 for ; Wed, 25 Mar 2026 17:19:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774459173; cv=none; b=HBg67d/PvQXqIC3M7XwujonQ/ANH0hK/nFWibJT0ogosxB2aeah0sHo3IfqkAbIH3/fC+A2/+h+wSdpWiwC2gDKNR3Az3d3GiLM24xRJs1HUgLE+VKrQKr+hRS1CSq9wCwCbidcmmrRXArpdGcMuvornRWRxp/hp9td+NsNgmK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774459173; c=relaxed/simple; bh=7S/qmWAAQZ0EoEp34hiHh1aj0O2tEpezcTB+e6k+xR8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ESZAPdprrwpVIXTlYxtnBRREda8Bpwpd0xajGlreFqnUAD83DiFOaMy8HY4dLgv8v6NsYUVKWTBpiPE4POKoHXkX6JbPwe4tUhAqjDuGno1PhOzMN1HCzlalp5eXq92Gqn9mjk1ctRFQfIWzU1Wtcwe747fuSBKJLzH67t45otY= 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=P40tKvEZ; arc=none smtp.client-ip=198.175.65.17 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="P40tKvEZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1774459172; x=1805995172; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7S/qmWAAQZ0EoEp34hiHh1aj0O2tEpezcTB+e6k+xR8=; b=P40tKvEZJti8+oK4fvmzSXFWbKWaUlUzllWIMJuOm1kxPfpSsAWlWkNp BO+1GkNGOIp6orjb14do6QflZTjJ/OuAQpO6XfDuCB5gLHFn9cFz+3VvL 7sIAt6zDUA+jM2yCdvCAwEM9DxKID/zL44+9x6EoV55p8eTvlX47/pFSU 2aYmxtYdzo8N3EaSM9JuKsqjNsLgM7s8w2aFyDFZa/x8P9tfuPxiNjxr+ LTM452WHlDywUxuyu+9Dj/RtjdLaemzP4LTTPEHHuabwEScR4mqqRDT0O T9syBzl8HirR8r6gMNFdB2DPXf91CKDk/QdRGd2rD5h9WJou3LWyeIWln Q==; X-CSE-ConnectionGUID: +EFuXdxVTrqMaiB9hpUvjQ== X-CSE-MsgGUID: OGjpxvC1QVa1zQwRy6qviA== X-IronPort-AV: E=McAfee;i="6800,10657,11740"; a="75467528" X-IronPort-AV: E=Sophos;i="6.23,140,1770624000"; d="scan'208";a="75467528" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2026 10:19:29 -0700 X-CSE-ConnectionGUID: ACO+MEg3SISv59ea+wWIkQ== X-CSE-MsgGUID: u1hR6V/3RGaJC+Phd32O9g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,140,1770624000"; d="scan'208";a="224697829" Received: from rosenzwe-mobl1.amr.corp.intel.com (HELO agluck-desk3.home.arpa) ([10.124.221.183]) by orviesa009-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2026 10:19:28 -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: linux-kernel@vger.kernel.org, patches@lists.linux.dev, Tony Luck Subject: [PATCH v2] x86/resctrl: Allow AET to use PMT/TPMI as loadable modules Date: Wed, 25 Mar 2026 10:17:38 -0700 Message-ID: <20260325171738.12207-1-tony.luck@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260323163452.25044-1-tony.luck@intel.com> References: <20260323163452.25044-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: quoted-printable Content-Type: text/plain; charset="utf-8" The resctrl subsystem is always built into the base kernel. Currently, enumerating Application Event Tracing (AET) features requires functions from INTEL_PMT_TELEMETRY and INTEL_TPMI. Because resctrl makes direct calls to these functions, it enforces a strict dependency requiring both PMT and TPMI to be built-in. This is overly restrictive. Use the symbol_get() mechanism to allow resctrl to resolve these symbols at runtime, whether they reside in the base kernel or in loadable modules. Update the exports for intel_pmt_get_regions_by_feature() and intel_pmt_put_feature_group() to be accessible via symbol_get(). Replace the direct calls with indirect calls using function pointers. Finally, adjust the Kconfig dependencies to allow X86_CPU_RESCTRL_INTEL_AET to be enabled even when INTEL_PMT_TELEMETRY and INTEL_TPMI are configured as modules. Signed-off-by: Tony Luck AI-Review-of-v1: https://sashiko.dev/#/patchset/20260323163452.25044-1-tony= .luck%40intel.com --- Sashiko reported three issues. I fixed the one real issue. 1) If the INTEL_PMT_TELEMETRY module is unloaded it will unmap the MMIO reg= ister space and resctrl will page fault reading AET counters. This patch fixes this issue by delaying symbol_put() calls to intel_aet_exi= t() which holds module reference counts on INTEL_PMT_TELEMETRY. 2) Sashiko said that my change to Kconfig wouldn't work if INTEL_PMT_TELEME= TRY was configured as a module. It thought that Kconfig would try to force X86_CPU_RESCTRL_INTEL_AET to be a module, which violates its "bool" definit= ion. By experiment, Sashiko is wrong about this. No changes for this. 3) In some deeper call analysis Sashiko pointed out that intel_aet_get_even= ts() is only called once on first mount. If the INTEL_PMT module isn't loaded wh= en that happens, AET won't be enabled and the user can't fix this by loading the module. By default (on Fedora) the INTEL_PMT_TELEMETRY module is loaded. So a user could shoot themselves in the foot by unloading the module and then mounting resctrl. But this doesn't seem worth defending against. arch/x86/kernel/cpu/resctrl/intel_aet.c | 22 +++++++++++++++++++--- drivers/platform/x86/intel/pmt/telemetry.c | 4 ++-- arch/x86/Kconfig | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/intel_aet.c b/arch/x86/kernel/cpu/= resctrl/intel_aet.c index 6fdb2cfa445a..881e3914578c 100644 --- a/arch/x86/kernel/cpu/resctrl/intel_aet.c +++ b/arch/x86/kernel/cpu/resctrl/intel_aet.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -380,6 +381,9 @@ static enum pmt_feature_id lookup_pfid(const char *pfna= me) return FEATURE_INVALID; } =20 +static struct pmt_feature_group *(*get_feature)(enum pmt_feature_id id); +static void (*put_feature)(struct pmt_feature_group *p); + /* * Request a copy of struct pmt_feature_group for each event group. If the= re is * one, the returned structure has an array of telemetry_region structures, @@ -398,16 +402,25 @@ bool intel_aet_get_events(void) struct event_group **peg; bool ret =3D false; =20 + get_feature =3D symbol_get(intel_pmt_get_regions_by_feature); + if (!get_feature) + return ret; + put_feature =3D symbol_get(intel_pmt_put_feature_group); + if (!put_feature) { + symbol_put(intel_pmt_get_regions_by_feature); + return ret; + } + for_each_event_group(peg) { pfid =3D lookup_pfid((*peg)->pfname); - p =3D intel_pmt_get_regions_by_feature(pfid); + p =3D get_feature(pfid); if (IS_ERR_OR_NULL(p)) continue; if (enable_events(*peg, p)) { (*peg)->pfg =3D p; ret =3D true; } else { - intel_pmt_put_feature_group(p); + put_feature(p); } } =20 @@ -420,10 +433,13 @@ void __exit intel_aet_exit(void) =20 for_each_event_group(peg) { if ((*peg)->pfg) { - intel_pmt_put_feature_group((*peg)->pfg); + put_feature((*peg)->pfg); (*peg)->pfg =3D NULL; } } + symbol_put(intel_pmt_get_regions_by_feature); + symbol_put(intel_pmt_put_feature_group); + } =20 #define DATA_VALID BIT_ULL(63) diff --git a/drivers/platform/x86/intel/pmt/telemetry.c b/drivers/platform/= x86/intel/pmt/telemetry.c index a52803bfe124..4504fb9fd83c 100644 --- a/drivers/platform/x86/intel/pmt/telemetry.c +++ b/drivers/platform/x86/intel/pmt/telemetry.c @@ -287,13 +287,13 @@ struct pmt_feature_group *intel_pmt_get_regions_by_fe= ature(enum pmt_feature_id i =20 return no_free_ptr(feature_group); } -EXPORT_SYMBOL(intel_pmt_get_regions_by_feature); +EXPORT_SYMBOL_GPL(intel_pmt_get_regions_by_feature); =20 void intel_pmt_put_feature_group(struct pmt_feature_group *feature_group) { kref_put(&feature_group->kref, pmt_feature_group_release); } -EXPORT_SYMBOL(intel_pmt_put_feature_group); +EXPORT_SYMBOL_GPL(intel_pmt_put_feature_group); =20 int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count) { diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e2df1b147184..fb3e40fc1e03 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -542,7 +542,7 @@ config X86_CPU_RESCTRL =20 config X86_CPU_RESCTRL_INTEL_AET bool "Intel Application Energy Telemetry" - depends on X86_64 && X86_CPU_RESCTRL && CPU_SUP_INTEL && INTEL_PMT_TELEME= TRY=3Dy && INTEL_TPMI=3Dy + depends on X86_64 && X86_CPU_RESCTRL && CPU_SUP_INTEL && INTEL_PMT_TELEME= TRY && INTEL_TPMI help Enable per-RMID telemetry events in resctrl. =20 --=20 2.53.0