cpumask_first_and(9)
πΈ NAME πΈ
cpumask_first_and β bestie, this is the one that returns the first cpu from *srcp1 & *srcp2, okay?? Like, you hand it two cpumasks, it finds the CPUs they share, and it gives you the lowest-numbered one of that overlap. Iconic behaviour, honestly. π
β¨ SYNOPSIS β¨
unsigned int cpumask_first_and (const struct cpumask *srcp1 , const struct cpumask *srcp2 );
Lowkey the whole personality of this function is right there in one line. π«Ά
π¦ ARGUMENTS π¦
srcp1β the first input. that's it, that's the descriptor, she's your first mask πsrcp2β the second input. the other half of the&, she's the second mask π
ngl the manpage keeps these two descriptions so short, but the vibe check is clear: both are const struct cpumask *, both get AND-ed together, both matter. no cap. β¨
π RETURN π
>= nr_cpu_ids if no cpus set in both. π
Read that again, gently: if the two masks share zero CPUs, you don't get a real CPU back β you get a value >= nr_cpu_ids (i.e. not a valid CPU id at all), so go check for it, bestie, don't just index an array with it. fr fr.
See also cpumask_next_and. π
π SEE ALSO π
Okay so the friend group is huge, and honestly they all ate. Kernel file ./include/linux/cpumask.h:
- The first-cpu crew:
cpumask_pr_args(9),cpumask_first(9),cpumask_first_zero(9),cpumask_first_andnot(9),cpumask_first_and_and(9),cpumask_last(9) - The next-cpu crew:
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) - The loops:
for_each_cpu(9),for_each_cpu_wrap(9),for_each_cpu_and(9),for_each_cpu_andnot(9),for_each_cpu_or(9),for_each_cpu_from(9) - The "any but" / nth squad:
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) - The setters and testers:
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) - The bitwise besties:
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) - The any / of crew:
cpumask_any(9),cpumask_any_and(9),cpumask_of(9) - The parsing girlies:
cpumask_parse_user(9),cpumask_parselist_user(9),cpumask_parse(9),cpulist_parse(9) - The allocation and misc crew:
cpumask_size(9),alloc_cpumask_var(9),to_cpumask(9),num_online_cpus(9) - The printing divas:
cpumap_print_bitmask_to_buf(9),cpumap_print_list_to_buf(9)
Likeβ¦ the whole cpumask family showed up to the group chat. obsessed. π§π
π reminder bestie: >= nr_cpu_ids means no shared CPUs, not "cpu number thirty-something". do not pass go, do not index anything.
and that's the page!! π source is ./include/linux, dated October 2026, and the manual is cpumask_first_and(9) β mwah, go read cpumask_next_and(9) next, ily, bye!! ππβ¨
π¦ 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