diff options
author | Andreas Herrmann <andreas.herrmann3@amd.com> | 2008-08-06 04:29:37 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-11 15:39:12 -0400 |
commit | b55793f7528ce1b73c25b3ac8a86a6cda2a0f9a4 (patch) | |
tree | b1a689431946093f92a15bd8fc4f09c4d7bdd01c /arch/x86/kernel/cpu/common_64.c | |
parent | 49800efcb17afdf973f33e8aa8807b7f83993cc6 (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.c | 23 |
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); |