idle_worker_timeout(9)
π idle_worker_timeout(9) π
okay bestie, we're deep in the Kernel API Manual today β yes, that manual, the one with the big workqueue lore. sit down, hydrate, this one's a little timer callback and it's lowkey iconic π
β¨ NAME β¨
idle_worker_timeout β check if some idle workers can now be deleted. fr fr that's the whole job. it's giving "uninvited guest doing the vibe check at the door" πͺπ
πΈ SYNOPSIS πΈ
void idle_worker_timeout (struct timer_list *t );
π¦ ARGUMENTS π¦
tβ the pool'sidle_timerthat just expired. like, it literally just went off, and now it's here asking for attention π«Ά
π₯ DESCRIPTION π₯
okay so the timer gets armed in worker_enter_idle. that's the setup, that's the glow-up moment, that's when the clock starts π
but here's the twist β it is not disarmed in worker_leave_idle. and ngl that's on purpose, bestie π
the reason? a worker flicking between idle and active while its pool is sitting at the too_many_workers tipping point would cause too much timer housekeeping overhead. like, imagine arming and disarming and arming and disarming β the CPU said "not me doing all that" π so we just don't.
and since IDLE_WORKER_TIMEOUT is long enough (it's long, she's patient, she's got main character energy β¨), we just let it expire and re-evaluate things from there. no micromanaging. no cap. we let the timer cook, then we look around and re-decide. periodt π
bestie note: the "don't disarm" thing isn't a bug, it's a deliberate trade-off. do not go "fixing" it π
π SEE ALSO π
so many friends, so little time π«Ά first up, the kernel file itself β ./kernel/workqueue.c β and then the whole group chat:
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_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) π
mwah, that's the page π this little drop came out of ./kernel, dated October 2026 β so go forth, let the timer expire, and re-evaluate your life from there π§β¨
π¦ 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