create_worker(9)
π create_worker π
okay so you're reading a kernel API manual page, section 9 of the manual set β the one for the big-kid internal kernel interfaces. this specific page is create_worker, and honestly? it's giving "small function, massive responsibility." let's get into it π«Ά
β¨ NAME β¨
create_worker β create a new workqueue worker π
like. literally that. it makes a worker. a whole little guy whose entire personality is "i run work items." iconic.
β¨ SYNOPSIS β¨
struct worker * create_worker (struct worker_pool *pool );
so it hands you back a struct worker * (pointer to a fresh worker, slay) and it takes exactly one thing: a struct worker_pool * named pool. one in, one out. balanced. we love a clean signature β¨
β¨ ARGUMENTS β¨
poolβ the pool your new worker is gonna belong to π« like, this is its home pool, its little found family, thestruct worker_poolit gets attached to.
β¨ DESCRIPTION β¨
okay so what actually happens: create_worker creates and starts a brand-new worker, and that worker is attached to pool πΈ
read that again bestie β it doesn't just allocate a struct and leave it there to vibe in the void. it creates and starts it. the worker gets made and it gets going, and it belongs to the pool you passed in. no cap, that's the whole thing. short function, short description, main character energy π₯
π CONTEXT π
might sleep. π΄ and it does GFP_KERNEL allocations.
fr fr, pay attention to this part β sleeping means don't call this from atomic context, because if you do it's gonna be a whole mess π GFP_KERNEL allocations can sleep too, so likeβ¦ yeah. keep it in a context where sleeping is legal, bestie. it's not a "whoops, try again" situation, it's a "you should not have done that" situation π
π RETURN π
a pointer to the newly created worker β that's it, that's the return value β the shiny new struct worker *. take it, it's yours now π
π¦ SEE ALSO π¦
bestie. sit down. π the original page points at the kernel file ./kernel/workqueue.c and then dumps what is essentially the entire workqueue cinematic universe on you. i'm not skipping a single one β here's the full squad, in order:
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)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_early(9)workqueue_init(9)llc_count_cores(9)llc_populate_cpu_shard_id(9)precompute_cache_shard_ids(9)workqueue_init_topology(9)
and that's the whole page, bestie π
this one ships out of the ./kernel source tree, dated October 2026 β so yeah, mark your calendar, that's the version you're reading. go forth and make workers π§π
π¦ 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