• Masami Hiramatsu (Google)'s avatar
    tracing/probes: Add fprobe events for tracing function entry and exit. · 334e5519
    Masami Hiramatsu (Google) authored
    Add fprobe events for tracing function entry and exit instead of kprobe
    events. With this change, we can continue to trace function entry/exit
    even if the CONFIG_KPROBES_ON_FTRACE is not available. Since
    CONFIG_KPROBES_ON_FTRACE requires the CONFIG_DYNAMIC_FTRACE_WITH_REGS,
    it is not available if the architecture only supports
    CONFIG_DYNAMIC_FTRACE_WITH_ARGS. And that means kprobe events can not
    probe function entry/exit effectively on such architecture.
    But this can be solved if the dynamic events supports fprobe events.
    
    The fprobe event is a new dynamic events which is only for the function
    (symbol) entry and exit. This event accepts non register fetch arguments
    so that user can trace the function arguments and return values.
    
    The fprobe events syntax is here;
    
     f[:[GRP/][EVENT]] FUNCTION [FETCHARGS]
     f[MAXACTIVE][:[GRP/][EVENT]] FUNCTION%return [FETCHARGS]
    
    E.g.
    
     # echo 'f vfs_read $arg1'  >> dynamic_events
     # echo 'f vfs_read%return $retval'  >> dynamic_events
     # cat dynamic_events
     f:fprobes/vfs_read__entry vfs_read arg1=$arg1
     f:fprobes/vfs_read__exit vfs_read%return arg1=$retval
     # echo 1 > events/fprobes/enable
     # head -n 20 trace | tail
     #           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
     #              | |         |   |||||     |         |
                  sh-142     [005] ...1.   448.386420: vfs_read__entry: (vfs_read+0x4/0x340) arg1=0xffff888007f7c540
                  sh-142     [005] .....   448.386436: vfs_read__exit: (ksys_read+0x75/0x100 <- vfs_read) arg1=0x1
                  sh-142     [005] ...1.   448.386451: vfs_read__entry: (vfs_read+0x4/0x340) arg1=0xffff888007f7c540
                  sh-142     [005] .....   448.386458: vfs_read__exit: (ksys_read+0x75/0x100 <- vfs_read) arg1=0x1
                  sh-142     [005] ...1.   448.386469: vfs_read__entry: (vfs_read+0x4/0x340) arg1=0xffff888007f7c540
                  sh-142     [005] .....   448.386476: vfs_read__exit: (ksys_read+0x75/0x100 <- vfs_read) arg1=0x1
                  sh-142     [005] ...1.   448.602073: vfs_read__entry: (vfs_read+0x4/0x340) arg1=0xffff888007f7c540
                  sh-142     [005] .....   448.602089: vfs_read__exit: (ksys_read+0x75/0x100 <- vfs_read) arg1=0x1
    
    Link: https://lore.kernel.org/all/168507469754.913472.6112857614708350210.stgit@mhiramat.roam.corp.google.com/Reported-by: default avatarkernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/all/202302011530.7vm4O8Ro-lkp@intel.com/Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    334e5519
trace_kprobe.c 48.2 KB