aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-06-26 07:59:17 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-26 13:48:21 -0400
commit75bd665cc9f4d0f67164d9145e446ae554d4ed3f (patch)
treeddfd134ef54138eea8e341039466c7e470203c71 /arch
parente42f94373764d825e2c0464092738f66f5d3effb (diff)
[PATCH] x86_64: Fix fast check in safe_smp_processor_id
The APIC ID returned by hard_smp_processor_id can be beyond NR_CPUS and then overflow the x86_cpu_to_apic[] array. Add a check for overflow. If it happens then the slow loop below will catch. Bug pointed out by Doug Thompson Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/kernel/smp.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c
index fe906ba1cf45..5885b8f044b2 100644
--- a/arch/x86_64/kernel/smp.c
+++ b/arch/x86_64/kernel/smp.c
@@ -520,13 +520,13 @@ asmlinkage void smp_call_function_interrupt(void)
520 520
521int safe_smp_processor_id(void) 521int safe_smp_processor_id(void)
522{ 522{
523 int apicid, i; 523 unsigned apicid, i;
524 524
525 if (disable_apic) 525 if (disable_apic)
526 return 0; 526 return 0;
527 527
528 apicid = hard_smp_processor_id(); 528 apicid = hard_smp_processor_id();
529 if (x86_cpu_to_apicid[apicid] == apicid) 529 if (apicid < NR_CPUS && x86_cpu_to_apicid[apicid] == apicid)
530 return apicid; 530 return apicid;
531 531
532 for (i = 0; i < NR_CPUS; ++i) { 532 for (i = 0; i < NR_CPUS; ++i) {