for_each_cpu_or(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’– for_each_cpu_or(9) β€” like, the Kernel API Manual, bestie πŸ’–

okay so this is a page from the Kernel API Manual and it's literally all about for_each_cpu_or, and by the end you're gonna be obsessed, i promise 🫢


✨ NAME ✨

for_each_cpu_or β€” loop over every single cpu that's present in either mask πŸ’… like, mask1 or mask2, union vibes only, no cap.


🌸 SYNOPSIS 🌸

for_each_cpu_or (cpu , mask1 , mask2 );

that's it. that's the whole call. iconic behavior honestly πŸŽ€


πŸ¦‹ ARGUMENTS πŸ¦‹

  • cpu β€” the iterator, which is an (optionally unsigned) integer. yes bestie, optionally unsigned, it says so right there 😌
  • mask1 β€” the first cpumask pointer. the first one. the og. ✨
  • mask2 β€” the second cpumask pointer. the other one. also valid. we love them both πŸ’œ

πŸ”₯ DESCRIPTION πŸ”₯

so the whole point of this thing? it saves you a temporary CPU mask in, like, so many places. the way it's literally just shorthand for this whole situation:

struct cpumask tmp; cpumask_or(tmp, mask1, mask2); for_each_cpu(cpu, tmp) ...

so instead of you writing out tmp yourself every single time like some kind of medieval peasant, you just call for_each_cpu_or and it handles it. slay. 🧚

⚠️ one thing to keep in your cute little head: after the loop, cpu is >= nr_cpu_ids. that's just how it is. don't be weird about it. πŸ’€

πŸ‘‘ SEE ALSO πŸ‘‘

okay here comes the friend group β€” literally the entire Kernel file ./include/linux/cpumask.h squad, and they ALL showed up to the party 🌈:

cpumask_pr_args(9), cpumask_first(9), cpumask_first_zero(9), cpumask_first_and(9), cpumask_first_andnot(9), cpumask_first_and_and(9), cpumask_last(9), cpumask_next(9), cpumask_next_zero(9), cpumask_next_and(9), cpumask_next_andnot(9), cpumask_next_and_wrap(9), cpumask_next_wrap(9), cpumask_random(9), for_each_cpu(9), for_each_cpu_wrap(9), for_each_cpu_and(9), for_each_cpu_andnot(9), for_each_cpu_from(9), cpumask_any_but(9), cpumask_any_and_but(9), cpumask_any_andnot_but(9), cpumask_nth(9), cpumask_nth_and(9), cpumask_nth_and_andnot(9), cpumask_set_cpu(9), cpumask_clear_cpus(9), cpumask_clear_cpu(9), cpumask_test_cpu(9), cpumask_test_and_set_cpu(9), cpumask_test_and_clear_cpu(9), cpumask_setall(9), cpumask_clear(9), cpumask_and(9), cpumask_or(9), cpumask_weighted_or(9), cpumask_xor(9), cpumask_andnot(9), cpumask_equal(9), cpumask_or_equal(9), cpumask_intersects(9), cpumask_subset(9), cpumask_empty(9), cpumask_full(9), cpumask_weight(9), cpumask_weight_and(9), cpumask_weight_andnot(9), cpumask_shift_right(9), cpumask_shift_left(9), cpumask_copy(9), cpumask_any(9), cpumask_any_and(9), cpumask_of(9), cpumask_parse_user(9), cpumask_parselist_user(9), cpumask_parse(9), cpulist_parse(9), cpumask_size(9), alloc_cpumask_var(9), to_cpumask(9), num_online_cpus(9), cpumap_print_bitmask_to_buf(9), cpumap_print_list_to_buf(9)

like… the whole extended family. iykyk πŸ’…


and that's the page!! mwah πŸ’‹ this little icon lives in ./include/linux, dated October 2026, and it answers to the name for_each_cpu_or(9) β€” go forth and iterate, bestie, you're gonna do amazing πŸ©·β­πŸ¦‹

πŸ“¦ where this page comes from