BUG/MINOR: cpu_topo: work around a small bug in musl's CPU_ISSET()
authorWilly Tarreau <w@1wt.eu>
Sat, 6 Sep 2025 08:50:31 +0000 (10:50 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 1 Oct 2025 14:48:35 +0000 (16:48 +0200)
commit8773410a9d5aff3f222c7ab063170248df88bfbd
tree9c9fd203d1e234370e025f1d19d4f82eacc4ee11
parent251cf06748fb0d8366ac6bba8125e633dac96678
BUG/MINOR: cpu_topo: work around a small bug in musl's CPU_ISSET()

As found in GH issue #3103, CPU_ISSET() on musl 1.25 doesn't match the man
page which says it's returning an int. The reason is pretty simple, it's
a macro that operates on the bits directly and returns the result of the
bit field applied to the mask as an unsigned long. Bits above 31 will
simply be dropped if returned as an int, which causes CPUs 32..63 to
appear as absent from cpu_sets.

The fix is trivial, it consists in just comparing the result against zero
(i.e. turning it to a boolean), but before it's merged and deployed we'll
have to face such deployments, so better implement the same workaround
in the code here since we have access to the raw long value.

This workaround should be backported to 3.0.

(cherry picked from commit 75bd9255dd04d9247f1e555023cc45f5e17936ca)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 3847df920f4610c5b03061b9f3da6ca295fda228)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit ac35ac8af7232002a0692ea03b25129fd9dd7edb)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
src/cpuset.c