diff options
author | Vivek Goyal <vgoyal@in.ibm.com> | 2006-05-20 18:00:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-05-21 15:59:20 -0400 |
commit | be0d03f1c3d3612fe2b6aa451ae87a89382c9231 (patch) | |
tree | 6449e2071969fda7441437856da6a4739d719851 /arch | |
parent | 5daa3ba0c6a41a8bb4ba17ad8d5514172e103504 (diff) |
[PATCH] i386 kdump boot cpu physical apicid fix
o Kdump second kernel boot fails after a system crash if second kernel
is UP and acpi=off and if crash occurred on a non-boot cpu.
o Issue here is that MP tables report boot cpu lapic id as 0 but second
kernel is booting on a different processor and MP table data is stale
in this context. Hence apic_id_registered() check fails in setup_local_APIC()
when called from APIC_init_uniprocessor().
o Problem is not seen if ACPI is enabled as in that case
boot_cpu_physical_apicid is read from the LAPIC.
o Problem is not seen with SMP kernels as well because in this case also
boot_cpu_physical_apicid is read from LAPIC. (smp_boot_cpus()).
o The problem is fixed by reading boot_cpu_physical_apicid from LAPIC
if it is a UP kernel and CRASH_DUMP is enabled.
Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/i386/kernel/apic.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index 013b85df18c6..3d4b2f3d116a 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c | |||
@@ -1341,6 +1341,14 @@ int __init APIC_init_uniprocessor (void) | |||
1341 | 1341 | ||
1342 | connect_bsp_APIC(); | 1342 | connect_bsp_APIC(); |
1343 | 1343 | ||
1344 | /* | ||
1345 | * Hack: In case of kdump, after a crash, kernel might be booting | ||
1346 | * on a cpu with non-zero lapic id. But boot_cpu_physical_apicid | ||
1347 | * might be zero if read from MP tables. Get it from LAPIC. | ||
1348 | */ | ||
1349 | #ifdef CONFIG_CRASH_DUMP | ||
1350 | boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); | ||
1351 | #endif | ||
1344 | phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid); | 1352 | phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid); |
1345 | 1353 | ||
1346 | setup_local_APIC(); | 1354 | setup_local_APIC(); |