sched_getaffinity() always returns the full cpu mask
Mark Geisert
mark@maxrnd.com
Sun Mar 9 05:32:33 GMT 2025
Hi Christian,
On 3/8/2025 9:11 AM, Christian Franke via Cygwin wrote:
> Testcase:
>
> $ grep processor /proc/cpuinfo | tail -1 # i7-14700K
> processor : 27
>
> $ sleep 60 & taskset 0x1 sleep 60 &
> [1] 62094
> [2] 62095
>
> $ taskset -p 62094
> pid 62094's current affinity mask: fffffff
>
> $ taskset -p 62095
> pid 62095's current affinity mask: fffffff
>
>
> Another test shows that the affinity mask is correctly set to 0x1 by
> sched_setaffinity().
>
> In sched.cc:__sched_getaffinity_sys(), GetProcessAffinityMask() is
> called, but its 'procmask' result is never used. The returned cpu_set is
> build using groupmask(__get_cpus_per_group ()) which is constant, here
> 0xfffffff. The original commit 641ecb07 likely worked (until 687c4bad^)
> on older Windows versions which did not support cpu groups.
>
> I don't know how to fix this for systems with more than one cpu group,
> so no patch provided.
>
> It might be needed to handle interesting corner cases: "If the process
> had explicitly set the affinity of one or more of its threads outside of
> the process' primary group, the function returns zero for both affinity
> masks."
> https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-
> getprocessaffinitymask
Thanks very much for the report and diagnosis. I will investigate shortly.
..mark
More information about the Cygwin
mailing list