Commit 6d54c5a3 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

[S390] smp: fix memory leak on __cpu_up

If sigp_set_prefix fails on __cpu_up we leak the lowcore structures
and async+panic stacks for the failed cpu.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 008d2d11
...@@ -508,7 +508,6 @@ static int __cpuinit smp_alloc_lowcore(int cpu) ...@@ -508,7 +508,6 @@ static int __cpuinit smp_alloc_lowcore(int cpu)
return -ENOMEM; return -ENOMEM;
} }
#ifdef CONFIG_HOTPLUG_CPU
static void smp_free_lowcore(int cpu) static void smp_free_lowcore(int cpu)
{ {
struct _lowcore *lowcore; struct _lowcore *lowcore;
...@@ -527,7 +526,6 @@ static void smp_free_lowcore(int cpu) ...@@ -527,7 +526,6 @@ static void smp_free_lowcore(int cpu)
free_pages((unsigned long) lowcore, lc_order); free_pages((unsigned long) lowcore, lc_order);
lowcore_ptr[cpu] = NULL; lowcore_ptr[cpu] = NULL;
} }
#endif /* CONFIG_HOTPLUG_CPU */
/* Upping and downing of CPUs */ /* Upping and downing of CPUs */
int __cpuinit __cpu_up(unsigned int cpu) int __cpuinit __cpu_up(unsigned int cpu)
...@@ -544,8 +542,10 @@ int __cpuinit __cpu_up(unsigned int cpu) ...@@ -544,8 +542,10 @@ int __cpuinit __cpu_up(unsigned int cpu)
ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]), ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]),
cpu, sigp_set_prefix); cpu, sigp_set_prefix);
if (ccode) if (ccode) {
smp_free_lowcore(cpu);
return -EIO; return -EIO;
}
idle = current_set[cpu]; idle = current_set[cpu];
cpu_lowcore = lowcore_ptr[cpu]; cpu_lowcore = lowcore_ptr[cpu];
......
...@@ -144,7 +144,6 @@ int vdso_alloc_per_cpu(int cpu, struct _lowcore *lowcore) ...@@ -144,7 +144,6 @@ int vdso_alloc_per_cpu(int cpu, struct _lowcore *lowcore)
return -ENOMEM; return -ENOMEM;
} }
#ifdef CONFIG_HOTPLUG_CPU
void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore) void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore)
{ {
unsigned long segment_table, page_table, page_frame; unsigned long segment_table, page_table, page_frame;
...@@ -163,7 +162,6 @@ void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore) ...@@ -163,7 +162,6 @@ void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore)
free_page(page_table); free_page(page_table);
free_pages(segment_table, SEGMENT_ORDER); free_pages(segment_table, SEGMENT_ORDER);
} }
#endif /* CONFIG_HOTPLUG_CPU */
static void __vdso_init_cr5(void *dummy) static void __vdso_init_cr5(void *dummy)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment