scx_hardlockup(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… scx_hardlockup(9) β€” aka the "bestie, your scheduler is on fire" handler

okay so real talk: this page is from the Kernel API Manual (section 9, kernel developer land 🧚), and it's about scx_hardlockup β€” the sched_ext hardlockup handler. yes it's as dramatic as it sounds. let's go πŸŽ€


✨ NAME ✨

scx_hardlockup β€” the sched_ext hardlockup handler. that's it. that's the whole vibe. πŸ’…


🌸 SYNOPSIS 🌸

bool scx_hardlockup (int cpu );

πŸ¦‹ ARGUMENTS πŸ¦‹

  • cpu β€” the target CPU 🎯 like, which CPU are we saving here.

πŸ”₯ DESCRIPTION πŸ”₯

okay so picture this: a BPF scheduler that's behaving terribly 🫠 It can trigger a hard lockup β€” for example by stuffing a ton of affinitized tasks into a single queue and then pointing every single CPU at it. it's giving "one lane highway, everyone merge." iconic in the worst way πŸ’€

So what do we do? We try kicking out the current scheduler in an attempt to recover the system back to a good state before anybody takes more drastic actions. emergency eviction notice, basically. πŸšͺ✨

This is called from NMI. Aborting the scheduler sets ->aborting throughout the hierarchy before returning β€” and that is the thing that breaks the dispatch-path live-locks that can hard-lock CPUs. no cap, that's the actual mechanism. πŸ”“

Return value check, because this matters πŸ‘‡

  • true β€” sched_ext is enabled and abort was initiated, which may resolve the lockup 😌🫢
  • false β€” sched_ext is not enabled, or abort was already initiated by someone else. so like, not our moment πŸ’…
⚠️ heads up: a poorly behaving BPF scheduler is the whole reason this function exists. if you're seeing hard lockups, your scheduler might be the problem child. πŸ™ˆ

πŸ‘‘ SEE ALSO πŸ‘‘

Kernel file ./kernel/sched/ext/ext.c, plus the whole friend group πŸ˜­πŸ’–:

scx_is_descendant(9), rq_is_open(9), scx_fill_cmask_scratch(9), scx_call_op_set_cpumask(9), nldsq_next_task(9), nldsq_cursor_next_task(9), nldsq_cursor_lost_task(9), scx_task_iter_start(9), scx_task_iter_unlock(9), scx_task_iter_relock(9), scx_task_iter_stop(9), scx_task_iter_next(9), scx_task_iter_next_locked(9), scx_dump_event(9), wait_ops_state(9), scx_cpu_valid(9), schedule_deferred(9), schedule_deferred_locked(9), dsq_insert_head(9), set_task_slice_keep_oob(9), scx_task_slice_ended(9), move_remote_task_to_local_dsq(9), unlink_dsq_and_switch_rq_lock(9), move_task_between_dsqs(9), dispatch_to_local_dsq(9), finish_dispatch(9), scx_prio_less(9), __scx_init_task(9), task_dead_and_done(9), scx_tg_sched(9), scx_tg_knob_sched(9), handle_lockup(9), scx_rcu_cpu_stall(9), scx_softlockup(9), unbypass_renotify_idle(9), scx_bypass(9), scx_propagate_exit_irq_workfn(9), scx_flush_disable_work(9), print_scx_info(9), scx_bpf_dsq_insert___v2(9), __scx_bpf_dsq_insert_vtime(9), scx_bpf_dispatch_nr_slots(9), scx_bpf_dispatch_cancel(9), scx_bpf_dsq_move_to_local___v2(9), scx_bpf_dsq_move_set_slice(9), scx_bpf_dsq_move_set_vtime(9), scx_bpf_dsq_move(9), scx_bpf_dsq_move_vtime(9), scx_bpf_reenqueue_local(9), scx_bpf_create_dsq(9), scx_bpf_task_set_slice(9), scx_bpf_task_set_dsq_vtime(9), scx_bpf_kick_cpu(9), scx_bpf_kick_cid(9), scx_bpf_dsq_nr_queued(9), scx_bpf_destroy_dsq(9), bpf_iter_scx_dsq_new(9), bpf_iter_scx_dsq_next(9), bpf_iter_scx_dsq_destroy(9), scx_bpf_dsq_peek(9), scx_bpf_dsq_reenq(9), scx_bpf_reenqueue_local___v2(9), scx_bpf_exit_bstr(9), scx_bpf_error_bstr(9), scx_bpf_dump_bstr(9), scx_bpf_cpuperf_cap(9), scx_bpf_cidperf_cap(9), scx_bpf_cpuperf_cur(9), scx_bpf_cidperf_cur(9), scx_bpf_cpuperf_set(9), scx_bpf_cidperf_set(9), scx_bpf_nr_node_ids(9), scx_bpf_nr_cpu_ids(9), scx_bpf_nr_cids(9), scx_bpf_nr_online_cids(9), scx_bpf_online_cmask(9), scx_bpf_this_cid(9), scx_bpf_get_possible_cpumask(9), scx_bpf_get_online_cpumask(9), scx_bpf_put_cpumask(9), scx_bpf_task_running(9), scx_bpf_task_cpu(9), scx_bpf_task_cid(9), scx_bpf_locked_rq(9), scx_bpf_cpu_curr(9), scx_bpf_cid_curr(9), scx_bpf_tid_to_task(9), scx_bpf_now(9), scx_bpf_events(9), scx_bpf_task_cgroup(9)


that's the whole page bestie, go save some CPUs 🫢✨

this lil number lives in ./kernel/sched/ext and it's stamped October 2026 πŸ“… β€” mwah, kisses, see you at the next lockup πŸ’‹πŸŽ€

πŸ“¦ where this page comes from