[PATCH v12 22/25] platform/x86/intel/pmt: Inform resctrl when MMIO maps are being removed

From: Tony Luck

Date: Wed Sep 16 2026 - 19:16:08 EST


Before destroying devices, tell resctrl that the virtual addresses
supplied by an earlier call to intel_pmt_get_regions_by_feature()
are about to be invalidated and should not be used again.

Avoid A-B deadlock between ep_lock and aet_register_lock.

Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
v12:
Ilpo: Downgrade "can't happen" dev_warn() to dev_debug()
Ilpo's suggestion to use guard(mutex) moot due to refactor.
Reinette: Refactor and eliminate "u32 ret" and s/packages/package/
Reinette: Explain ep_lock release/acquire.
---
drivers/platform/x86/intel/pmt/telemetry.c | 31 ++++++++++++++++++++++
1 file changed, 31 insertions(+)

diff --git a/drivers/platform/x86/intel/pmt/telemetry.c b/drivers/platform/x86/intel/pmt/telemetry.c
index bf0c9295feb3..527563043777 100644
--- a/drivers/platform/x86/intel/pmt/telemetry.c
+++ b/drivers/platform/x86/intel/pmt/telemetry.c
@@ -366,12 +366,43 @@ pmt_telem_find_and_register_endpoint(struct device *dev, u32 guid, u16 pos)
}
EXPORT_SYMBOL_NS_GPL(pmt_telem_find_and_register_endpoint, "INTEL_PMT_TELEMETRY");

+static int pmt_telem_get_package_id(struct pmt_telem_priv *priv)
+{
+ int i;
+
+ for (i = 0; i < priv->num_entries; i++) {
+ struct intel_pmt_entry *entry = &priv->entry[i];
+ struct pci_dev *pdev = to_pci_dev(entry->ep->dev);
+ struct oobmsm_plat_info *plat_info;
+
+ plat_info = intel_vsec_get_mapping(pdev);
+ if (!IS_ERR(plat_info))
+ return plat_info->package_id;
+ }
+
+ return -ENODEV;
+}
+
static void pmt_telem_remove(struct auxiliary_device *auxdev)
{
struct pmt_telem_priv *priv = auxiliary_get_drvdata(auxdev);
+ int package_id;
int i;

mutex_lock(&ep_lock);
+ package_id = pmt_telem_get_package_id(priv);
+ /*
+ * Tell resctrl/AET that virtual mappings for MMIO space in a CPU
+ * package are about to be torn down.
+ */
+ if (package_id < 0) {
+ dev_dbg(&auxdev->dev, "Unable to determine package ID for removed device\n");
+ } else {
+ mutex_unlock(&ep_lock);
+ intel_aet_invalidate(package_id);
+ mutex_lock(&ep_lock);
+ }
+
for (i = 0; i < priv->num_entries; i++) {
struct intel_pmt_entry *entry = &priv->entry[i];

--
2.55.0