diff mbox

ARM: make cpu_init() notrace

Message ID 1366302046.3388.8.camel@linaro1.home (mailing list archive)
State New, archived
Headers show

Commit Message

Jon Medhurst (Tixy) April 18, 2013, 4:20 p.m. UTC
On resume from CPU power down any trace hooks enabled in cpu_init()
will get called before that function has done set_my_cpu_offset(),
so any use of per-cpu variables by trace hook code will cause bad
things to happen. Prevent this by marking the function notrace.

This fixes lockups/crashes seen when enabling function tracer on TC2
with the not yet mainlined cpuidle driver.

Signed-off-by: Jon Medhurst <tixy@linaro.org>
---
 arch/arm/kernel/setup.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Nicolas Pitre April 19, 2013, 9:37 p.m. UTC | #1
On Thu, 18 Apr 2013, Jon Medhurst (Tixy) wrote:

> On resume from CPU power down any trace hooks enabled in cpu_init()
> will get called before that function has done set_my_cpu_offset(),
> so any use of per-cpu variables by trace hook code will cause bad
> things to happen. Prevent this by marking the function notrace.
> 
> This fixes lockups/crashes seen when enabling function tracer on TC2
> with the not yet mainlined cpuidle driver.

This has potential to fix things on other platforms too.

> 
> Signed-off-by: Jon Medhurst <tixy@linaro.org>

Acked-by: Nicolas Pitre <nico@linaro.org>

I think you may send it to RMK's patch system.


> ---
>  arch/arm/kernel/setup.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index d343a6c..943cbf0 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -390,7 +390,7 @@ static void __init feat_v6_fixup(void)
>   *
>   * cpu_init sets up the per-CPU stacks.
>   */
> -void cpu_init(void)
> +void notrace cpu_init(void)
>  {
>  	unsigned int cpu = smp_processor_id();
>  	struct stack *stk = &stacks[cpu];
> -- 
> 1.7.10.4
> 
>
Russell King - ARM Linux April 22, 2013, 2:07 p.m. UTC | #2
On Thu, Apr 18, 2013 at 05:20:46PM +0100, Jon Medhurst (Tixy) wrote:
> On resume from CPU power down any trace hooks enabled in cpu_init()
> will get called before that function has done set_my_cpu_offset(),
> so any use of per-cpu variables by trace hook code will cause bad
> things to happen. Prevent this by marking the function notrace.
> 
> This fixes lockups/crashes seen when enabling function tracer on TC2
> with the not yet mainlined cpuidle driver.

Looks sane.  Needs to go to the patch system though.  Not sure if it'll
make 3.9 given its proximity (we're on -rc8).
Jon Medhurst (Tixy) April 22, 2013, 6:08 p.m. UTC | #3
On Mon, 2013-04-22 at 15:07 +0100, Russell King - ARM Linux wrote:
> On Thu, Apr 18, 2013 at 05:20:46PM +0100, Jon Medhurst (Tixy) wrote:
> > On resume from CPU power down any trace hooks enabled in cpu_init()
> > will get called before that function has done set_my_cpu_offset(),
> > so any use of per-cpu variables by trace hook code will cause bad
> > things to happen. Prevent this by marking the function notrace.
> > 
> > This fixes lockups/crashes seen when enabling function tracer on TC2
> > with the not yet mainlined cpuidle driver.
> 
> Looks sane.  Needs to go to the patch system though.  Not sure if it'll
> make 3.9 given its proximity (we're on -rc8).

Added as patch 7700/1. Don't think there is a big rush as the problem
has probably been there since 3.8 when commit 14318efb (implement
optimized percpu variable access) started using TPIDRPRW; which is
presumably lost over CPU power down.
Russell King - ARM Linux April 25, 2013, 12:15 p.m. UTC | #4
On Mon, Apr 22, 2013 at 07:08:36PM +0100, Jon Medhurst (Tixy) wrote:
> On Mon, 2013-04-22 at 15:07 +0100, Russell King - ARM Linux wrote:
> > On Thu, Apr 18, 2013 at 05:20:46PM +0100, Jon Medhurst (Tixy) wrote:
> > > On resume from CPU power down any trace hooks enabled in cpu_init()
> > > will get called before that function has done set_my_cpu_offset(),
> > > so any use of per-cpu variables by trace hook code will cause bad
> > > things to happen. Prevent this by marking the function notrace.
> > > 
> > > This fixes lockups/crashes seen when enabling function tracer on TC2
> > > with the not yet mainlined cpuidle driver.
> > 
> > Looks sane.  Needs to go to the patch system though.  Not sure if it'll
> > make 3.9 given its proximity (we're on -rc8).
> 
> Added as patch 7700/1. Don't think there is a big rush as the problem
> has probably been there since 3.8 when commit 14318efb (implement
> optimized percpu variable access) started using TPIDRPRW; which is
> presumably lost over CPU power down.

$ pdb getpatch 7700/1 |tr ' ' '_' |less
diff_--git_a/arch/arm/kernel/setup.c_b/arch/arm/kernel/setup.c
index_d343a6c..943cbf0_100644
---_a/arch/arm/kernel/setup.c
+++_b/arch/arm/kernel/setup.c
@@_-390,7_+390,7_@@_static_void___init_feat_v6_fixup(void)
__*
__*_cpu_init_sets_up_the_per-CPU_stacks.
__*/
-void_cpu_init(void)
+void_notrace_cpu_init(void)
_{
________unsigned_int_cpu_=_smp_processor_id();
________struct_stack_*stk_=_&stacks[cpu];

Can you guess why git has a problem appying the above... you seem to
have sent the patch from your mailer, I guess your mailer thinks it
knows better when it comes to what characters should be in your
message... or maybe its a cut'n'paste issue?
Jon Medhurst (Tixy) April 25, 2013, 1:50 p.m. UTC | #5
On Thu, 2013-04-25 at 13:15 +0100, Russell King - ARM Linux wrote:

> $ pdb getpatch 7700/1 |tr ' ' '_' |less
> diff_--git_a/arch/arm/kernel/setup.c_b/arch/arm/kernel/setup.c
> index_d343a6c..943cbf0_100644
> ---_a/arch/arm/kernel/setup.c
> +++_b/arch/arm/kernel/setup.c
> @@_-390,7_+390,7_@@_static_void___init_feat_v6_fixup(void)
> __*
> __*_cpu_init_sets_up_the_per-CPU_stacks.
> __*/
> -void_cpu_init(void)
> +void_notrace_cpu_init(void)
> _{
> ________unsigned_int_cpu_=_smp_processor_id();
> ________struct_stack_*stk_=_&stacks[cpu];
> 
> Can you guess why git has a problem appying the above... 

Sorry about that, the user forgot to tell their mailer it was
pre-formatted text. I've sent a fixed version.

Note to self: bcc self on patch submissions and then run them though
'git am' to catch problems before others hit them.
diff mbox

Patch

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index d343a6c..943cbf0 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -390,7 +390,7 @@  static void __init feat_v6_fixup(void)
  *
  * cpu_init sets up the per-CPU stacks.
  */
-void cpu_init(void)
+void notrace cpu_init(void)
 {
 	unsigned int cpu = smp_processor_id();
 	struct stack *stk = &stacks[cpu];