/proc/cpuinfo vs. processor groups

Achim Gratz Stromeko@nexgo.de
Tue Apr 10 16:36:00 GMT 2018


As briefly discussed on IRC I've got a new Server 2016 blade with 2
sockets × 8 cores × 2 HT =32 logical processors and Cygwin spews errors
for processor ID 16 and up (also top doesn't quite work, which likely
has the same reason, although the code path may be unrelated to the
/proc/cpuinfo bug described here).

--8<---------------cut here---------------start------------->8---
64bit (166)~ > cat /proc/cpuinfo
      0 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(10000,0 (10/16)) failed Win32 error 87
    209 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(20000,0 (11/17)) failed Win32 error 87
    913 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(40000,0 (12/18)) failed Win32 error 87
   1047 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(80000,0 (13/19)) failed Win32 error 87
   1151 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(100000,0 (14/20)) failed Win32 error 87
   1266 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(200000,0 (15/21)) failed Win32 error 87
   1383 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(400000,0 (16/22)) failed Win32 error 87
   1479 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(800000,0 (17/23)) failed Win32 error 87
   1573 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(1000000,0 (18/24)) failed Win32 error 87
   1675 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(2000000,0 (19/25)) failed Win32 error 87
   1806 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(4000000,0 (1A/26)) failed Win32 error 87
   1888 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(8000000,0 (1B/27)) failed Win32 error 87
   1971 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(10000000,0 (1C/28)) failed Win32 error 87
   2069 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(20000000,0 (1D/29)) failed Win32 error 87
   2154 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(40000000,0 (1E/30)) failed Win32 error 87
   2247 [main] cat 10068 format_proc_cpuinfo: SetThreadGroupAffinity(80000000,0 (1F/31)) failed Win32 error 87
--8<---------------cut here---------------end--------------->8---

It turns out this is related to processor groups and some changes that
probably weren't even in the making when the Cygwin code was written.
These changes were opt-in patches until 2008R2, but are now the default
in 2016:

https://blogs.msdn.microsoft.com/saponsqlserver/2011/10/08/uneven-windows-processor-groups/

The BIOS on that server does something rather peculiar (it does make
sense in a way, but Cygwin clearly didn't expect it):

https://support.hpe.com/hpsc/doc/public/display?sp4ts.oid=7271227&docId=emr_na-c04650594&docLocale=en_US

This results in Windows coming up with two 64 core processor groups that
have 16 active logical processors each:

--8<---------------cut here---------------start------------->8---
(gdb) print plpi
$1 = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX) 0x600008020
(gdb) print *plpi
$2 = {Relationship = RelationGroup, Size = 128, {Processor = {Flags = 2 '\002', Reserved = "\000\002", '\000' <repeats 18 times>, GroupCount = 0,
      GroupMask = {{Mask = 4160, Group = 0, Reserved = {0, 0, 0}}}}, NumaNode = {NodeNumber = 131074, Reserved = '\000' <repeats 19 times>,
      GroupMask = {Mask = 4160, Group = 0, Reserved = {0, 0, 0}}}, Cache = {Level = 2 '\002', Associativity = 0 '\000', LineSize = 2, CacheSize = 0,
      Type = CacheUnified, Reserved = '\000' <repeats 12 times>, "@\020\000\000\000\000\000", GroupMask = {Mask = 0, Group = 0, Reserved = {0, 0,
          0}}}, Group = {MaximumGroupCount = 2, ActiveGroupCount = 2, Reserved = '\000' <repeats 19 times>, GroupInfo = {{
          MaximumProcessorCount = 64 '@', ActiveProcessorCount = 16 '\020', Reserved = '\000' <repeats 37 times>, ActiveProcessorMask = 65535}}}}}
--8<---------------cut here---------------end--------------->8---

I've confirmed that the error message is not printed if I manually
correct the information for processor ID 17 as follows:

--8<---------------cut here---------------start------------->8---
(gdb) print affinity                                                                                                                                                            
$2 = {Mask = 131072, Group = 0, Reserved = {0, 0, 0}}                                                                                                                           
(gdb) set affinity.Mask=2                                                                                                                                                       
(gdb) set affinity.Group=1
--8<---------------cut here---------------end--------------->8---

However, the same or possibly even stranger processor group setups can
be created using boot options that force different organizations of
processor groups.  There is an option to force a seperate processor
group for each NUMA node and another one to force a specific number of
groups.  The upshot is that even the first processor groups may not have
the maximum number of processors present, so you need to check the
number of active processors instead.  I couldn't find out if the
processor mask is still guaranteed to be filled from the LSB contigously
or whether one can rely on only the last group to have less than the
first few.  It seems more prudent to check the group specific
ActiveProcessorMask, although that significantly complicates the code.
I don't think Windows can currently switch CPU online/offline when
booted.


As an aside, the cache size is reported as 256kiB (not just for this
processor, but also for a Celeron 1037U on another machine), which seems
to be the L2 cache for a single hardware core on these architectures.
Linux now reports L3 cache sizes (and possibly L4 if present) for these
(20MiB and 2MiB per socket respectively).


Regards,
Achim.
--
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

Factory and User Sound Singles for Waldorf Blofeld:
http://Synth.Stromeko.net/Downloads.html#WaldorfSounds



More information about the Cygwin-apps mailing list