lkml.org 
[lkml]   [2017]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH perf/core v2 1/4] perf-probe: Fix to show correct locations for events on modules
    Date
    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 enough big, bigger than
    sh_addr, because original code retries withgiven 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 correct
    address, but the address which bigger than sh_addr will get a CU
    DIE which is on 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)

    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    ---
    Changes in v2:
    - Rewrite patch description with precise instructions.
    ---
    tools/perf/util/probe-finder.c | 10 +++-------
    1 file changed, 3 insertions(+), 7 deletions(-)

    diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
    index df4debe..0278fe1 100644
    --- a/tools/perf/util/probe-finder.c
    +++ b/tools/perf/util/probe-finder.c
    @@ -1543,16 +1543,12 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,
    Dwarf_Addr _addr = 0, baseaddr = 0;
    const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp;
    int baseline = 0, lineno = 0, ret = 0;
    - bool reloc = false;

    -retry:
    + /* We always need to relocate the address for aranges */
    + if (debuginfo__get_text_offset(dbg, &baseaddr) == 0)
    + addr += baseaddr;
    /* Find cu die */
    if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) {
    - if (!reloc && debuginfo__get_text_offset(dbg, &baseaddr) == 0) {
    - addr += baseaddr;
    - reloc = true;
    - goto retry;
    - }
    pr_warning("Failed to find debug information for address %lx\n",
    addr);
    ret = -EINVAL;
    \
     
     \ /
      Last update: 2017-01-11 07:01    [W:0.032 / U:35.236 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site