|
@@ -88,6 +88,12 @@ check_stack(unsigned long ip, unsigned long *stack)
|
|
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 +175,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);
|
|
}
|
|
}
|