[PATCH v4 13/20] sched/debug: Provide debugfs to enable/disable steal monitor
From: Shrikanth Hegde
Date: Wed Jun 17 2026 - 13:46:37 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 | 31 +++++++++++++++++++++++++++++++
kernel/sched/sched.h | 2 ++
3 files changed, 34 insertions(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 33ebe71a0b4b..24d4abc74241 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -11309,6 +11309,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 d1532359fc50..2d62858f9cc0 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -634,6 +634,35 @@ static void debugfs_fair_server_init(void)
}
#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;
+
+ cpus_read_lock();
+ 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_active_mask);
+ }
+
+ cpus_read_unlock();
+ 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;
@@ -641,6 +670,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 5e9b8aaf9a9a..9cb006c21090 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -4238,6 +4238,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