diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index a73a5957e9d9..47b51bd31a30 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -44,7 +44,6 @@ static atomic_t scx_enable_state_var = ATOMIC_INIT(SCX_DISABLED); static int scx_bypass_depth; static cpumask_var_t scx_bypass_lb_donee_cpumask; static cpumask_var_t scx_bypass_lb_resched_cpumask; -static bool scx_aborting; static bool scx_init_task_enabled; static bool scx_switching_all; DEFINE_STATIC_KEY_FALSE(__scx_switched_all); @@ -2151,7 +2150,7 @@ retry: * the system into the bypass mode. This can easily live-lock the * machine. If aborting, exit from all non-bypass DSQs. */ - if (unlikely(READ_ONCE(scx_aborting)) && dsq->id != SCX_DSQ_BYPASS) + if (unlikely(READ_ONCE(sch->aborting)) && dsq->id != SCX_DSQ_BYPASS) break; if (rq == task_rq) { @@ -4677,7 +4676,6 @@ static void scx_root_disable(struct scx_sched *sch) /* guarantee forward progress and wait for descendants to be disabled */ scx_bypass(true); - WRITE_ONCE(scx_aborting, false); drain_descendants(sch); switch (scx_set_enable_state(SCX_DISABLING)) { @@ -4838,7 +4836,7 @@ static bool scx_claim_exit(struct scx_sched *sch, enum scx_exit_kind kind) * flag to break potential live-lock scenarios, ensuring we can * successfully reach scx_bypass(). */ - WRITE_ONCE(scx_aborting, true); + WRITE_ONCE(sch->aborting, true); /* * Propagate exits to descendants immediately. Each has a dedicated @@ -5485,8 +5483,6 @@ static void scx_root_enable_workfn(struct kthread_work *work) */ WARN_ON_ONCE(scx_set_enable_state(SCX_ENABLING) != SCX_DISABLED); WARN_ON_ONCE(scx_root); - if (WARN_ON_ONCE(READ_ONCE(scx_aborting))) - WRITE_ONCE(scx_aborting, false); atomic_long_set(&scx_nr_rejected, 0); @@ -6758,7 +6754,7 @@ static bool scx_dsq_move(struct bpf_iter_scx_dsq_kern *kit, * If the BPF scheduler keeps calling this function repeatedly, it can * cause similar live-lock conditions as consume_dispatch_q(). */ - if (unlikely(READ_ONCE(scx_aborting))) + if (unlikely(READ_ONCE(sch->aborting))) return false; if (unlikely(!scx_task_on_sched(sch, p))) { diff --git a/kernel/sched/ext_internal.h b/kernel/sched/ext_internal.h index 6c1eeaaa41db..87f19aed47fb 100644 --- a/kernel/sched/ext_internal.h +++ b/kernel/sched/ext_internal.h @@ -951,6 +951,7 @@ struct scx_sched { struct scx_sched_pcpu __percpu *pcpu; u64 slice_dfl; + bool aborting; s32 level; /*