pwq_dec_nr_active(9)
π pwq_dec_nr_active β a Kernel API Manual moment (section 9, bestie)
Okay so this is a page from the Kernel API Manual, and honestly it's one of those tiny little functions that does a huge amount of emotional (and scheduler) labor π«Ά. Let's get into it.
πΈ NAME πΈ
pwq_dec_nr_active β retire an active count β¨
Like, it takes one (1) active count out of the group chat and quietly retires it. No drama, just bookkeeping π .
π¦ SYNOPSIS π¦
void pwq_dec_nr_active (struct pool_workqueue *pwq );
Returns void, so no surprises, no callback chaos, we love a low-stakes queen π.
π ARGUMENTS π
pwqβ thepool_workqueueof interest. That's the one you're looking at. The main character, if you will π.
π DESCRIPTION π
So here's the vibe: this function decrements pwq's nr_active β yes, the count goes down by one, icon behavior β and then it tries to activate the first inactive work item π₯. Like, a slot just freed up, so it goes and taps the next work item on the shoulder and is like "you're up, bestie."
And here's the spicy part πΆοΈ: for unbound workqueues, this function may temporarily drop pwq->pool->lock. So the lock is not held for the whole ride β it lets go for a sec, which is exactly the kind of thing you want to know before you go assuming anything about locking around here, ngl π. That's a real caveat, so don't sleep on it.
β SEE ALSO β
Go read the source, and then go read all of these, because the cross-reference game here is genuinely unmatched β it's giving "linked list of knowledge" π. The kernel file is ./kernel/workqueue.c, and the gang is:
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_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),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 whole workqueue cinematic universe in one SEE ALSO, and every single one of them is a real page β go click through them, iykyk π
π§ sign-off π§
This lil beauty lives in ./kernel (yes, the source tree, mwah π), it's the October 2026 vintage, and its whole name-tag says pwq_dec_nr_active(9). Go forth, decrement responsibly, and remember: the lock might briefly dip out on unbound workqueues πβ¨ periodt.
π¦ 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