diff options
author | Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp> | 2007-05-09 05:33:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-09 15:30:48 -0400 |
commit | dd988528f4a7d64908b427c251d727f3c3e88add (patch) | |
tree | 6a11ed178206e7310be3ddc2524a278db6fec5bb /include/asm-x86_64 | |
parent | a36166c6ef45081fea6eeaf5ca785d7ed786b6e2 (diff) |
Use the APIC to determine the hardware processor id - x86_64
hard_smp_processor_id used to be just a macro that hard-coded
hard_smp_processor_id to 0 in the non SMP case. When booting non SMP kernels
on hardware where the boot ioapic id is not 0 this turns out to be a problem.
This is happens frequently in the case of kdump and once in a great while in
the case of real hardware.
Use the APIC to determine the hardware processor id in both UP and SMP kernels
to fix this issue.
Notice that hard_smp_processor_id is only used by SMP code or by code that
works with apics so we do not need to handle the case when apics are not
present and hard_smp_processor_id should never be called there.
Signed-off-by: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp>
Cc: "Luck, Tony" <tony.luck@intel.com>
Acked-by: Andi Kleen <ak@suse.de>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/asm-x86_64')
-rw-r--r-- | include/asm-x86_64/smp.h | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index f62fda527439..3f303d2365ed 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h | |||
@@ -57,12 +57,6 @@ static inline int num_booting_cpus(void) | |||
57 | 57 | ||
58 | #define raw_smp_processor_id() read_pda(cpunumber) | 58 | #define raw_smp_processor_id() read_pda(cpunumber) |
59 | 59 | ||
60 | static inline int hard_smp_processor_id(void) | ||
61 | { | ||
62 | /* we don't want to mark this access volatile - bad code generation */ | ||
63 | return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID)); | ||
64 | } | ||
65 | |||
66 | extern int __cpu_disable(void); | 60 | extern int __cpu_disable(void); |
67 | extern void __cpu_die(unsigned int cpu); | 61 | extern void __cpu_die(unsigned int cpu); |
68 | extern void prefill_possible_map(void); | 62 | extern void prefill_possible_map(void); |
@@ -71,10 +65,14 @@ extern unsigned __cpuinitdata disabled_cpus; | |||
71 | 65 | ||
72 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 66 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
73 | 67 | ||
74 | #else /* CONFIG_SMP */ | ||
75 | #define hard_smp_processor_id() 0 | ||
76 | #endif /* CONFIG_SMP */ | 68 | #endif /* CONFIG_SMP */ |
77 | 69 | ||
70 | static inline int hard_smp_processor_id(void) | ||
71 | { | ||
72 | /* we don't want to mark this access volatile - bad code generation */ | ||
73 | return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID)); | ||
74 | } | ||
75 | |||
78 | /* | 76 | /* |
79 | * Some lowlevel functions might want to know about | 77 | * Some lowlevel functions might want to know about |
80 | * the real APIC ID <-> CPU # mapping. | 78 | * the real APIC ID <-> CPU # mapping. |