Commit 79e10440 authored by Tejun Heo's avatar Tejun Heo
Browse files

sched_ext: Add sysrq-S which disables the BPF scheduler



This enables the admin to abort the BPF scheduler and revert to CFS anytime.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Reviewed-by: default avatarDavid Vernet <dvernet@meta.com>
Acked-by: default avatarJosh Don <joshdon@google.com>
Acked-by: default avatarHao Luo <haoluo@google.com>
Acked-by: default avatarBarret Rhoden <brho@google.com>
parent 2a52ca7c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+1 −0
Original line number Diff line number Diff line
@@ -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>
+20 −0
Original line number Diff line number Diff line
@@ -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);
}