sched_ext: Add sysrq-S which disables the BPF scheduler
authorTejun Heo <tj@kernel.org>
Tue, 18 Jun 2024 20:09:18 +0000 (10:09 -1000)
committerTejun Heo <tj@kernel.org>
Tue, 18 Jun 2024 20:09:18 +0000 (10:09 -1000)
This enables the admin to abort the BPF scheduler and revert to CFS anytime.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: David Vernet <dvernet@meta.com>
Acked-by: Josh Don <joshdon@google.com>
Acked-by: Hao Luo <haoluo@google.com>
Acked-by: Barret Rhoden <brho@google.com>
drivers/tty/sysrq.c
kernel/sched/build_policy.c
kernel/sched/ext.c

index e5974b8..167e877 100644 (file)
@@ -531,6 +531,7 @@ static const struct sysrq_key_op *sysrq_key_table[62] = {
        NULL,                           /* P */
        NULL,                           /* Q */
        &sysrq_replay_logs_op,          /* R */
+       /* S: May be registered by sched_ext for resetting */
        NULL,                           /* S */
        NULL,                           /* T */
        NULL,                           /* U */
index f0c148f..9223c49 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/suspend.h>
 #include <linux/tsacct_kern.h>
 #include <linux/vtime.h>
+#include <linux/sysrq.h>
 #include <linux/percpu-rwsem.h>
 
 #include <uapi/linux/sched/types.h>
index 49b115f..1f5d80d 100644 (file)
@@ -20,6 +20,7 @@ enum scx_exit_kind {
        SCX_EXIT_UNREG = 64,    /* user-space initiated unregistration */
        SCX_EXIT_UNREG_BPF,     /* BPF-initiated unregistration */
        SCX_EXIT_UNREG_KERN,    /* kernel-initiated unregistration */
+       SCX_EXIT_SYSRQ,         /* requested by 'S' sysrq */
 
        SCX_EXIT_ERROR = 1024,  /* runtime error, error msg contains details */
        SCX_EXIT_ERROR_BPF,     /* ERROR but triggered through scx_bpf_error() */
@@ -2776,6 +2777,8 @@ static const char *scx_exit_reason(enum scx_exit_kind kind)
                return "Scheduler unregistered from BPF";
        case SCX_EXIT_UNREG_KERN:
                return "Scheduler unregistered from the main kernel";
+       case SCX_EXIT_SYSRQ:
+               return "disabled by sysrq-S";
        case SCX_EXIT_ERROR:
                return "runtime error";
        case SCX_EXIT_ERROR_BPF:
@@ -3526,6 +3529,21 @@ static struct bpf_struct_ops bpf_sched_ext_ops = {
  * System integration and init.
  */
 
+static void sysrq_handle_sched_ext_reset(u8 key)
+{
+       if (scx_ops_helper)
+               scx_ops_disable(SCX_EXIT_SYSRQ);
+       else
+               pr_info("sched_ext: BPF scheduler not yet used\n");
+}
+
+static const struct sysrq_key_op sysrq_sched_ext_reset_op = {
+       .handler        = sysrq_handle_sched_ext_reset,
+       .help_msg       = "reset-sched-ext(S)",
+       .action_msg     = "Disable sched_ext and revert all tasks to CFS",
+       .enable_mask    = SYSRQ_ENABLE_RTNICE,
+};
+
 void __init init_sched_ext_class(void)
 {
        s32 cpu, v;
@@ -3549,6 +3567,8 @@ void __init init_sched_ext_class(void)
                init_dsq(&rq->scx.local_dsq, SCX_DSQ_LOCAL);
                INIT_LIST_HEAD(&rq->scx.runnable_list);
        }
+
+       register_sysrq_key('S', &sysrq_sched_ext_reset_op);
 }