Skip to content
  • Yinghai Lu's avatar
    x86, acpi: Parse all SRAT cpu entries even above the cpu number limitation · d3bd0588
    Yinghai Lu authored
    Recent Intel new system have different order in MADT, aka will list all thread0
    at first, then all thread1.
    But SRAT table still old order, it will list cpus in one socket all together.
    
    If the user have compiled limited NR_CPUS or boot with nr_cpus=, could have missed
    to put some cpus apic id to node mapping into apicid_to_node[].
    
    for example for 4 sockets system with 64 cpus with nr_cpus=32 will get crash...
    
    [    9.106288] Total of 32 processors activated (136190.88 BogoMIPS).
    [    9.235021] divide error: 0000 [#1] SMP
    [    9.235315] last sysfs file:
    [    9.235481] CPU 1
    [    9.235592] Modules linked in:
    [    9.245398]
    [    9.245478] Pid: 2, comm: kthreadd Not tainted 2.6.37-rc1-tip-yh-01782-ge92ef79-dirty #274      /Sun Fire x4800
    [    9.265415] RIP: 0010:[<ffffffff81075a8f>]  [<ffffffff81075a8f>] select_task_rq_fair+0x4f0/0x623
    ...
    [    9.645938] RIP  [<ffffffff81075a8f>] select_task_rq_fair+0x4f0/0x623
    [    9.665356]  RSP <ffff88103f8d1c40>
    [    9.665568] ---[ end trace 2296156d35fdfc87 ]---
    
    So let just parse all cpu entries in SRAT.
    
    Also add apicid checking with MAX_LOCAL_APIC, in case We could out of boundaries of
    apicid_to_node[].
    
    it fixes following bug too.
    https://bugzilla.kernel.org/show_bug.cgi?id=22662
    
    
    
    -v2: expand to 32bit according to hpa
       need to add MAX_LOCAL_APIC for 32bit
    
    Reported-and-Tested-by: default avatarWu Fengguang <fengguang.wu@intel.com>
    Reported-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
    Tested-by: default avatarMyron Stowe <myron.stowe@hp.com>
    Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
    LKML-Reference: <4D0AD486.9020704@kernel.org>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    d3bd0588