scx_tg_sched(9)
π NAME π
Welcome to scx_tg_sched(9) from the Kernel API Manual β the little function that resolves a task_groupβs sched. Itβs giving βwhere is your scheduling parent, bestie?β energy π«Ά
scx_tg_sched β resolve a task_groupβs sched.
β¨ SYNOPSIS β¨
struct scx_sched * scx_tg_sched (struct task_group *tg );
π ARGUMENTS π
tgβ thetask_groupof interest π.
πΈ DESCRIPTION πΈ
Okay so scx_tg_sched() gives you back the sched that tgβs ops.cgroup_init succeeded on, and it returns NULL if tg isnβt inited. No cap.
An autogroup tg has no cgroup of its own and resolves to the root sched. Slay, inherited root-sched energy π
When a child sched exits, its task_groups are moved to the parent and re-inited on it. A failed re-init fails the parent in turn and leaves the task_group without a sched itβs inited on, resolving to NULL. See scx_cgroup_return_subtree.
π¨ Bestie, that failed re-init path is real: the parent fails in turn, and thetask_groupends up with no sched itβs inited on β so it resolves toNULL.
Itβs safe for callers read-locking the ops rwsem. Rewrites of tg->scx.sched write-lock it, and tg on/offline canβt overlap such callers as a cssβs files are created after online and drained before offline. Locking lore, lowkey iconic πβ¨
π¦ SEE ALSO π¦
Okay the crossover episode list is LONG, bestie β every single one of these is here, no skipping, no cap π
Kernel file: ./kernel/sched/ext/ext.c
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_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_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)
xoxo, your local kernel bestie π
β signed off from ./kernel/sched/ext, October 2026, with scx_tg_sched(9) living rent-free in the manual π«Άβ¨
π¦ 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