• Jianlin Lv's avatar
    perf probe: Fix kretprobe issue caused by GCC bug · 105f75eb
    Jianlin Lv authored
    Perf failed to add a kretprobe event with debuginfo of vmlinux which is
    compiled by gcc with -fpatchable-function-entry option enabled.  The
    same issue with kernel module.
    
    Issue:
    
      # perf probe  -v 'kernel_clone%return $retval'
      ......
      Writing event: r:probe/kernel_clone__return _text+599624 $retval
      Failed to write event: Invalid argument
        Error: Failed to add events. Reason: Invalid argument (Code: -22)
    
      # cat /sys/kernel/debug/tracing/error_log
      [156.75] trace_kprobe: error: Retprobe address must be an function entry
      Command: r:probe/kernel_clone__return _text+599624 $retval
                                            ^
    
      # llvm-dwarfdump  vmlinux |grep  -A 10  -w 0x00df2c2b
      0x00df2c2b:   DW_TAG_subprogram
                    DW_AT_external  (true)
                    DW_AT_name      ("kernel_clone")
                    DW_AT_decl_file ("/home/code/linux-next/kernel/fork.c")
                    DW_AT_decl_line (2423)
                    DW_AT_decl_column       (0x07)
                    DW_AT_prototyped        (true)
                    DW_AT_type      (0x00dcd492 "pid_t")
                    DW_AT_low_pc    (0xffff800010092648)
                    DW_AT_high_pc   (0xffff800010092b9c)
                    DW_AT_frame_base        (DW_OP_call_frame_cfa)
    
      # cat /proc/kallsyms |grep kernel_clone
      ffff800010092640 T kernel_clone
      # readelf -s vmlinux |grep -i kernel_clone
      183173: ffff800010092640  1372 FUNC    GLOBAL DEFAULT    2 kernel_clone
    
      # objdump -d vmlinux |grep -A 10  -w \<kernel_clone\>:
      ffff800010092640 <kernel_clone>:
      ffff800010092640:       d503201f        nop
      ffff800010092644:       d503201f        nop
      ffff800010092648:       d503233f        paciasp
      ffff80001009264c:       a9b87bfd        stp     x29, x30, [sp, #-128]!
      ffff800010092650:       910003fd        mov     x29, sp
      ffff800010092654:       a90153f3        stp     x19, x20, [sp, #16]
    
    The entry address of kernel_clone converted by debuginfo is _text+599624
    (0x92648), which is consistent with the value of DW_AT_low_pc attribute.
    But the symbolic address of kernel_clone from /proc/kallsyms is
    ffff800010092640.
    
    This issue is found on arm64, -fpatchable-function-entry=2 is enabled when
    CONFIG_DYNAMIC_FTRACE_WITH_REGS=y;
    Just as objdump displayed the assembler contents of kernel_clone,
    GCC generate 2 NOPs  at the beginning of each function.
    
    kprobe_on_func_entry detects that (_text+599624) is not the entry address
    of the function, which leads to the failure of adding kretprobe event.
    
      kprobe_on_func_entry
      ->_kprobe_addr
      ->kallsyms_lookup_size_offset
      ->arch_kprobe_on_func_entry		// FALSE
    
    The cause of the issue is that the first instruction in the compile unit
    indicated by DW_AT_low_pc does not include NOPs.
    This issue exists in all gcc versions that support
    -fpatchable-function-entry option.
    
    I have reported it to the GCC community:
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98776
    
    Currently arm64 and PA-RISC may enable fpatchable-function-entry option.
    The kernel compiled with clang does not have this issue.
    
    FIX:
    
    This GCC issue only cause the registration failure of the kretprobe event
    which doesn't need debuginfo. So, stop using debuginfo for retprobe.
    map will be used to query the probe function address.
    Signed-off-by: default avatarJianlin Lv <Jianlin.Lv@arm.com>
    Acked-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: clang-built-linux@googlegroups.com
    Cc: Frank Ch. Eigler <fche@redhat.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
    Link: http://lore.kernel.org/lkml/20210210062646.2377995-1-Jianlin.Lv@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    105f75eb
probe-event.c 83.8 KB