x86 fixes
Subsystems (2)
Linus,
Please pull the latest x86-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-urgent-for-linus
# HEAD: 7b0501b1e7cddd32b265178e32d332bdfbb532d4 x86/smp: Fix __max_logical_packages value setup
An initrd microcode loading fix, and an SMP bootup topology setup fix to resolve crashes on SGI/UV systems if the BIOS is configured in a certain way.
Thanks,
Ingo
------------------>
Borislav Petkov (1):
x86/microcode/AMD: Fix initrd loading with CONFIG_RANDOMIZE_MEMORY=y
Jiri Olsa (1):
x86/smp: Fix __max_logical_packages value setup
arch/x86/kernel/cpu/microcode/amd.c | 9 ++++++++- arch/x86/kernel/smpboot.c | 25 ++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-)
arch/x86/kernel/cpu/microcode/amd.c +8 -1
@@ -355,6 +355,7 @@ void load_ucode_amd_ap(void)unsigned int cpu =smp_processor_id ();struct equiv_cpu_entry *eq;struct microcode_amd *mc; +u8 *cont = container;u32 rev, eax;u16 eq_id;
@@ -371,8 +372,11 @@ void load_ucode_amd_ap(void)if (check_current_patch_level (&rev, false))return ; +/* Add CONFIG_RANDOMIZE_MEMORY offset. */ + cont +=PAGE_OFFSET - __PAGE_OFFSET_BASE; + eax =cpuid_eax (0x00000001 ); - eq = (struct equiv_cpu_entry *)(container +CONTAINER_HDR_SZ ); + eq = (struct equiv_cpu_entry *)(cont +CONTAINER_HDR_SZ ); eq_id =find_equiv_id (eq, eax);if (!eq_id)
@@ -434,6 +438,9 @@ int __init save_microcode_in_initrd_amd(void)else container = cont_va; +/* Add CONFIG_RANDOMIZE_MEMORY offset. */ + container +=PAGE_OFFSET - __PAGE_OFFSET_BASE; + eax =cpuid_eax (0x00000001 ); eax = ((eax >>8 ) &0xf ) + ((eax >>20 ) &0xff );
arch/x86/kernel/smpboot.c +16 -9
@@ -100,10 +100,11 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);/* Logical package management. We might want to allocate that dynamically */ static int *physical_to_logical_pkg__read_mostly ;static unsigned long *physical_package_map__read_mostly ;; -static unsigned long *logical_package_map__read_mostly ;static unsigned int max_physical_pkg_id__read_mostly ;unsigned int __max_logical_packages__read_mostly ;EXPORT_SYMBOL (__max_logical_packages); +static unsigned int logical_packages__read_mostly ; +static bool logical_packages_frozen__read_mostly ;/* Maximum number of SMT threads on any online core */ int __max_smt_threads__read_mostly ;
@@ -277,14 +278,14 @@ int topology_update_package_map(unsigned int apicid, unsigned int cpu)if (test_and_set_bit (pkg, physical_package_map)) goto found; - new =find_first_zero_bit (logical_package_map, __max_logical_packages); -if (new >= __max_logical_packages) { +if (logical_packages_frozen) { physical_to_logical_pkg[pkg] =-1 ; -pr_warn ("APIC(%x) Package %u exceeds logical package map\n" , +pr_warn ("APIC(%x) Package %u exceeds logical package max\n" , apicid, pkg);return -ENOSPC ; } -set_bit (new, logical_package_map); + + new = logical_packages++;pr_info ("APIC(%x) Converting physical %u to logical package %u\n" , apicid, pkg, new); physical_to_logical_pkg[pkg] = new;
@@ -341,6 +342,7 @@ static void __init smp_init_package_map(void) } __max_logical_packages =DIV_ROUND_UP (total_cpus, ncpus); + logical_packages =0 ;/* * Possibly larger than what we need as the number of apic ids per
@@ -352,10 +354,6 @@ static void __init smp_init_package_map(void)memset (physical_to_logical_pkg,0xff , size); size =BITS_TO_LONGS (max_physical_pkg_id) *sizeof (unsigned long ); physical_package_map =kzalloc (size,GFP_KERNEL ); - size =BITS_TO_LONGS (__max_logical_packages) *sizeof (unsigned long ); - logical_package_map =kzalloc (size,GFP_KERNEL ); - -pr_info ("Max logical packages: %u\n" , __max_logical_packages);for_each_present_cpu (cpu) {unsigned int apicid = apic->cpu_present_to_apicid (cpu);
@@ -369,6 +367,15 @@ static void __init smp_init_package_map(void)set_cpu_possible (cpu, false);set_cpu_present (cpu, false); } + +if (logical_packages > __max_logical_packages) { +pr_warn ("Detected more packages (%u), then computed by BIOS data (%u).\n" , + logical_packages, __max_logical_packages); + logical_packages_frozen = true; + __max_logical_packages = logical_packages; + } + +pr_info ("Max logical packages: %u\n" , __max_logical_packages); }void __init smp_store_boot_cpu_info (void )