scx_bpf_task_set_slice(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… scx_bpf_task_set_slice β€” like, the manual page, bestie

okay so real talk, this is from the Kernel API Manual, section 9, and it's about setting a task's time slice. yes that time slice. put your seatbelt on, it's giving scheduler internals πŸŽ€


🌸 NAME 🌸

scx_bpf_task_set_slice β€” set the task's time slice, periodt


✨ SYNOPSIS ✨

__bpf_kfunc bool scx_bpf_task_set_slice (struct task_struct *p , u64
slice , const struct bpf_prog_aux *aux );

look at that signature. icon behavior honestly πŸ’…


🫢 ARGUMENTS 🫢

  • p β€” the task of interest. the main character, if you will πŸ‘‘
  • slice β€” the time slice you're setting, in nsecs (nanoseconds, bestie, not seconds, don't embarrass yourself)
  • aux β€” this one's the implicit BPF argument used to access bpf_prog_aux, and it's hidden from BPF progs. so like, it's there, but it's not for you πŸ™ˆ

πŸ¦‹ DESCRIPTION πŸ¦‹

So you wanna set p's time slice. valid. but first: p must be on the calling scheduler. no cap, that's not optional.

The value gets applied whether or not the caller holds p's rq lock β€” see the slice write rules above for the ownership model. (yes, "above." go read it, iykyk πŸ“–)

Now the fun part, the vibes check on raising vs. shortening:

  • Raising the slice is honored only while the scheduler holds SCX_CAP_BASE on p's cpu. if it doesn't? that raise gets counted in SCX_EV_SLICE_DENIED. denied. not today. πŸ’€
  • Shortening is always allowed. always. no gatekeeping. slay.

On the stashed path, the slice is packed into an atomic64_t together with the scheduler id and a flag bit β€” so if your slice is too large to fit, it gets clamped and counted in SCX_EV_SLICE_CLAMPED. it's giving "your baggage doesn't fit in this carry-on" 😭

Oh and SCX_SLICE_INF is preserved. special little guy, protected, we love to see it 🧚

Returns: true on success. false if p is not on the calling scheduler. that's the whole vibe check, fr fr.

πŸ‘‘ SEE ALSO πŸ‘‘

Kernel file ./kernel/sched/ext/ext.c β€” and honestly the whole extended family showed up to the group chat:

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_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)

like, the entire friend group. every single one. go say hi πŸ’–


okay that's the page!! mwah 🫢

🌈 from ./kernel/sched/ext β€” October 2026 β€” and the page itself is scx_bpf_task_set_slice(9). siging off, love u, read ur manpages πŸ’œ
πŸ“¦ where this page comes from