scx_bpf_now(9)
π scx_bpf_now β Kernel API Manual, but make it make sense π«Ά
okay bestie, so this page is scx_bpf_now(9) from the Kernel API Manual and it's literally about getting a clock. sounds boring? no. because this clock is fast. let's get into it β¨
πΈ NAME πΈ
scx_bpf_now β returns a high-performance, monotonically non-decreasing clock for the current CPU. and like, the clock it hands you back is in nanoseconds. that's it. that's the vibe π
π SYNOPSIS π
__bpf_kfunc u64 scx_bpf_now (void );
literally just call it. no cap.
π¦ ARGUMENTS π¦
voidβ no arguments. none. zero. it takes nothing, it gives you nanoseconds. icon behaviour, honestly π
β¨ DESCRIPTION β¨
okay so here's the tea β it provides these properties, and yes we're doing all three, numbered, in order:
- High performance β so many BPF schedulers call
bpf_ktime_get_nsconstantly to account for execution time and track tasks' runtime properties. obsessed with the diligence, but here's the problem π: on some hardware platforms,bpf_ktime_get_nsβ which eventually reads a hardware timestamp counter β is neither performant nor scalable. soscx_bpf_nowaims to provide a high-performance clock by using the rq clock in the scheduler core whenever possible. yes ma'am π«Ά - High enough resolution for the BPF scheduler use cases β in most BPF scheduler use cases, the required clock resolution is lower than the most accurate hardware clock (e.g.,
rdtscin x86).scx_bpf_nowbasically uses the rq clock in the scheduler core whenever it is valid. and what counts as valid? it considers that the rq clock is valid from the time the rq clock is updated (update_rq_clock) until the rq is unlocked (rq_unpin_lock). write that down π - Monotonically non-decreasing clock for the same CPU β
scx_bpf_nowguarantees the clock never goes backward when comparing them in the same CPU. but bestie, hear me: when comparing clocks in different CPUs, there is no such guarantee β the clock can go backward. it provides a monotonically non-decreasing clock so that it would provide the same clock values in two differentscx_bpf_nowcalls in the same CPU during the same period of when the rq clock is valid. say it with me: same CPU, safe π different CPU, watch out π
β οΈ not me warning you twice: cross-CPU comparisons can go backward. that's not a bug, that's just the deal. π
π SEE ALSO π
before you go, the whole extended friend group. the Kernel file ./kernel/sched/ext/ext.c and, like, everyone:
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_locked_rq(9)scx_bpf_cpu_curr(9)scx_bpf_cid_curr(9)scx_bpf_tid_to_task(9)scx_bpf_events(9)scx_bpf_task_cgroup(9)
π ok that's the whole page, bye π
this iconic little number came out of ./kernel/sched/ext and it's dated October 2026. go call scx_bpf_now responsibly, and remember: same CPU = monotonic, different CPU = chaos πβ¨π
π¦ 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