drain_workqueue(9)
π drain_workqueue(9) β Kernel API Manual, but make it make sense
okay so real talk, this is from the Kernel API Manual and it's literally one function but she's important bestie. let's get into it π«Ά
β¨ NAME
drain_workqueue β drain a workqueue. that's it. that's the whole name. iconic, concise, no notes π
πΈ SYNOPSIS
void drain_workqueue (struct workqueue_struct *wq );
copy it exactly like that, please and thank you, no cap π
π¦ ARGUMENTS
wqβ the workqueue to drain. this is the one you're draining. the main character of this whole operation β¨
π₯ DESCRIPTION
okay so here's the vibe: you wait until the workqueue becomes empty. simple as that. but the way it happens is lowkey interesting so pay attention π
while draining is in progress, only chain queueing is allowed. IOW (in other words, bestie), only currently pending or running work items on wq can queue further work items on it. so likeβ¦ no random new stuff cutting the line, only the stuff already in the building gets to invite friends. make sense? π
wq is flushed repeatedly until it becomes empty. the number of flushing is determined by the depth of chaining and should be relatively short β so like, don't panic, it's not gonna loop forever (probably, it's designed not to) π§
and then the best part: Whine if it takes too long. yes literally. she complains. she's allowed. we love a system that self-advocates π
ngl this one is straightforward but the chaining rule is the part people forget β only currently pending or running work items on wq get to queue more work on it while the drain is happening. don't come at her with new stuff π
β SEE ALSO
buckle up bestie, this list is long β but every single one of these is part of the family so we're listing them all, no skipping, periodt π
- Kernel file
./kernel/workqueue.c 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)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 I said. long. but she ate, honestly π β¨
that's the whole page bestie! this one lives in the ./kernel source, version dated October 2026, and it's filed under drain_workqueue(9) β go drain that queue and slay ππ«Άπ
π¦ 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