diff options
-rw-r--r-- | kernel/trace/ftrace.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 40f64f7cd850..af5ad8949abb 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -267,6 +267,7 @@ ftrace_record_ip(unsigned long ip) | |||
267 | unsigned long key; | 267 | unsigned long key; |
268 | int resched; | 268 | int resched; |
269 | int atomic; | 269 | int atomic; |
270 | int cpu; | ||
270 | 271 | ||
271 | if (!ftrace_enabled || ftrace_disabled) | 272 | if (!ftrace_enabled || ftrace_disabled) |
272 | return; | 273 | return; |
@@ -274,9 +275,15 @@ ftrace_record_ip(unsigned long ip) | |||
274 | resched = need_resched(); | 275 | resched = need_resched(); |
275 | preempt_disable_notrace(); | 276 | preempt_disable_notrace(); |
276 | 277 | ||
277 | /* We simply need to protect against recursion */ | 278 | /* |
278 | __get_cpu_var(ftrace_shutdown_disable_cpu)++; | 279 | * We simply need to protect against recursion. |
279 | if (__get_cpu_var(ftrace_shutdown_disable_cpu) != 1) | 280 | * Use the the raw version of smp_processor_id and not |
281 | * __get_cpu_var which can call debug hooks that can | ||
282 | * cause a recursive crash here. | ||
283 | */ | ||
284 | cpu = raw_smp_processor_id(); | ||
285 | per_cpu(ftrace_shutdown_disable_cpu, cpu)++; | ||
286 | if (per_cpu(ftrace_shutdown_disable_cpu, cpu) != 1) | ||
280 | goto out; | 287 | goto out; |
281 | 288 | ||
282 | if (unlikely(ftrace_record_suspend)) | 289 | if (unlikely(ftrace_record_suspend)) |
@@ -317,7 +324,7 @@ ftrace_record_ip(unsigned long ip) | |||
317 | out_unlock: | 324 | out_unlock: |
318 | spin_unlock_irqrestore(&ftrace_shutdown_lock, flags); | 325 | spin_unlock_irqrestore(&ftrace_shutdown_lock, flags); |
319 | out: | 326 | out: |
320 | __get_cpu_var(ftrace_shutdown_disable_cpu)--; | 327 | per_cpu(ftrace_shutdown_disable_cpu, cpu)--; |
321 | 328 | ||
322 | /* prevent recursion with scheduler */ | 329 | /* prevent recursion with scheduler */ |
323 | if (resched) | 330 | if (resched) |