Commit 62ee0540 authored by Doug Chapman's avatar Doug Chapman Committed by Tony Luck

[IA64] fix boot panic caused by offline CPUs

This fixes a regression introduced by 2c6e6db4
"Minimize per_cpu reservations."  That patch incorrectly used information about
what CPUs are possible that was not yet initialized by ACPI.  The end result
was that per_cpu structures for offline CPUs were not initialized causing a
NULL pointer reference.

Since we cannot do the full acpi_boot_init() call any earlier, the simplest
fix is to just parse the MADT for SAPIC entries early to find the CPU
info.  This should also allow for some cleanup of the code added by the
"Minimize per_cpu reservations".  This patch just fixes the regressions, the
cleanup will come in a later patch.
Signed-off-by: default avatarDoug Chapman <doug.chapman@hp.com>
Signed-off-by: default avatarAlex Chiang <achiang@hp.com>
CC: Robin Holt <holt@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 1547a012
...@@ -678,6 +678,30 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table) ...@@ -678,6 +678,30 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table)
return 0; return 0;
} }
int __init early_acpi_boot_init(void)
{
int ret;
/*
* do a partial walk of MADT to determine how many CPUs
* we have including offline CPUs
*/
if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
printk(KERN_ERR PREFIX "Can't find MADT\n");
return 0;
}
ret = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
acpi_parse_lsapic, NR_CPUS);
if (ret < 1)
printk(KERN_ERR PREFIX
"Error parsing MADT - no LAPIC entries\n");
return 0;
}
int __init acpi_boot_init(void) int __init acpi_boot_init(void)
{ {
...@@ -701,11 +725,6 @@ int __init acpi_boot_init(void) ...@@ -701,11 +725,6 @@ int __init acpi_boot_init(void)
printk(KERN_ERR PREFIX printk(KERN_ERR PREFIX
"Error parsing LAPIC address override entry\n"); "Error parsing LAPIC address override entry\n");
if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, acpi_parse_lsapic, NR_CPUS)
< 1)
printk(KERN_ERR PREFIX
"Error parsing MADT - no LAPIC entries\n");
if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0) if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0)
< 0) < 0)
printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n"); printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
......
...@@ -561,8 +561,12 @@ setup_arch (char **cmdline_p) ...@@ -561,8 +561,12 @@ setup_arch (char **cmdline_p)
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
/* Initialize the ACPI boot-time table parser */ /* Initialize the ACPI boot-time table parser */
acpi_table_init(); acpi_table_init();
early_acpi_boot_init();
# ifdef CONFIG_ACPI_NUMA # ifdef CONFIG_ACPI_NUMA
acpi_numa_init(); acpi_numa_init();
#ifdef CONFIG_ACPI_HOTPLUG_CPU
prefill_possible_map();
#endif
per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ? per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ?
32 : cpus_weight(early_cpu_possible_map)), 32 : cpus_weight(early_cpu_possible_map)),
additional_cpus > 0 ? additional_cpus : 0); additional_cpus > 0 ? additional_cpus : 0);
...@@ -853,9 +857,6 @@ void __init ...@@ -853,9 +857,6 @@ void __init
setup_per_cpu_areas (void) setup_per_cpu_areas (void)
{ {
/* start_kernel() requires this... */ /* start_kernel() requires this... */
#ifdef CONFIG_ACPI_HOTPLUG_CPU
prefill_possible_map();
#endif
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment