workqueue_init_early(9)
π workqueue_init_early β like, the first first step π
Bestie, welcome to the Kernel API Manual (that's the manual name, slay, now you know). This page is about workqueue_init_early(9) and it's genuinely the opening act of the whole workqueue situation. Let's get into it π
β¨ NAME β¨
workqueue_init_early β early init for workqueue subsystem π§
πΈ SYNOPSIS πΈ
void workqueue_init_early (void );
π¦ ARGUMENTS π¦
voidβ no arguments. Zero. None. She takes nothing, she gives everything π
π DESCRIPTION π
Okay so listen. Workqueue subsystem initialization is a three-staged whole thing, and workqueue_init_early is literally the first step of the three. First. Main character energy, no cap π
She gets invoked as soon as the bare basics are up β and by bare basics we mean:
- memory allocation
- cpumasks
- idr
That's it. That's the bar. Once those three are alive, this function walks in π
What she does with that moment: sets up all the data structures and all the system workqueues, and she makes it so that early boot code is allowed to create workqueues and queue/cancel work items. So the early boot girlies can go ahead and get their stuff queued up.
But here's the important part, and I need you to hear me on this one: actual work item execution starts only after kthreads can be created and scheduled, which happens right before early initcalls.
So likeβ¦ you can queue, you can cancel, you can create your little workqueues π β but nothing actually runs until the kthreads exist and can be scheduled. That's the vibe check. Don't expect execution before then, fr fr π
π₯ SEE ALSO π₯
Kernel file ./kernel/workqueue.c β and then, bestie, the whole extended universe of cross-references. Every single one, in order, no skips, because we don't do that here π«Ά
for_each_pool(9),for_each_pool_worker(9),for_each_pwq(9),worker_pool_assign_id(9),unbound_effective_cpumask(9),get_work_pool(9),worker_set_flags(9),worker_clr_flags(9),worker_enter_idle(9),worker_leave_idle(9)find_worker_executing_work(9),move_linked_works(9),assign_work(9),kick_pool_pick(9),kick_pool(9),wq_worker_running(9),wq_worker_sleeping(9),wq_worker_tick(9),wq_worker_last_func(9),wq_node_nr_active(9)wq_update_node_max_active(9),get_pwq(9),put_pwq(9),put_pwq_unlocked(9),pwq_tryinc_nr_active(9),pwq_activate_first_inactive(9),unplug_oldest_pwq(9),node_activate_pending_pwq(9),pwq_dec_nr_active(9),pwq_dec_nr_in_flight(9)try_to_grab_pending(9),work_grab_pending(9),insert_work(9),queue_work_on(9),select_numa_node_cpu(9),queue_work_node(9),queue_delayed_work_on(9),mod_delayed_work_on(9),queue_rcu_work(9),worker_attach_to_pool(9)worker_detach_from_pool(9),create_worker(9),set_worker_dying(9),idle_worker_timeout(9),idle_cull_fn(9),maybe_create_worker(9),manage_workers(9),process_one_work(9),process_scheduled_works(9),worker_thread(9)rescuer_thread(9),check_flush_dependency(9),insert_wq_barrier(9),flush_workqueue_prep_pwqs(9),__flush_workqueue(9),drain_workqueue(9),flush_work(9),flush_delayed_work(9),flush_rcu_work(9),cancel_work_sync(9)cancel_delayed_work(9),cancel_delayed_work_sync(9),disable_work(9),disable_work_sync(9),enable_work(9),disable_delayed_work(9),disable_delayed_work_sync(9),enable_delayed_work(9),schedule_on_each_cpu(9),execute_in_process_context(9)free_workqueue_attrs(9),alloc_workqueue_attrs(9),init_worker_pool(9),put_unbound_pool(9),get_unbound_pool(9),wq_calc_pod_cpumask(9),apply_workqueue_attrs(9),unbound_wq_update_pwq(9),wq_adjust_max_active(9),destroy_workqueue(9)workqueue_set_max_active(9),workqueue_set_min_active(9),current_work(9),current_is_workqueue_rescuer(9),current_is_workqueue_mem_reclaim(9),workqueue_congested(9),work_busy(9),set_worker_desc(9),print_worker_info(9),show_one_workqueue(9)show_one_worker_pool(9),show_all_workqueues(9),show_freezable_workqueues(9),rebind_workers(9),restore_unbound_workers_cpumask(9),work_on_cpu_key(9),freeze_workqueues_begin(9),freeze_workqueues_busy(9),thaw_workqueues(9),workqueue_unbound_housekeeping_update(9)workqueue_set_unbound_cpumask(9),workqueue_sysfs_register(9),workqueue_sysfs_unregister(9),workqueue_init(9),llc_count_cores(9),llc_populate_cpu_shard_id(9),precompute_cache_shard_ids(9),workqueue_init_topology(9)
π That's a lot of cross-refs. Read them. All of them. I'm not kidding, iykyk.
π Okay that's the whole page, bestie! Cute little sign-off time: this one lives in the source directory ./kernel, it's dated October 2026, and the page itself is workqueue_init_early(9). Go forth and init early β¨ππ
π¦ 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