[PATCH v3 14/20] sched/debug: Provide debugfs to enable/disable steal monitor

From: Shrikanth Hegde

Date: Thu May 14 2026 - 11:32:06 EST


Add a debugfs "enable" file to enable steal time monitor.

Computing steal time and acting on it periodically are to be opted by
the user. This helps to avoid any overhead when the feature
is disabled.

It is disabled by default.

Signed-off-by: Shrikanth Hegde <sshegde@xxxxxxxxxxxxx>
---
kernel/sched/core.c | 1 +
kernel/sched/debug.c | 29 +++++++++++++++++++++++++++++
kernel/sched/sched.h | 2 ++
3 files changed, 32 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0d1995c65ce6..1533a44d1a6b 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -11270,6 +11270,7 @@ void sched_change_end(struct sched_change_ctx *ctx)
#ifdef CONFIG_PREFERRED_CPU
/* npc - non preferred CPU */
static DEFINE_PER_CPU(struct cpu_stop_work, npc_push_task_work);
+DEFINE_STATIC_KEY_FALSE(__sched_sm_enable);

static int sched_non_preferred_cpu_push_stop(void *arg)
{
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index b1abfdc168bf..be8d223b43fd 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -592,6 +592,33 @@ static void debugfs_ext_server_init(void)
#endif /* CONFIG_SCHED_CLASS_EXT */

#ifdef CONFIG_PREFERRED_CPU
+__read_mostly bool sched_sm_wr_enable;
+
+static ssize_t sched_sm_en_write(struct file *filp, const char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ bool orig = sched_sm_wr_enable;
+ ssize_t result;
+
+ result = debugfs_write_file_bool(filp, ubuf, cnt, ppos);
+
+ if (sched_sm_wr_enable && !orig) {
+ static_branch_enable(&__sched_sm_enable);
+ } else if (!sched_sm_wr_enable && orig) {
+ static_branch_disable(&__sched_sm_enable);
+ cpumask_copy(&__cpu_preferred_mask, cpu_online_mask);
+ }
+
+ return result;
+}
+
+static const struct file_operations sched_sm_en_fops = {
+ .read = debugfs_read_file_bool,
+ .write = sched_sm_en_write,
+ .open = simple_open,
+ .llseek = default_llseek,
+};
+
static void sched_steal_monitor_debugfs_init(void)
{
struct dentry __maybe_unused *sm;
@@ -599,6 +626,8 @@ static void sched_steal_monitor_debugfs_init(void)
sm = debugfs_create_dir("steal_monitor", debugfs_sched);
if (!sm)
return;
+
+ debugfs_create_file("enable", 0644, sm, &sched_sm_wr_enable, &sched_sm_en_fops);
}
#endif

diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 96870021a842..bcc65c8b4ac6 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -4140,6 +4140,8 @@ static inline bool task_has_preferred_cpus(struct task_struct *p)
}

#ifdef CONFIG_PREFERRED_CPU
+DECLARE_STATIC_KEY_FALSE(__sched_sm_enable);
+
void sched_push_current_non_preferred_cpu(struct rq *rq);
#else /* !CONFIG_PREFERRED_CPU */
static inline void sched_push_current_non_preferred_cpu(struct rq *rq) { }
--
2.47.3