[PATCH v5 06/16] fs/resctrl: Introduce kernel mode states for resctrl
From: Babu Moger
Date: Wed Aug 26 2026 - 15:36:43 EST
Architectures need the generic resctrl filesystem to track supported
kernel modes, the active mode, and per-dimension assignment state.
Generic resctrl has no place to store this policy state today.
Add struct resctrl_kmode_cfg to hold supported modes, active mode,
control/monitoring assignment state, and the bound resource group.
Initialize defaults from resctrl_arch_alloc_capable() and
resctrl_arch_mon_capable() during resctrl_init().
Signed-off-by: Babu Moger <babu.moger@xxxxxxx>
---
v5: Replace per-mode registration helpers with a single resctrl_kmode_cfg
structure. Derive ctrl_en and mon_en from resctrl_arch_alloc_capable()
and resctrl_arch_mon_capable() during filesystem init. Update code
comments and changelog.
v4: New patch to initialize supported kernel modes.
https://lore.kernel.org/lkml/737a4228-52fb-4583-ac64-8efe79c107e6@xxxxxxxxx/
Changed the kmode_cur to enum resctrl_kernel_mode in resctrl_kmode_cfg.
Moved the resctrl_kmode_cfg to filesystem code.
---
fs/resctrl/internal.h | 51 +++++++++++++++++++++++++++++++++++++++++++
fs/resctrl/rdtgroup.c | 33 ++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
diff --git a/fs/resctrl/internal.h b/fs/resctrl/internal.h
index e62a277dee85..4087bf44a06d 100644
--- a/fs/resctrl/internal.h
+++ b/fs/resctrl/internal.h
@@ -314,6 +314,57 @@ struct mbm_state {
u32 prev_bw;
};
+/**
+ * enum kmode_state - Control or monitoring state for a kernel mode
+ * @KMODE_INHERIT: Inherit from the user space task.
+ * @KMODE_ASSIGN: Use a global assignment for kernel mode.
+ */
+enum kmode_state {
+ KMODE_INHERIT,
+ KMODE_ASSIGN
+};
+
+/**
+ * struct resctrl_kmode_caps - Static kernel mode capabilities
+ * @kmode_sup: Bitmap of supported kernel modes. Empty when neither
+ * @ctrl_en nor @mon_en is set and kernel mode policy is
+ * unavailable on this system.
+ * @ctrl_en: Whether kernel mode may use global assignment for control.
+ * @mon_en: Whether kernel mode may use global assignment for monitoring.
+ */
+struct resctrl_kmode_caps {
+ DECLARE_BITMAP(kmode_sup, RESCTRL_NUM_KERNEL_MODES);
+ bool ctrl_en;
+ bool mon_en;
+};
+
+/**
+ * struct resctrl_kmode_active - Runtime kernel mode state
+ * @kmode_cur: Currently selected kernel mode.
+ * @ctrl_mode: Control assignment state when kernel mode is active.
+ * @mon_mode: Monitoring assignment state when kernel mode is active.
+ * @k_rdtgrp: Resource group backing global assignment mode.
+ *
+ * When @kmode_cur is %RESCTRL_INHERIT_USER, assignment state is ignored and
+ * @k_rdtgrp is %NULL.
+ */
+struct resctrl_kmode_active {
+ enum resctrl_kernel_mode kmode_cur;
+ enum kmode_state ctrl_mode;
+ enum kmode_state mon_mode;
+ struct rdtgroup *k_rdtgrp;
+};
+
+/**
+ * struct resctrl_kmode_cfg - Global kernel mode state
+ * @caps: Supported modes and assignment capabilities.
+ * @active: Active mode, assignment state, and assigned group.
+ */
+struct resctrl_kmode_cfg {
+ struct resctrl_kmode_caps caps;
+ struct resctrl_kmode_active active;
+};
+
extern struct mutex rdtgroup_mutex;
static inline const char *rdt_kn_name(const struct kernfs_node *kn)
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 5dcbb0a964e8..3c53f3f74e5a 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -76,6 +76,13 @@ static void rdtgroup_destroy_root(void);
struct dentry *debugfs_resctrl;
+/*
+ * Global kernel mode policy state: supported modes, active mode, assignment
+ * capabilities, assignment state, and the resource group selected for a global
+ * assignment.
+ */
+static struct resctrl_kmode_cfg resctrl_kcfg;
+
/*
* Memory bandwidth monitoring event to use for the default CTRL_MON group
* and each new CTRL_MON group created by the user. Only relevant when
@@ -2297,6 +2304,30 @@ static void io_alloc_init(void)
}
}
+/*
+ * Initialize kernel mode policy defaults from architecture capabilities.
+ *
+ * When ctrl_en or mon_en is set, RESCTRL_INHERIT_USER is supported and
+ * selected as the initial active mode. When neither is set, kmode_sup is
+ * left empty, kernel mode policy is unavailable, and kmode_cur remains at
+ * its zero-initialized default (RESCTRL_INHERIT_USER) but is unused.
+ */
+static void resctrl_kmode_init(void)
+{
+ resctrl_kcfg.caps.ctrl_en = resctrl_arch_alloc_capable();
+ resctrl_kcfg.active.ctrl_mode = KMODE_INHERIT;
+ resctrl_kcfg.caps.mon_en = resctrl_arch_mon_capable();
+ resctrl_kcfg.active.mon_mode = KMODE_INHERIT;
+ resctrl_kcfg.active.k_rdtgrp = NULL;
+
+ if (resctrl_kcfg.caps.ctrl_en || resctrl_kcfg.caps.mon_en) {
+ resctrl_kcfg.active.kmode_cur = RESCTRL_INHERIT_USER;
+ __set_bit(RESCTRL_INHERIT_USER, resctrl_kcfg.caps.kmode_sup);
+ } else {
+ bitmap_zero(resctrl_kcfg.caps.kmode_sup, RESCTRL_NUM_KERNEL_MODES);
+ }
+}
+
void resctrl_file_fflags_init(const char *config, unsigned long fflags)
{
struct rftype *rft;
@@ -4816,6 +4847,8 @@ int resctrl_init(void)
if (ret)
return ret;
+ resctrl_kmode_init();
+
ret = sysfs_create_mount_point(fs_kobj, "resctrl");
if (ret) {
resctrl_l3_mon_resource_exit();
--
2.43.0