• Steven Rostedt (Red Hat)'s avatar
    ftrace: Use current addr when converting to nop in __ftrace_replace_code() · 39b5552c
    Steven Rostedt (Red Hat) authored
    In __ftrace_replace_code(), when converting the call to a nop in a function
    it needs to compare against the "curr" (current) value of the ftrace ops, and
    not the "new" one. It currently does not affect x86 which is the only arch
    to do the trampolines with function graph tracer, but when other archs that do
    depend on this code implement the function graph trampoline, it can crash.
    
    Here's an example when ARM uses the trampolines (in the future):
    
     ------------[ cut here ]------------
     WARNING: CPU: 0 PID: 9 at kernel/trace/ftrace.c:1716 ftrace_bug+0x17c/0x1f4()
     Modules linked in: omap_rng rng_core ipv6
     CPU: 0 PID: 9 Comm: migration/0 Not tainted 3.16.0-test-10959-gf0094b28-dirty #52
     [<c02188f4>] (unwind_backtrace) from [<c021343c>] (show_stack+0x20/0x24)
     [<c021343c>] (show_stack) from [<c095a674>] (dump_stack+0x78/0x94)
     [<c095a674>] (dump_stack) from [<c02532a0>] (warn_slowpath_common+0x7c/0x9c)
     [<c02532a0>] (warn_slowpath_common) from [<c02532ec>] (warn_slowpath_null+0x2c/0x34)
     [<c02532ec>] (warn_slowpath_null) from [<c02cbac4>] (ftrace_bug+0x17c/0x1f4)
     [<c02cbac4>] (ftrace_bug) from [<c02cc44c>] (ftrace_replace_code+0x80/0x9c)
     [<c02cc44c>] (ftrace_replace_code) from [<c02cc658>] (ftrace_modify_all_code+0xb8/0x164)
     [<c02cc658>] (ftrace_modify_all_code) from [<c02cc718>] (__ftrace_modify_code+0x14/0x1c)
     [<c02cc718>] (__ftrace_modify_code) from [<c02c7244>] (multi_cpu_stop+0xf4/0x134)
     [<c02c7244>] (multi_cpu_stop) from [<c02c6e90>] (cpu_stopper_thread+0x54/0x130)
     [<c02c6e90>] (cpu_stopper_thread) from [<c0271cd4>] (smpboot_thread_fn+0x1ac/0x1bc)
     [<c0271cd4>] (smpboot_thread_fn) from [<c026ddf0>] (kthread+0xe0/0xfc)
     [<c026ddf0>] (kthread) from [<c020f318>] (ret_from_fork+0x14/0x20)
     ---[ end trace dc9ce72c5b617d8f ]---
    [   65.047264] ftrace failed to modify [<c0208580>] asm_do_IRQ+0x10/0x1c
    [   65.054070]  actual: 85:1b:00:eb
    
    Fixes: 7413af1f "ftrace: Make get_ftrace_addr() and get_ftrace_addr_old() global"
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    39b5552c
ftrace.c 125 KB