• Masami Hiramatsu's avatar
    perf probe: Fix to show correct locations for events on modules · e1eac347
    Masami Hiramatsu authored
    
    [ Upstream commit d2d4edbe ]
    
    Fix to show correct locations for events on modules by relocating given
    address instead of retrying after failure.
    
    This happens when the module text size is big enough, bigger than
    sh_addr, because the original code retries with given address + sh_addr
    if it failed to find CU DIE at the given address.
    
    Any address smaller than sh_addr always fails and it retries with the
    correct address, but addresses bigger than sh_addr will get a CU DIE
    which is on the given address (not adjusted by sh_addr).
    
    In my environment(x86-64), the sh_addr of ".text" section is 0x10030.
    Since i915 is a huge kernel module, we can see this issue as below.
    
      $ grep "[Tt] .*\[i915\]" /proc/kallsyms | sort | head -n1
      ffffffffc0270000 t i915_switcheroo_can_switch	[i915]
    
    ffffffffc0270000 + 0x10030 = ffffffffc0280030, so we'll check
    symbols cross this boundary.
    
      $ grep "[Tt] .*\[i915\]" /proc/kallsyms | grep -B1 ^ffffffffc028\
      | head -n 2
      ffffffffc027ff80 t haswell_init_clock_gating	[i915]
      ffffffffc0280110 t valleyview_init_clock_gating	[i915]
    
    So setup probes on both function and see what happen.
    
      $ sudo ./perf probe -m i915 -a haswell_init_clock_gating \
            -a valleyview_init_clock_gating
      Added new events:
        probe:haswell_init_clock_gating (on haswell_init_clock_gating in i915)
        probe:valleyview_init_clock_gating (on valleyview_init_clock_gating in i915)
    
      You can now use it in all perf tools, such as:
    
      	perf record -e probe:valleyview_init_clock_gating -aR sleep 1
    
      $ sudo ./perf probe -l
        probe:haswell_init_clock_gating (on haswell_init_clock_gating@gpu/drm/i915/intel_pm.c in i915)
        probe:valleyview_init_clock_gating (on i915_vga_set_decode:4@gpu/drm/i915/i915_drv.c in i915)
    
    As you can see, haswell_init_clock_gating is correctly shown,
    but valleyview_init_clock_gating is not.
    
    With this patch, both events are shown correctly.
    
      $ sudo ./perf probe -l
        probe:haswell_init_clock_gating (on haswell_init_clock_gating@gpu/drm/i915/intel_pm.c in i915)
        probe:valleyview_init_clock_gating (on valleyview_init_clock_gating@gpu/drm/i915/intel_pm.c in i915)
    
    Committer notes:
    
    In my case:
    
      # perf probe -m i915 -a haswell_init_clock_gating -a valleyview_init_clock_gating
      Added new events:
        probe:haswell_init_clock_gating (on haswell_init_clock_gating in i915)
        probe:valleyview_init_clock_gating (on valleyview_init_clock_gating in i915)
    
      You can now use it in all perf tools, such as:
    
    	  perf record -e probe:valleyview_init_clock_gating -aR sleep 1
    
      # perf probe -l
        probe:haswell_init_clock_gating (on i915_getparam+432@gpu/drm/i915/i915_drv.c in i915)
        probe:valleyview_init_clock_gating (on __i915_printk+240@gpu/drm/i915/i915_drv.c in i915)
      #
    
      # readelf -SW /lib/modules/4.9.0+/build/vmlinux | egrep -w '.text|Name'
       [Nr] Name   Type      Address          Off    Size   ES Flg Lk Inf Al
       [ 1] .text  PROGBITS  ffffffff81000000 200000 822fd3 00  AX  0   0 4096
      #
    
      So both are b0rked, now with the fix:
    
      # perf probe -m i915 -a haswell_init_clock_gating -a valleyview_init_clock_gating
      Added new events:
        probe:haswell_init_clock_gating (on haswell_init_clock_gating in i915)
        probe:valleyview_init_clock_gating (on valleyview_init_clock_gating in i915)
    
      You can now use it in all perf tools, such as:
    
    	perf record -e probe:valleyview_init_clock_gating -aR sleep 1
    
      # perf probe -l
        probe:haswell_init_clock_gating (on haswell_init_clock_gating@gpu/drm/i915/intel_pm.c in i915)
        probe:valleyview_init_clock_gating (on valleyview_init_clock_gating@gpu/drm/i915/intel_pm.c in i915)
      #
    
    Both looks correct.
    Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/148411436777.9978.1440275861947194930.stgit@devboxSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    e1eac347
probe-finder.c 46.4 KB