tracing: Avoid unnecessary multiple recursion checks
authorSteven Rostedt <srostedt@redhat.com>
Fri, 2 Nov 2012 21:47:21 +0000 (17:47 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Wed, 23 Jan 2013 04:38:01 +0000 (23:38 -0500)
commitedc15cafcbfa3d73f819cae99885a2e35e4cbce5
tree964e0de8816e6d4b602318d90718770921e301d2
parente46cbf75c621725964fe1f6e7013e8bcd86a0e3d
tracing: Avoid unnecessary multiple recursion checks

When function tracing occurs, the following steps are made:
  If arch does not support a ftrace feature:
   call internal function (uses INTERNAL bits) which calls...
  If callback is registered to the "global" list, the list
   function is called and recursion checks the GLOBAL bits.
   then this function calls...
  The function callback, which can use the FTRACE bits to
   check for recursion.

Now if the arch does not suppport a feature, and it calls
the global list function which calls the ftrace callback
all three of these steps will do a recursion protection.
There's no reason to do one if the previous caller already
did. The recursion that we are protecting against will
go through the same steps again.

To prevent the multiple recursion checks, if a recursion
bit is set that is higher than the MAX bit of the current
check, then we know that the check was made by the previous
caller, and we can skip the current check.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ftrace.c
kernel/trace/trace.h