diff options
author | Andreas Herrmann <andreas.herrmann3@amd.com> | 2008-08-06 04:27:30 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-06 14:48:02 -0400 |
commit | d04ec773d7ca1bbc05a2768be95c1cebe2b07757 (patch) | |
tree | 7f44aad93d8f8a526f5a16f42feab080b3ecb9da /arch | |
parent | e4a6be4d2850da032a782b5296c07dfdf583af86 (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')
-rw-r--r-- | arch/x86/kernel/cpu/common_64.c | 15 |
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 c3afba5a81a7..4f2eeb5652ea 100644 --- a/arch/x86/kernel/cpu/common_64.c +++ b/arch/x86/kernel/cpu/common_64.c | |||
@@ -529,17 +529,20 @@ void pda_init(int cpu) | |||
529 | /* others are initialized in smpboot.c */ | 529 | /* others are initialized in smpboot.c */ |
530 | pda->pcurrent = &init_task; | 530 | pda->pcurrent = &init_task; |
531 | pda->irqstackptr = boot_cpu_stack; | 531 | pda->irqstackptr = boot_cpu_stack; |
532 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
532 | } else { | 533 | } else { |
533 | pda->irqstackptr = (char *) | 534 | if (!pda->irqstackptr) { |
534 | __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); | 535 | pda->irqstackptr = (char *) |
535 | if (!pda->irqstackptr) | 536 | __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); |
536 | panic("cannot allocate irqstack for cpu %d", cpu); | 537 | if (!pda->irqstackptr) |
538 | panic("cannot allocate irqstack for cpu %d", | ||
539 | cpu); | ||
540 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
541 | } | ||
537 | 542 | ||
538 | if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) | 543 | if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) |
539 | pda->nodenumber = cpu_to_node(cpu); | 544 | pda->nodenumber = cpu_to_node(cpu); |
540 | } | 545 | } |
541 | |||
542 | pda->irqstackptr += IRQSTACKSIZE-64; | ||
543 | } | 546 | } |
544 | 547 | ||
545 | char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + | 548 | char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + |