mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
d04ec773d7
commit
23952a96ae
|
@ -640,19 +640,22 @@ void __cpuinit cpu_init(void)
|
||||||
/*
|
/*
|
||||||
* set up and load the per-CPU TSS
|
* set up and load the per-CPU TSS
|
||||||
*/
|
*/
|
||||||
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
if (!orig_ist->ist[0]) {
|
||||||
static const unsigned int order[N_EXCEPTION_STACKS] = {
|
static const unsigned int order[N_EXCEPTION_STACKS] = {
|
||||||
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
[0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
|
||||||
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
[DEBUG_STACK - 1] = DEBUG_STACK_ORDER
|
||||||
};
|
};
|
||||||
if (cpu) {
|
for (v = 0; v < N_EXCEPTION_STACKS; v++) {
|
||||||
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
if (cpu) {
|
||||||
if (!estacks)
|
estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
|
||||||
panic("Cannot allocate exception stack %ld %d\n",
|
if (!estacks)
|
||||||
v, cpu);
|
panic("Cannot allocate exception "
|
||||||
|
"stack %ld %d\n", v, cpu);
|
||||||
|
}
|
||||||
|
estacks += PAGE_SIZE << order[v];
|
||||||
|
orig_ist->ist[v] = t->x86_tss.ist[v] =
|
||||||
|
(unsigned long)estacks;
|
||||||
}
|
}
|
||||||
estacks += PAGE_SIZE << order[v];
|
|
||||||
orig_ist->ist[v] = t->x86_tss.ist[v] = (unsigned long)estacks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
|
t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
|
||||||
|
|
Loading…
Reference in New Issue