move_task_between_dsqs(9)
π move_task_between_dsqs(9) β from the Kernel API Manual, bestie
okay so picture this: you're deep in the scheduler, and a task is just sitting in the wrong DSQ. like, wrong vibe entirely. this page is the glow-up tutorial for moving it. no cap. it's a 9 (kernel API) page, and yes the manual is literally just called Kernel API Manual because we keep it simple and iconic β¨
πΈ NAME πΈ
move_task_between_dsqs β move a task from one DSQ to another. that's it. that's the whole thing. slay π
π SYNOPSIS π
struct rq * move_task_between_dsqs (struct scx_sched *sch , struct
task_struct *p , u64 enq_flags , struct scx_dispatch_q *src_dsq , struct
scx_dispatch_q *dst_dsq );
look at that return type. struct rq *. that's gonna matter later, so don't skip the description, bestie, i'm begging π
π¦ ARGUMENTS π¦
schβ thescx_schedwe're operating on. the main character, fr fr πpβ the target task. the one we're moving. it's giving "new school, new me"enq_flagsβ straight upSCX_ENQ_*flags. iconic little flags. pass them exactly as specified πsrc_dsqβ the DSQ thatpis currently on. and heads up: this must not be a local DSQ. like, that's a hard no π«dst_dsqβ the DSQpis being moved to. this one can be any DSQ. the world is its oyster π
β¨ DESCRIPTION β¨
okay so the rules of the road, and the first one is non-negotiable:
you must call this withp'stask_rqandsrc_dsqlocked. like actually. both. locked. that's the vibe check and you need to pass it.
now, here's the plot twist: if dst_dsq is a local DSQ and p is on a different CPU, then p will be migrated, and thus its task_rq will change. π so the thing you locked? yeah. it's not the thing anymore. character development.
but β and this is the slay part β because p's task_rq is locked, this function doesn't need to use the holding_cpu mechanism. we simply do not require it. periodt.
then, on return: src_dsq is unlocked, and only p's new task_rq (which is the return value) is locked. so like, keep your eyes on that return value, bestie. it's the whole point π«Ά
π SEE ALSO π
kernel file ./kernel/sched/ext/ext.c, plus literally the entire 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)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_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)
π real talk though: lockp'stask_rqandsrc_dsqbefore you call this, and remembersrc_dsqcan't be a local DSQ. do not freestyle this one.
okay that's the whole page, go be great π this lil' slice of the manual lives under ./kernel/sched/ext, dated October 2026, and it's filed as move_task_between_dsqs(9) β love her, she ate, no notes πβ¨πΈ
π¦ 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