linux/kernel/trace
Steven Rostedt 1085a87765 ftrace: Be first to run code modification on modules
commit c1bf08ac26 upstream.

If some other kernel subsystem has a module notifier, and adds a kprobe
to a ftrace mcount point (now that kprobes work on ftrace points),
when the ftrace notifier runs it will fail and disable ftrace, as well
as kprobes that are attached to ftrace points.

Here's the error:

 WARNING: at kernel/trace/ftrace.c:1618 ftrace_bug+0x239/0x280()
 Hardware name: Bochs
 Modules linked in: fat(+) stap_56d28a51b3fe546293ca0700b10bcb29__8059(F) nfsv4 auth_rpcgss nfs dns_resolver fscache xt_nat iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack lockd sunrpc ppdev parport_pc parport microcode virtio_net i2c_piix4 drm_kms_helper ttm drm i2c_core [last unloaded: bid_shared]
 Pid: 8068, comm: modprobe Tainted: GF            3.7.0-0.rc8.git0.1.fc19.x86_64 #1
 Call Trace:
  [<ffffffff8105e70f>] warn_slowpath_common+0x7f/0xc0
  [<ffffffff81134106>] ? __probe_kernel_read+0x46/0x70
  [<ffffffffa0180000>] ? 0xffffffffa017ffff
  [<ffffffffa0180000>] ? 0xffffffffa017ffff
  [<ffffffff8105e76a>] warn_slowpath_null+0x1a/0x20
  [<ffffffff810fd189>] ftrace_bug+0x239/0x280
  [<ffffffff810fd626>] ftrace_process_locs+0x376/0x520
  [<ffffffff810fefb7>] ftrace_module_notify+0x47/0x50
  [<ffffffff8163912d>] notifier_call_chain+0x4d/0x70
  [<ffffffff810882f8>] __blocking_notifier_call_chain+0x58/0x80
  [<ffffffff81088336>] blocking_notifier_call_chain+0x16/0x20
  [<ffffffff810c2a23>] sys_init_module+0x73/0x220
  [<ffffffff8163d719>] system_call_fastpath+0x16/0x1b
 ---[ end trace 9ef46351e53bbf80 ]---
 ftrace failed to modify [<ffffffffa0180000>] init_once+0x0/0x20 [fat]
  actual: cc:bb:d2:4b:e1

A kprobe was added to the init_once() function in the fat module on load.
But this happened before ftrace could have touched the code. As ftrace
didn't run yet, the kprobe system had no idea it was a ftrace point and
simply added a breakpoint to the code (0xcc in the cc:bb:d2:4b:e1).

Then when ftrace went to modify the location from a call to mcount/fentry
into a nop, it didn't see a call op, but instead it saw the breakpoint op
and not knowing what to do with it, ftrace shut itself down.

The solution is to simply give the ftrace module notifier the max priority.
This should have been done regardless, as the core code ftrace modification
also happens very early on in boot up. This makes the module modification
closer to core modification.

Link: http://lkml.kernel.org/r/20130107140333.593683061@goodmis.org

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Reported-by: Frank Ch. Eigler <fche@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2013-01-27 20:46:28 -08:00
..
blktrace.c block: make unplug timer trace event correspond to the schedule() unplug 2011-04-16 13:51:05 +02:00
ftrace.c ftrace: Be first to run code modification on modules 2013-01-27 20:46:28 -08:00
Kconfig ftrace: Build without frame pointers on Microblaze 2011-04-21 09:06:24 -04:00
Makefile
power-traces.c
ring_buffer_benchmark.c
ring_buffer.c ring-buffer: Fix race between integrity check and readers 2013-01-17 08:43:56 -08:00
trace_branch.c
trace_clock.c Fix common misspellings 2011-03-31 11:26:23 -03:00
trace_entries.h tracing: Fix ftrace stack trace entries 2012-04-13 08:14:06 -07:00
trace_event_perf.c
trace_events_filter.c trace_events_filter: Use rcu_assign_pointer() when setting ftrace_event_call->filter 2011-12-09 08:52:47 -08:00
trace_events.c tracing: fix event_subsystem ref counting 2011-12-09 08:52:48 -08:00
trace_export.c tracing: Fix ftrace stack trace entries 2012-04-13 08:14:06 -07:00
trace_functions_graph.c Fix common misspellings 2011-03-31 11:26:23 -03:00
trace_functions.c ftrace: Fix regression of :mod:module function enabling 2011-10-16 14:14:55 -07:00
trace_irqsoff.c ftrace: Implement separate user function filtering 2011-05-18 15:29:50 -04:00
trace_kdb.c
trace_kprobe.c kprobes/trace: Fix kprobe selftest for gcc 4.6 2011-06-07 14:47:36 -04:00
trace_mmiotrace.c
trace_nop.c
trace_output.c tracing: Add __print_symbolic_u64 to avoid warnings on 32bit machine 2011-05-25 22:13:44 -04:00
trace_output.h
trace_printk.c tracing: Fix regression in printk_formats file 2011-06-09 08:42:15 -04:00
trace_sched_switch.c
trace_sched_wakeup.c ftrace: Implement separate user function filtering 2011-05-18 15:29:50 -04:00
trace_selftest_dynamic.c ftrace: Add self-tests for multiple function trace users 2011-05-18 19:24:51 -04:00
trace_selftest.c ftrace: Add self-tests for multiple function trace users 2011-05-18 19:24:51 -04:00
trace_stack.c ftrace: Implement separate user function filtering 2011-05-18 15:29:50 -04:00
trace_stat.c
trace_stat.h
trace_syscalls.c
trace_workqueue.c
trace.c tracing: change CPU ring buffer state from tracing_cpumask 2012-07-16 08:47:51 -07:00
trace.h tracing: Fix bug when reading system filters on module removal 2011-08-04 21:58:38 -07:00