• Jiri Olsa's avatar
    ftrace: Show all functions with addresses in available_filter_functions_addrs · 83f74441
    Jiri Olsa authored
    Adding new available_filter_functions_addrs file that shows all available
    functions (same as available_filter_functions) together with addresses,
    like:
    
      # cat available_filter_functions_addrs | head
      ffffffff81000770 __traceiter_initcall_level
      ffffffff810007c0 __traceiter_initcall_start
      ffffffff81000810 __traceiter_initcall_finish
      ffffffff81000860 trace_initcall_finish_cb
      ...
    
    Note displayed address is the patch-site address and can differ from
    /proc/kallsyms address.
    
    It's useful to have address avilable for traceable symbols, so we don't
    need to allways cross check kallsyms with available_filter_functions
    (or the other way around) and have all the data in single file.
    
    For backwards compatibility reasons we can't change the existing
    available_filter_functions file output, but we need to add new file.
    
    The problem is that we need to do 2 passes:
    
     - through available_filter_functions and find out if the function is traceable
     - through /proc/kallsyms to get the address for traceable function
    
    Having available_filter_functions symbols together with addresses allow
    us to skip the kallsyms step and we are ok with the address in
    available_filter_functions_addr not being the function entry, because
    kprobe_multi uses fprobe and that handles both entry and patch-site
    address properly.
    
    We have 2 interfaces how to create kprobe_multi link:
    
      a) passing symbols to kernel
    
         1) user gathers symbols and need to ensure that they are
            trace-able -> pass through available_filter_functions file
    
         2) kernel takes those symbols and translates them to addresses
            through kallsyms api
    
         3) addresses are passed to fprobe/ftrace through:
    
             register_fprobe_ips
             -> ftrace_set_filter_ips
    
      b) passing addresses to kernel
    
         1) user gathers symbols and needs to ensure that they are
            trace-able -> pass through available_filter_functions file
    
         2) user takes those symbols and translates them to addresses
           through /proc/kallsyms
    
         3) addresses are passed to the kernel and kernel calls:
    
             register_fprobe_ips
             -> ftrace_set_filter_ips
    
    The new available_filter_functions_addrs file helps us with option b),
    because we can make 'b 1' and 'b 2' in one step - while filtering traceable
    functions, we get the address directly.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20230611130029.1202298-1-jolsa@kernel.org
    
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
    Tested-by: Jackie Liu <liuyun01@kylinos.cn> # x86
    Suggested-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    Suggested-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    83f74441
ftrace.c 196 KB