Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ftrace: change function graph tracer to use new in_nmi

The function graph tracer piggy backed onto the dynamic ftracer
to use the in_nmi custom code for dynamic tracing. The problem
was (as Andrew Morton pointed out) it really only wanted to bail
out if the context of the current CPU was in NMI context. But the
dynamic ftrace in_nmi custom code was true if _any_ CPU happened
to be in NMI context.

Now that we have a generic in_nmi interface, this patch changes
the function graph code to use it instead of the dynamic ftarce
custom code.

Reported-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Steven Rostedt <srostedt@redhat.com>

+2 -21
+1 -1
arch/x86/Kconfig
··· 34 34 select HAVE_FUNCTION_TRACER 35 35 select HAVE_FUNCTION_GRAPH_TRACER 36 36 select HAVE_FUNCTION_TRACE_MCOUNT_TEST 37 - select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE || FUNCTION_GRAPH_TRACER 37 + select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE 38 38 select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) 39 39 select HAVE_ARCH_KGDB if !X86_VOYAGER 40 40 select HAVE_ARCH_TRACEHOOK
+1 -20
arch/x86/kernel/ftrace.c
··· 367 367 return ftrace_mod_jmp(ip, old_offset, new_offset); 368 368 } 369 369 370 - #else /* CONFIG_DYNAMIC_FTRACE */ 371 - 372 - /* 373 - * These functions are picked from those used on 374 - * this page for dynamic ftrace. They have been 375 - * simplified to ignore all traces in NMI context. 376 - */ 377 - static atomic_t nmi_running; 378 - 379 - void arch_ftrace_nmi_enter(void) 380 - { 381 - atomic_inc(&nmi_running); 382 - } 383 - 384 - void arch_ftrace_nmi_exit(void) 385 - { 386 - atomic_dec(&nmi_running); 387 - } 388 - 389 370 #endif /* !CONFIG_DYNAMIC_FTRACE */ 390 371 391 372 /* Add a function return address to the trace stack on thread info.*/ ··· 456 475 &return_to_handler; 457 476 458 477 /* Nmi's are currently unsupported */ 459 - if (unlikely(atomic_read(&nmi_running))) 478 + if (unlikely(in_nmi())) 460 479 return; 461 480 462 481 if (unlikely(atomic_read(&current->tracing_graph_pause)))