diff options
Diffstat (limited to 'kernel/trace')
| -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) |
