aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/head_64.S
diff options
context:
space:
mode:
authorMilton Miller <miltonm@bga.com>2011-05-10 15:28:37 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-05-19 00:30:43 -0400
commit768d18ad6d5e600d911f9499ca287d6986d8d81b (patch)
treefffb813155bbdd29ab6703fa8586d35ea1dba7c8 /arch/powerpc/kernel/head_64.S
parent3d2cea732d68aa270c360f55d8669820ebce188a (diff)
powerpc: Don't search for paca in freed memory
Starting with 1426d5a3bd07589534286375998c0c8c6fdc5260 (powerpc: Dynamically allocate pacas) we free the memory for pacas beyond cpu_possible, but we failed to update the loop the secondary cpus use to find their paca. If the system has running cpu threads for which the kernel did not allocate a paca for they will search the memory that was freed. For instance this could happen when the device tree for a kdump kernel was not updated after a cpu hotplug, or the kernel is running with more cpus than the kernel was configured. Since c1854e00727f50f7ac99e98d26ece04c087ef785 (powerpc: Set nr_cpu_ids early and use it to free PACAs) we set nr_cpu_ids before telling the cpus to advance, so use that to limit the search. We can't reference nr_cpu_ids without CONFIG_SMP because it is defined as 1 instead of a memory location, but any extra threads should be sent to kexec_wait in that case anyways, so make that explicit and remove the search loop for UP. Note to stable: The fix also requires c1854e00727f50f7ac99e98d26ece04c087ef785 (powerpc: Set nr_cpu_ids early and use it to free PACAs) to function. Also 9d07bc841c9779b4d7902e417f4e509996ce805d (Properly handshake CPUs going out of boot spin loop) affects the second chunk, specifically the branch target was 3b before and is 4b after that patch, and there was a blank line before the #ifdef CONFIG_SMP that was removed Cc: <stable@kernel.org> # .34.x: c1854e0072 powerpc: Set nr_cpu_ids early Cc: <stable@kernel.org> # .34.x Signed-off-by: Milton Miller <miltonm@bga.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/head_64.S')
-rw-r--r--arch/powerpc/kernel/head_64.S13
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 73d6e9afcdf1..ba504099844a 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -218,13 +218,19 @@ generic_secondary_common_init:
218 */ 218 */
219 LOAD_REG_ADDR(r13, paca) /* Load paca pointer */ 219 LOAD_REG_ADDR(r13, paca) /* Load paca pointer */
220 ld r13,0(r13) /* Get base vaddr of paca array */ 220 ld r13,0(r13) /* Get base vaddr of paca array */
221#ifndef CONFIG_SMP
222 addi r13,r13,PACA_SIZE /* know r13 if used accidentally */
223 b .kexec_wait /* wait for next kernel if !SMP */
224#else
225 LOAD_REG_ADDR(r7, nr_cpu_ids) /* Load nr_cpu_ids address */
226 lwz r7,0(r7) /* also the max paca allocated */
221 li r5,0 /* logical cpu id */ 227 li r5,0 /* logical cpu id */
2221: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */ 2281: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */
223 cmpw r6,r24 /* Compare to our id */ 229 cmpw r6,r24 /* Compare to our id */
224 beq 2f 230 beq 2f
225 addi r13,r13,PACA_SIZE /* Loop to next PACA on miss */ 231 addi r13,r13,PACA_SIZE /* Loop to next PACA on miss */
226 addi r5,r5,1 232 addi r5,r5,1
227 cmpwi r5,NR_CPUS 233 cmpw r5,r7 /* Check if more pacas exist */
228 blt 1b 234 blt 1b
229 235
230 mr r3,r24 /* not found, copy phys to r3 */ 236 mr r3,r24 /* not found, copy phys to r3 */
@@ -259,9 +265,6 @@ generic_secondary_common_init:
2594: HMT_LOW 2654: HMT_LOW
260 lbz r23,PACAPROCSTART(r13) /* Test if this processor should */ 266 lbz r23,PACAPROCSTART(r13) /* Test if this processor should */
261 /* start. */ 267 /* start. */
262#ifndef CONFIG_SMP
263 b 4b /* Never go on non-SMP */
264#else
265 cmpwi 0,r23,0 268 cmpwi 0,r23,0
266 beq 4b /* Loop until told to go */ 269 beq 4b /* Loop until told to go */
267 270
@@ -273,7 +276,7 @@ generic_secondary_common_init:
273 subi r1,r1,STACK_FRAME_OVERHEAD 276 subi r1,r1,STACK_FRAME_OVERHEAD
274 277
275 b __secondary_start 278 b __secondary_start
276#endif 279#endif /* SMP */
277 280
278/* 281/*
279 * Turn the MMU off. 282 * Turn the MMU off.