diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
-rw-r--r-- | arch/arm/kernel/smp.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 57162af53dc9..a01194e583ff 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -86,6 +86,12 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
86 | return PTR_ERR(idle); | 86 | return PTR_ERR(idle); |
87 | } | 87 | } |
88 | ci->idle = idle; | 88 | ci->idle = idle; |
89 | } else { | ||
90 | /* | ||
91 | * Since this idle thread is being re-used, call | ||
92 | * init_idle() to reinitialize the thread structure. | ||
93 | */ | ||
94 | init_idle(idle, cpu); | ||
89 | } | 95 | } |
90 | 96 | ||
91 | /* | 97 | /* |
@@ -99,6 +105,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
99 | *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | | 105 | *pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) | |
100 | PMD_TYPE_SECT | PMD_SECT_AP_WRITE); | 106 | PMD_TYPE_SECT | PMD_SECT_AP_WRITE); |
101 | flush_pmd_entry(pmd); | 107 | flush_pmd_entry(pmd); |
108 | outer_clean_range(__pa(pmd), __pa(pmd + 1)); | ||
102 | 109 | ||
103 | /* | 110 | /* |
104 | * We need to tell the secondary core where to find | 111 | * We need to tell the secondary core where to find |
@@ -106,7 +113,8 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
106 | */ | 113 | */ |
107 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; | 114 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; |
108 | secondary_data.pgdir = virt_to_phys(pgd); | 115 | secondary_data.pgdir = virt_to_phys(pgd); |
109 | wmb(); | 116 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); |
117 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); | ||
110 | 118 | ||
111 | /* | 119 | /* |
112 | * Now bring the CPU into our world. | 120 | * Now bring the CPU into our world. |