rescuer_thread(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

🌸 NAME 🌸

okay so this is rescuer_thread(9) from the Kernel API Manual, bestie, and the name is literally rescuer_thread β€” the rescuer thread function. that's the whole vibe. πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

int rescuer_thread (void *__rescuer );

πŸ¦‹ ARGUMENTS πŸ¦‹

  • __rescuer β€” self. that's it. it's giving β€œjust pass yourself, bestie” πŸͺžβœ¨

🌸 DESCRIPTION 🌸

okay so picture the workqueue rescuer thread function. there is one rescuer for each workqueue that has WQ_MEM_RECLAIM set. one per workqueue, no sharing, no cap. πŸ‘‘

regular work processing on a pool may block trying to create a new worker which uses GFP_KERNEL allocation β€” and there’s a slight chance of that developing into deadlock if some works currently on the same queue need to be processed to satisfy the GFP_KERNEL allocation. that is exactly the problem the rescuer solves. 😭πŸ”₯

when that kind of condition is possible, the pool summons the rescuers of all workqueues which have works queued on the pool and lets them process those works so that forward progress can be guaranteed. slay, forward progress secured. 🫢✨

this should happen rarely. like, not an everyday thing, bestie β€” rare. πŸ™ˆπŸ’œ


πŸ’– RETURN πŸ’–

0. that's the return value. no cap. ⭐


🌈 SEE ALSO 🌈

the Kernel file is ./kernel/workqueue.c, and here’s the complete extended-universe roll call, fr fr:

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),
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)

byeee bestie 🫢 β€” source/version ./kernel; date October 2026; page rescuer_thread(9) πŸ’…

πŸ“¦ where this page comes from