[PATCH v6 12/18] fs/resctrl: Add CPU hotplug support for kernel mode associations
From: Babu Moger
Date: Thu Oct 01 2026 - 11:25:00 EST
Kernel mode allocation and monitoring associations are maintained on a
per-CPU basis. Extend the kernel mode infrastructure to integrate with
CPU hotplug handling, allowing kernel mode state to be managed as CPUs
enter or leave the online set.
Introduce resctrl_kmode_global_online_cpu() and
resctrl_kmode_global_offline_cpu(), and hook them into the existing
resctrl_online_cpu() and resctrl_offline_cpu() paths.
Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
---
v6: Update the changelog in non-bugfix form.
Update the code to remove rdtgroup->kmode.
Introduce new wrapper resctrl_configure_kmode_global() to consolidate
architecture calls.
v5: Added resctrl_kmode_offline_cpu() to disable the kernel mode
association and update kmode_cpu_mask when an associated CPU goes
offline.
This addresses sashiko comments:
https://sashiko.dev/#/patchset/cover.1783461016.git.babu.moger%40amd.com?part=11
https://sashiko.dev/#/patchset/cover.1783461016.git.babu.moger%40amd.com?part=10
Also moved the patch earlier than patch 10.
[RESEND PATCH v4 10/15] fs/resctrl: Reset the kernel mode binding when an rdtgroup is removed
That seemed much more clear.
v4: New patch in the series. Patch taken from:
https://lore.kernel.org/lkml/20260611111706.1981788-5-qinyuntan@xxxxxxxxxxxxxxxxx/
Updated the code to enable kernel mode by default whenever a CPU comes
online when one of global-assign mode is enabled.
---
fs/resctrl/rdtgroup.c | 57 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 0e638dc654c1..f5c7790f7970 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -410,6 +410,17 @@ static int rdtgroup_kmode_cpus_show(struct kernfs_open_file *of,
return ret;
}
+static void resctrl_configure_kmode_global(const struct cpumask *mask,
+ struct rdtgroup *rdtgrp,
+ bool enable)
+{
+ resctrl_arch_configure_kmode_global(mask, rdtgrp->closid,
+ resctrl_kmode.ctrl == KMODE_ASSIGN,
+ rdtgrp->mon.rmid,
+ resctrl_kmode.mon == KMODE_ASSIGN,
+ enable);
+}
+
/*
* Update the PGR_ASSOC MSR on all cpus in @cpu_mask,
*
@@ -1114,6 +1125,48 @@ static int resctrl_kernel_mode_show(struct kernfs_open_file *of,
return 0;
}
+/*
+ * resctrl_kmode_global_online_cpu() - Program kernel mode association for @cpu
+ * @cpu: CPU that has just been brought online
+ *
+ * When global_enable_per_cpu is active, @cpu joins that association and is
+ * programmed on.
+ */
+static void resctrl_kmode_global_online_cpu(unsigned int cpu)
+{
+ struct rdtgroup *rdtgrp = resctrl_kmode.rdtgrp;
+
+ if (resctrl_kmode.kmode_cur != RESCTRL_GLOBAL_ENABLE_PER_CPU || !rdtgrp)
+ return;
+
+ cpumask_set_cpu(cpu, &rdtgrp->kmode_cpu_mask);
+
+ resctrl_configure_kmode_global(cpumask_of(cpu), rdtgrp, true);
+}
+
+/*
+ * resctrl_kmode_global_offline_cpu() - Clear kernel mode association for @cpu
+ * @cpu: CPU being taken offline.
+ *
+ * When global_enable_per_cpu is active and @cpu is in kmode_cpu_mask, the
+ * association is disabled on @cpu and @cpu is removed from that mask. A CPU
+ * outside the mask is left unchanged.
+ */
+static void resctrl_kmode_global_offline_cpu(unsigned int cpu)
+{
+ struct rdtgroup *rdtgrp = resctrl_kmode.rdtgrp;
+
+ if (resctrl_kmode.kmode_cur != RESCTRL_GLOBAL_ENABLE_PER_CPU || !rdtgrp)
+ return;
+
+ if (!cpumask_test_cpu(cpu, &rdtgrp->kmode_cpu_mask))
+ return;
+
+ cpumask_clear_cpu(cpu, &rdtgrp->kmode_cpu_mask);
+
+ resctrl_configure_kmode_global(cpumask_of(cpu), rdtgrp, false);
+}
+
void *rdt_kn_parent_priv(struct kernfs_node *kn)
{
/*
@@ -4896,6 +4949,7 @@ void resctrl_online_cpu(unsigned int cpu)
mutex_lock(&rdtgroup_mutex);
/* The CPU is set in default rdtgroup after online. */
cpumask_set_cpu(cpu, &rdtgroup_default.cpu_mask);
+ resctrl_kmode_global_online_cpu(cpu);
mutex_unlock(&rdtgroup_mutex);
}
@@ -4939,6 +4993,9 @@ void resctrl_offline_cpu(unsigned int cpu)
}
}
+ /* Clear any active kernel mode association on this CPU. */
+ resctrl_kmode_global_offline_cpu(cpu);
+
if (!l3->mon_capable)
goto out_unlock;
--
2.43.0