• Yinghai Lu's avatar
    x86: Fix APIC ID sizing bug on larger systems, clean up MAX_APICS confusion · cb2ded37
    Yinghai Lu authored
    Found one x2apic pre-enabled system, x2apic_mode suddenly get
    corrupted after register some cpus, when compiled
    CONFIG_NR_CPUS=255 instead of 512.
    
    It turns out that generic_processor_info() ==> phyid_set(apicid,
    phys_cpu_present_map) causes the problem.
    
    phys_cpu_present_map is sized by MAX_APICS bits, and pre-enabled
    system some cpus have an apic id > 255.
    
    The variable after phys_cpu_present_map may get corrupted
    silently:
    
     ffffffff828e8420 B phys_cpu_present_map
     ffffffff828e8440 B apic_verbosity
     ffffffff828e8444 B local_apic_timer_c2_ok
     ffffffff828e8448 B disable_apic
     ffffffff828e844c B x2apic_mode
     ffffffff828e8450 B x2apic_disabled
     ffffffff828e8454 B num_processors
     ...
    
    Actually phys_cpu_present_map is referenced via apic id, instead
    index. We should use MAX_LOCAL_APIC instead MAX_APICS.
    
    For 64-bit it will be 32768 in all cases. BSS will increase by 4k bytes
    on 64-bit:
    
    	text		data		bss		dec		filename
    	21696943	4193748		12787712	38678403	vmlinux.before
    	21696943	4193748		12791808	38682499	vmlinux.after
    
    No change on 32bit.
    
    Finally we can remove MAX_APCIS that was rather confusing.
    Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
    Cc: H. Peter Anvin <hpa@linux.intel.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    LKML-Reference: <4D23BD9C.3070102@kernel.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    cb2ded37
mpspec.h 4.69 KB