ftrace: Call ftrace cleanup module notifier after all other notifiers
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Wed, 13 Feb 2013 20:18:38 +0000 (15:18 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Tue, 19 Feb 2013 04:09:26 +0000 (23:09 -0500)
commit8c189ea64eea01ca20d102ddb74d6936dd16c579
tree7836952a838205f0e87327e58fe5e51c48ed01be
parentf431b634f24d099872e78acc356c7fd35913b36b
ftrace: Call ftrace cleanup module notifier after all other notifiers

Commit: c1bf08ac "ftrace: Be first to run code modification on modules"

changed ftrace module notifier's priority to INT_MAX in order to
process the ftrace nops before anything else could touch them
(namely kprobes). This was the correct thing to do.

Unfortunately, the ftrace module notifier also contains the ftrace
clean up code. As opposed to the set up code, this code should be
run *after* all the module notifiers have run in case a module is doing
correct clean-up and unregisters its ftrace hooks. Basically, ftrace
needs to do clean up on module removal, as it needs to know about code
being removed so that it doesn't try to modify that code. But after it
removes the module from its records, if a ftrace user tries to remove
a probe, that removal will fail due as the record of that code segment
no longer exists.

Nothing really bad happens if the probe removal is called after ftrace
did the clean up, but the ftrace removal function will return an error.
Correct code (such as kprobes) will produce a WARN_ON() if it fails
to remove the probe. As people get annoyed by frivolous warnings, it's
best to do the ftrace clean up after everything else.

By splitting the ftrace_module_notifier into two notifiers, one that
does the module load setup that is run at high priority, and the other
that is called for module clean up that is run at low priority, the
problem is solved.

Cc: stable@vger.kernel.org
Reported-by: Frank Ch. Eigler <fche@redhat.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ftrace.c