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