forked from Minki/linux
[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: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
008d2d112c
commit
6d54c5a3fb
@ -508,7 +508,6 @@ out:
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@ out:
|
|||||||
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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user