[PATCH 15/32] sched_ext: Add sysrq-S which disables the BPF scheduler

Tejun Heo
2023-03-17T21:36:37Z

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 | 1 +
include/linux/sched/ext.h | 1 +
kernel/sched/build_policy.c | 1 +
kernel/sched/ext.c | 20 ++++++++++++++++++++
4 files changed, 23 insertions(+)

diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
index b6e70c5cfa17..ddfcdb6aecd7 100644
--- a/drivers/tty/sysrq.c
+++ b/drivers/tty/sysrq.c
@@ -520,6 +520,7 @@ static const struct sysrq_key_op *sysrq_key_table[62] = {
NULL, /* P */
NULL, /* Q */
NULL, /* R */
+ /* S: May be registered by sched_ext for resetting */
NULL, /* S */
NULL, /* T */
NULL, /* U */
diff --git a/include/linux/sched/ext.h b/include/linux/sched/ext.h
index 45bf24a23c61..4b6b9386e2f8 100644
--- a/include/linux/sched/ext.h
+++ b/include/linux/sched/ext.h
@@ -55,6 +55,7 @@ enum scx_exit_type {
SCX_EXIT_DONE,

SCX_EXIT_UNREG = 64, /* BPF 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() */
diff --git a/kernel/sched/build_policy.c b/kernel/sched/build_policy.c
index 4c658b21f603..005025f55bea 100644
--- a/kernel/sched/build_policy.c
+++ b/kernel/sched/build_policy.c
@@ -28,6 +28,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>
diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
index 738ae1d7a8ee..9406869fbc90 100644
--- a/kernel/sched/ext.c
+++ b/kernel/sched/ext.c
@@ -1930,6 +1930,9 @@ static void scx_ops_disable_workfn(struct kthread_work *work)
case SCX_EXIT_UNREG:
reason = "BPF scheduler unregistered";
break;
+ case SCX_EXIT_SYSRQ:
+ reason = "disabled by sysrq-S";
+ break;
case SCX_EXIT_ERROR:
reason = "runtime error";
break;
@@ -2539,6 +2542,21 @@ struct bpf_struct_ops bpf_sched_ext_ops = {
.name = "sched_ext_ops",
};

+static void sysrq_handle_sched_ext_reset(int 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)
{
int cpu;
@@ -2562,6 +2580,8 @@ void __init init_sched_ext_class(void)

init_dsq(&rq->scx.local_dsq, SCX_DSQ_LOCAL);
}
+
+ register_sysrq_key('S', &sysrq_sched_ext_reset_op);
}

--
2.39.2