__scx_bpf_dsq_insert_vtime(9)
π
__scx_bpf_dsq_insert_vtime β okay bestie, listen
Welcome to the Kernel API Manual, section 9, and honestly? This one is a little bit of a diva. Her whole thing is arg-wrapped vtime DSQ insertion β yes that's the NAME, yes we're keeping it, no we're not renaming her. π
β¨ NAME β¨
__scx_bpf_dsq_insert_vtime β Arg-wrapped vtime DSQ insertion. That's it, that's the vibe. Put a task in a vtime-sorted queue, but with the arguments wrapped up in a struct because BPF said "five arguments max, bestie, I don't make the rules." π
πΈ SYNOPSIS πΈ
__bpf_kfunc bool __scx_bpf_dsq_insert_vtime (struct task_struct *p ,
struct scx_bpf_dsq_insert_vtime_args *args , const struct bpf_prog_aux
*aux );
Like, look at her. Three arguments, one of which you literally cannot touch. Main character energy fr fr. π₯
π¦ ARGUMENTS π¦
pβ thetask_structyou're inserting. Your little guy. Your blorbo. π«Άargsβ the struct holding the rest of the arguments, because we ran out of argument slots and had to get creative:args->dsq_idβ the DSQ you're inserting into. The destination, the venue, the location tag. πargs->sliceβ how longpcan run for, in nsecs. Set it to0to keep the current value. Zero is giving "no thoughts, head empty, keep what's already there." πargs->vtimeβp's ordering inside the vtime-sorted queue of the target DSQ. Her little place in line. βargs->enq_flagsβSCX_ENQ_*flags. You know the ones.
auxβ the implicit BPF argument, so you can accessbpf_prog_aux. She's hidden from BPF progs β you don't call her, she just shows up. Lowkey mysterious. π
π DESCRIPTION π
So. Wrapper kfunc. It takes its arguments via a struct to work around BPF's 5 argument limit β iconic workaround, no notes. π
Real talk: BPF programs should not call this directly. Usescx_bpf_dsq_insert_vtime, which is provided as an inline wrapper incommon.bpf.h. That's the one you actually want, bestie. This one is the plumbing.
Okay so what does she do? She inserts p into the vtime priority queue of the DSQ identified by args->dsq_id. Tasks queued into the priority queue get ordered by args->vtime. Everything else? Absolutely identical to scx_bpf_dsq_insert. Same girl, different queue. β¨
The args->vtime ordering goes according to time_before64, which considers wrapping. So a numerically larger vtime can actually mean an earlier position in the ordering, and vice-versa. Yes, that's real. Yes, it's a little mind-bending. No, you're not bugging. π
Careful though!! A DSQ can only be used as a FIFO or a priority queue at any given time. So you must not call this function on a DSQ which already has one or more FIFO tasks queued β and vice-versa. Don't mix, it's not a vibe. Also: the built-in DSQs (SCX_DSQ_LOCALandSCX_DSQ_GLOBAL) cannot be used as priority queues. Periodt.
Returns true on successful insertion, false on failure. π And here's the cute part β on the root scheduler, a false return triggers a scheduler abort, so the caller doesn't even need to check the return value. She handles it. She's got you. π
π SEE ALSO π
Kernel file ./kernel/sched/ext/ext.c, plus literally her entire extended friend group. Not me listing all of them. Okay I'm listing all of them. π
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_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)
Okay that's the whole page, you ate that. π She lives in ./kernel/sched/ext, this is the October 2026 edition, and that's the whole manual-name-and-date situation handled β mwah, bye bestie! π§πΈ
π¦ 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