scx_bpf_locked_rq(9)
π scx_bpf_locked_rq(9) β a Kernel API Manual moment
okay bestie, so this is page scx_bpf_locked_rq(9) from the Kernel API Manual, and it's honestly a little diva: one function, one job, zero drama (mostly). let's get into it β¨
π NAME π
scx_bpf_locked_rq β returns the rq that SCX currently has locked. that's it. that's the whole assignment. π
π¦ SYNOPSIS π¦
__bpf_kfunc struct rq * scx_bpf_locked_rq (const struct bpf_prog_aux
*aux );
look at her. beautiful. __bpf_kfunc, returns a struct rq *, takes exactly one arg. no cap, that's the whole signature π
πΈ ARGUMENTS πΈ
auxβ this is the implicit BPF argument that lets you poke atbpf_prog_aux, and it's hidden from BPF progs. so likeβ¦ it's there, it's required, but it's not for you, babe. it's giving backstage pass you're not supposed to use π
β¨ DESCRIPTION β¨
so here's the tea: if a rq lock is currently held by SCX, this bad boy returns the rq. slay. that's your pointer, go be free π«Ά
but if no rq lock is being held by SCX? it emits an error and returns NULL. not me getting a NULL handed to me with an error attached π so check that return value, bestie, fr fr. NULL is not a vibe, it's a warning sign.
lowkey important: no lock held by SCX = error + NULL. don't dereference that. periodt. π
π SEE ALSO π
it lives in the kernel file ./kernel/sched/ext/ext.c, and it rolls with a massive friend group. the whole sched_ext extended family, in original order, because I would never do them dirty:
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)scx_hardlockup(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_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)
like, that is a stacked friend group. iykyk π
and that's the page!! mwah π this one came from ./kernel/sched/ext, dated October 2026 β screenshot it, cite it, tell your friends, go read the other ninety pages, love u bye π§ππ»
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms