aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/common_64.c
diff options
context:
space:
mode:
authorAndreas Herrmann <andreas.herrmann3@amd.com>2008-08-06 04:27:30 -0400
committerIngo Molnar <mingo@elte.hu>2008-08-11 15:39:11 -0400
commit49800efcb17afdf973f33e8aa8807b7f83993cc6 (patch)
tree7b21c84fcf4d3e42570551fff63ce4ff248e00a2 /arch/x86/kernel/cpu/common_64.c
parent2ae111cdd8d83ebf9de72e36e68a8c84b6ebbeea (diff)
x86: pda_init(): fix memory leak when using CPU hotplug
pda->irqstackptr is allocated whenever a CPU is set online. But it is never freed. This results in a memory leak of 16K for each CPU offline/online cycle. Fix is to allocate pda->irqstackptr only once. Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com> Cc: akpm@linux-foundation.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/cpu/common_64.c')
-rw-r--r--arch/x86/kernel/cpu/common_64.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c
index 6f9b8924bdc0..8396fd7628a9 100644
--- a/arch/x86/kernel/cpu/common_64.c
+++ b/arch/x86/kernel/cpu/common_64.c
@@ -493,17 +493,20 @@ void pda_init(int cpu)
493 /* others are initialized in smpboot.c */ 493 /* others are initialized in smpboot.c */
494 pda->pcurrent = &init_task; 494 pda->pcurrent = &init_task;
495 pda->irqstackptr = boot_cpu_stack; 495 pda->irqstackptr = boot_cpu_stack;
496 pda->irqstackptr += IRQSTACKSIZE - 64;
496 } else { 497 } else {
497 pda->irqstackptr = (char *) 498 if (!pda->irqstackptr) {
498 __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); 499 pda->irqstackptr = (char *)
499 if (!pda->irqstackptr) 500 __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
500 panic("cannot allocate irqstack for cpu %d", cpu); 501 if (!pda->irqstackptr)
502 panic("cannot allocate irqstack for cpu %d",
503 cpu);
504 pda->irqstackptr += IRQSTACKSIZE - 64;
505 }
501 506
502 if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) 507 if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE)
503 pda->nodenumber = cpu_to_node(cpu); 508 pda->nodenumber = cpu_to_node(cpu);
504 } 509 }
505
506 pda->irqstackptr += IRQSTACKSIZE-64;
507} 510}
508 511
509char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + 512char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ +