Commit 25e13814 authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt

powerpc: Apply early paca fixups to boot_paca and the boot cpu's paca

In commit 466921c5 we added a hack to set the paca data_offset to zero so
that per-cpu accesses would work on the boot cpu prior to per-cpu areas
being setup. This fixed a problem with lockdep touching per-cpu areas
very early in boot.

However if we combine CONFIG_LOCK_STAT=y with any of the PPC_EARLY_DEBUG
options, we can hit the same problem in udbg_early_init(). To avoid that
we need to set the data_offset of the boot_paca also. So factor out the
fixup logic and call it for both the boot_paca, and "the paca of the
boot cpu".
Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Tested-by: default avatarGeoff Levand <geoff@infradead.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 6a7e4064
...@@ -156,6 +156,15 @@ early_param("smt-enabled", early_smt_enabled); ...@@ -156,6 +156,15 @@ early_param("smt-enabled", early_smt_enabled);
#define check_smt_enabled() #define check_smt_enabled()
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/** Fix up paca fields required for the boot cpu */
static void fixup_boot_paca(void)
{
/* The boot cpu is started */
get_paca()->cpu_start = 1;
/* Allow percpu accesses to work until we setup percpu data */
get_paca()->data_offset = 0;
}
/* /*
* Early initialization entry point. This is called by head.S * Early initialization entry point. This is called by head.S
* with MMU translation disabled. We rely on the "feature" of * with MMU translation disabled. We rely on the "feature" of
...@@ -187,6 +196,7 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -187,6 +196,7 @@ void __init early_setup(unsigned long dt_ptr)
/* Assume we're on cpu 0 for now. Don't write to the paca yet! */ /* Assume we're on cpu 0 for now. Don't write to the paca yet! */
initialise_paca(&boot_paca, 0); initialise_paca(&boot_paca, 0);
setup_paca(&boot_paca); setup_paca(&boot_paca);
fixup_boot_paca();
/* Initialize lockdep early or else spinlocks will blow */ /* Initialize lockdep early or else spinlocks will blow */
lockdep_init(); lockdep_init();
...@@ -207,11 +217,7 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -207,11 +217,7 @@ void __init early_setup(unsigned long dt_ptr)
/* Now we know the logical id of our boot cpu, setup the paca. */ /* Now we know the logical id of our boot cpu, setup the paca. */
setup_paca(&paca[boot_cpuid]); setup_paca(&paca[boot_cpuid]);
fixup_boot_paca();
/* Fix up paca fields required for the boot cpu */
get_paca()->cpu_start = 1;
/* Allow percpu accesses to "work" until we setup percpu data */
get_paca()->data_offset = 0;
/* Probe the machine type */ /* Probe the machine type */
probe_machine(); probe_machine();
......
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