insert_work(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… insert_work(9) β€” the Kernel API Manual, but make it make sense ✨

okay so bestie, you found yourself in the insert_work(9) page of the Kernel API Manual and honestly? it's a tiny one, so let's get you fluent in like thirty seconds 🫢


✨ NAME ✨

insert_work β€” insert a work into a pool. that's it. that's the whole thing. no cap. πŸŽ€


🌸 SYNOPSIS 🌸

void insert_work (struct pool_workqueue *pwq , struct work_struct *work
, struct list_head *head , unsigned int extra_flags );

look at that signature, it's giving "small function, big responsibilities" πŸ’…


πŸ¦‹ ARGUMENTS πŸ¦‹

  • pwq β€” the pwq that this work belongs to, like whose group chat it's in πŸ’–
  • work β€” the actual work you're inserting. the main character of this whole operation πŸ‘‘
  • head β€” the insertion point. where it goes. the seating chart, basically πŸ™ˆ
  • extra_flags β€” extra WORK_STRUCT_* flags to set. yes, they're extra, they're the sparkle ✨

🧚 DESCRIPTION 🧚

so what actually happens: you insert work β€” which belongs to pwq β€” after head. that's the whole move. it's the "slide into the conversation right after this message" of kernel internals πŸ’€

and extra_flags? those get or'd into the work_struct flags. so like, OR'd. bitwise. not "or, whatever" β€” actual bitwise or, no cap πŸ”₯


πŸ”’ CONTEXT πŸ”’

this one runs under raw_spin_lock_irq(pool->lock).

no, seriously β€” that's the context. mind the lock, bestie. it's not a suggestion, it's the vibe check you must pass 😭

ngl, lock context is not the moment to freestyle. it's the moment to already be holding pool->lock with irqs off, periodt. πŸ”

🌈 SEE ALSO 🌈

the original page points you at the kernel file ./kernel/workqueue.c, and then it just... keeps going. and going. and going. so here it is, all of it, in order, no skipping β€” 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), 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_early(9), workqueue_init(9), llc_count_cores(9), llc_populate_cpu_shard_id(9), precompute_cache_shard_ids(9), workqueue_init_topology(9)

like, that's the entire workqueue extended family showing up to the function's birthday party πŸŽ‚ literally everyone is here. iykyk πŸ’œ


that's the page, bestie β€” you ate. go hold that pool->lock and insert some work πŸ¦‹

signed off with love from the ./kernel source, October 2026, page insert_work(9) β€” see you in the next man page, mwah πŸ’‹

πŸ“¦ where this page comes from