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:29:37 -0400
committerIngo Molnar <mingo@elte.hu>2008-08-11 15:39:12 -0400
commitb55793f7528ce1b73c25b3ac8a86a6cda2a0f9a4 (patch)
treeb1a689431946093f92a15bd8fc4f09c4d7bdd01c /arch/x86/kernel/cpu/common_64.c
parent49800efcb17afdf973f33e8aa8807b7f83993cc6 (diff)
x86: cpu_init(): fix memory leak when using CPU hotplug
Exception stacks are allocated each time a CPU is set online. But the allocated space is never freed. Thus with one CPU hotplug offline/online cycle there is a memory leak of 24K (6 pages) for a CPU. Fix is to allocate exception stacks only once -- when the CPU is set online for the first time. 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.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c
index 8396fd7628a..cc6efe86249 100644
--- a/arch/x86/kernel/cpu/common_64.c
+++ b/arch/x86/kernel/cpu/common_64.c
@@ -606,19 +606,22 @@ void __cpuinit cpu_init(void)
606 /* 606 /*
607 * set up and load the per-CPU TSS 607 * set up and load the per-CPU TSS
608 */ 608 */
609 for (v = 0; v < N_EXCEPTION_STACKS; v++) { 609 if (!orig_ist->ist[0]) {
610 static const unsigned int order[N_EXCEPTION_STACKS] = { 610 static const unsigned int order[N_EXCEPTION_STACKS] = {
611 [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, 611 [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
612 [DEBUG_STACK - 1] = DEBUG_STACK_ORDER 612 [DEBUG_STACK - 1] = DEBUG_STACK_ORDER
613 }; 613 };
614 if (cpu) { 614 for (v = 0; v < N_EXCEPTION_STACKS; v++) {
615 estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); 615 if (cpu) {
616 if (!estacks) 616 estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
617 panic("Cannot allocate exception stack %ld %d\n", 617 if (!estacks)
618 v, cpu); 618 panic("Cannot allocate exception "
619 "stack %ld %d\n", v, cpu);
620 }
621 estacks += PAGE_SIZE << order[v];
622 orig_ist->ist[v] = t->x86_tss.ist[v] =
623 (unsigned long)estacks;
619 } 624 }
620 estacks += PAGE_SIZE << order[v];
621 orig_ist->ist[v] = t->x86_tss.ist[v] = (unsigned long)estacks;
622 } 625 }
623 626
624 t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); 627 t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);