wq_calc_pod_cpumask(9)

๐Ÿ“ฆ version 7.3.1, in nixpkgs unstable

๐ŸŒธ wq_calc_pod_cpumask โ€” kernel API manual, but make it cute ๐ŸŒธ

okay bestie, this is wq_calc_pod_cpumask(9) from the kernel API manual โ€” yes the whole manpage, yes we're reading it together, no you cannot skip it ๐Ÿ’…


โœจ NAME โœจ

wq_calc_pod_cpumask โ€” literally the function that calculates a wq_attrs' cpumask for a pod ๐ŸŽ€


โœจ SYNOPSIS โœจ

void wq_calc_pod_cpumask (struct workqueue_attrs *attrs , int cpu );

that's it. that's the whole signature. main character energy fr fr ๐Ÿ‘‘


โœจ ARGUMENTS โœจ

  • attrs โ€” the wq_attrs of the default pwq of the target workqueue. like, the actual object we're poking at ๐Ÿซถ
  • cpu โ€” the target CPU. that's the CPU, bestie ๐Ÿ–ฅ๏ธโœจ

โœจ DESCRIPTION โœจ

so the whole vibe of this function: it calculates the cpumask that a workqueue with attrs should use on a pod, and the result gets stored in attrs->__pod_cpumask ๐Ÿ’พ โ€” that's the field, don't @ me, it really has the double underscore.

here's the tea on how it picks ๐ŸŒˆ:

  • if pod affinity is not enabled, then attrs->cpumask is always used. like, always, no negotiations ๐Ÿ’€
  • if pod affinity is enabled and the pod has online CPUs requested by attrs, then the cpumask it hands back is the intersection of the possible CPUs of the pod and attrs->cpumask. set math, slay ๐Ÿงฎโœจ
โš ๏ธ and this is the part where you pay attention: the caller is responsible for ensuring that the cpumask of the pod stays stable. that's on you, bestie. it's giving "you break it you bought it" ๐Ÿ˜ญ๐Ÿซถ

โœจ SEE ALSO โœจ

okay so the kernel file ./kernel/workqueue.c is the mothership ๐Ÿ , and here's the entire friend group, no cap โ€” 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).

the saga continues ๐Ÿฆ‹ โ€” 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).

still going, iykyk ๐ŸŒธ โ€” 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), 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).

last stretch bestie, we're so close ๐Ÿ”ฅ โ€” 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โ€ฆ all of them. every single one. ate and left no crumbs ๐Ÿ“๐Ÿ‘‘


anyway that's the whole page ๐Ÿงš this lil cutie lives in ./kernel, and this edition is dated October 2026 โ€” so if you're reading this from the future, hiiii, hope the cpumasks are stable ๐Ÿ’–๐Ÿฆ‹ periodt.

๐Ÿ“ฆ where this page comes from