ftrace: Do not function trace inlined functions
authorSteven Rostedt <srostedt@redhat.com>
Mon, 12 Dec 2011 20:22:41 +0000 (15:22 -0500)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 16 Jan 2013 01:13:23 +0000 (01:13 +0000)
commitf2ad8a6a8636c997e03bde48b2df2bc4796ff0cb
tree6fc438e7dbd08d7c9108cc2403ee13749ea4af76
parentc31f484c903a7d8ad628ef446fc4c55b21e2d26d
ftrace: Do not function trace inlined functions

commit 45959ee7aa645815a5ce303a0ea1e48a21e67c6a upstream.

When gcc inlines a function, it does not mark it with the mcount
prologue, which in turn means that inlined functions are not traced
by the function tracer. But if CONFIG_OPTIMIZE_INLINING is set, then
gcc is allowed not to inline a function that is marked inline.

Depending on the options and the compiler, a function may or may
not be traced by the function tracer, depending on whether gcc
decides to inline a function or not. This has caused several
problems in the pass becaues gcc is not always consistent with
what it decides to inline between different gcc versions.

Some places should not be traced (like paravirt native_* functions)
and these are mostly marked as inline. When gcc decides not to
inline the function, and if that function should not be traced, then
the ftrace function tracer will suddenly break when it use to work
fine. This becomes even harder to debug when different versions of
gcc will not inline that function, making the same kernel and config
work for some gcc versions and not work for others.

By making all functions marked inline to not be traced will remove
the ambiguity that gcc adds when it comes to tracing functions marked
inline. All gcc versions will be consistent with what functions are
traced and having volatile working code will be removed.

Note, only the inline macro when CONFIG_OPTIMIZE_INLINING is set needs
to have notrace added, as the attribute __always_inline will force
the function to be inlined and then not traced.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
include/linux/compiler-gcc.h