diff options
Diffstat (limited to 'kernel/trace/trace_stack.c')
-rw-r--r-- | kernel/trace/trace_stack.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index b746399ab59c..5f29402bff0f 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
@@ -88,6 +88,12 @@ check_stack(unsigned long ip, unsigned long *stack) | |||
88 | local_irq_save(flags); | 88 | local_irq_save(flags); |
89 | arch_spin_lock(&max_stack_lock); | 89 | arch_spin_lock(&max_stack_lock); |
90 | 90 | ||
91 | /* | ||
92 | * RCU may not be watching, make it see us. | ||
93 | * The stack trace code uses rcu_sched. | ||
94 | */ | ||
95 | rcu_irq_enter(); | ||
96 | |||
91 | /* In case another CPU set the tracer_frame on us */ | 97 | /* In case another CPU set the tracer_frame on us */ |
92 | if (unlikely(!frame_size)) | 98 | if (unlikely(!frame_size)) |
93 | this_size -= tracer_frame; | 99 | this_size -= tracer_frame; |
@@ -169,6 +175,7 @@ check_stack(unsigned long ip, unsigned long *stack) | |||
169 | } | 175 | } |
170 | 176 | ||
171 | out: | 177 | out: |
178 | rcu_irq_exit(); | ||
172 | arch_spin_unlock(&max_stack_lock); | 179 | arch_spin_unlock(&max_stack_lock); |
173 | local_irq_restore(flags); | 180 | local_irq_restore(flags); |
174 | } | 181 | } |