• Masami Hiramatsu's avatar
    tracing/kprobe: Fix to support kretprobe events on unloaded modules · 97c753e6
    Masami Hiramatsu authored
    Fix kprobe_on_func_entry() returns error code instead of false so that
    register_kretprobe() can return an appropriate error code.
    
    append_trace_kprobe() expects the kprobe registration returns -ENOENT
    when the target symbol is not found, and it checks whether the target
    module is unloaded or not. If the target module doesn't exist, it
    defers to probe the target symbol until the module is loaded.
    
    However, since register_kretprobe() returns -EINVAL instead of -ENOENT
    in that case, it always fail on putting the kretprobe event on unloaded
    modules. e.g.
    
    Kprobe event:
    /sys/kernel/debug/tracing # echo p xfs:xfs_end_io >> kprobe_events
    [   16.515574] trace_kprobe: This probe might be able to register after target module is loaded. Continue.
    
    Kretprobe event: (p -> r)
    /sys/kernel/debug/tracing # echo r xfs:xfs_end_io >> kprobe_events
    sh: write error: Invalid argument
    /sys/kernel/debug/tracing # cat error_log
    [   41.122514] trace_kprobe: error: Failed to register probe event
      Command: r xfs:xfs_end_io
                 ^
    
    To fix this bug, change kprobe_on_func_entry() to detect symbol lookup
    failure and return -ENOENT in that case. Otherwise it returns -EINVAL
    or 0 (succeeded, given address is on the entry).
    
    Link: https://lkml.kernel.org/r/161176187132.1067016.8118042342894378981.stgit@devnote2
    
    Cc: stable@vger.kernel.org
    Fixes: 59158ec4 ("tracing/kprobes: Check the probe on unloaded module correctly")
    Reported-by: default avatarJianlin Lv <Jianlin.Lv@arm.com>
    Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    97c753e6
trace_kprobe.c 51.1 KB