Commit 8a990fb4 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'trace-fixes-v4.3-rc6' of...

Merge tag 'trace-fixes-v4.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull tracing fixes from Steven Rostedt:
 "Running tests on other changes, the system locked up due to lots of
  warnings.  It was caused by the stack tracer triggering a warning
  about using rcu_dereference() when RCU was not watching.  This can
  happen due to the fact that the stack tracer uses the function tracer
  to check each function, and there are functions that may be called and
  traced when RCU stopped watching.  Namely when a function is called
  just before going idle or to userspace and after RCU stopped watching
  that current CPU.

  The first patch makes sure that RCU is watching when the stack tracer
  uses RCU.  The second patch is to make sure that the stack tracer does
  not get called by functions in NMI, as it's not NMI safe"

* tag 'trace-fixes-v4.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracing: Do not allow stack_tracer to record stack in NMI
  tracing: Have stack tracer force RCU to be watching
parents 0122835a 1904be1b
...@@ -85,9 +85,19 @@ check_stack(unsigned long ip, unsigned long *stack) ...@@ -85,9 +85,19 @@ check_stack(unsigned long ip, unsigned long *stack)
if (!object_is_on_stack(stack)) if (!object_is_on_stack(stack))
return; return;
/* Can't do this from NMI context (can cause deadlocks) */
if (in_nmi())
return;
local_irq_save(flags); local_irq_save(flags);
arch_spin_lock(&max_stack_lock); arch_spin_lock(&max_stack_lock);
/*
* RCU may not be watching, make it see us.
* The stack trace code uses rcu_sched.
*/
rcu_irq_enter();
/* In case another CPU set the tracer_frame on us */ /* In case another CPU set the tracer_frame on us */
if (unlikely(!frame_size)) if (unlikely(!frame_size))
this_size -= tracer_frame; this_size -= tracer_frame;
...@@ -169,6 +179,7 @@ check_stack(unsigned long ip, unsigned long *stack) ...@@ -169,6 +179,7 @@ check_stack(unsigned long ip, unsigned long *stack)
} }
out: out:
rcu_irq_exit();
arch_spin_unlock(&max_stack_lock); arch_spin_unlock(&max_stack_lock);
local_irq_restore(flags); local_irq_restore(flags);
} }
......
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