lkml.org 
[lkml]   [2019]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/63] perf probe: Fix to probe a function which has no entry pc
    Date
    From: Masami Hiramatsu <mhiramat@kernel.org>

    Fix 'perf probe' to probe a function which has no entry pc or low pc but
    only has ranges attribute.

    probe_point_search_cb() uses dwarf_entrypc() to get the probe address,
    but that doesn't work for the function DIE which has only ranges
    attribute. Use die_entrypc() instead.

    Without this fix:

    # perf probe -k ../build-x86_64/vmlinux -D clear_tasks_mm_cpumask:0
    Probe point 'clear_tasks_mm_cpumask' not found.
    Error: Failed to add events.

    With this:

    # perf probe -k ../build-x86_64/vmlinux -D clear_tasks_mm_cpumask:0
    p:probe/clear_tasks_mm_cpumask clear_tasks_mm_cpumask+0

    Committer testing:

    Before:

    [root@quaco ~]# perf probe clear_tasks_mm_cpumask:0
    Probe point 'clear_tasks_mm_cpumask' not found.
    Error: Failed to add events.
    [root@quaco ~]#

    After:

    [root@quaco ~]# perf probe clear_tasks_mm_cpumask:0
    Added new event:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask)

    You can now use it in all perf tools, such as:

    perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1

    [root@quaco ~]#

    Using it with 'perf trace':

    [root@quaco ~]# perf trace -e probe:clear_tasks_mm_cpumask

    Doesn't seem to be used in x86_64:

    $ find . -name "*.c" | xargs grep clear_tasks_mm_cpumask
    ./kernel/cpu.c: * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU
    ./kernel/cpu.c:void clear_tasks_mm_cpumask(int cpu)
    ./arch/xtensa/kernel/smp.c: clear_tasks_mm_cpumask(cpu);
    ./arch/csky/kernel/smp.c: clear_tasks_mm_cpumask(cpu);
    ./arch/sh/kernel/smp.c: clear_tasks_mm_cpumask(cpu);
    ./arch/arm/kernel/smp.c: clear_tasks_mm_cpumask(cpu);
    ./arch/powerpc/mm/nohash/mmu_context.c: clear_tasks_mm_cpumask(cpu);
    $ find . -name "*.h" | xargs grep clear_tasks_mm_cpumask
    ./include/linux/cpu.h:void clear_tasks_mm_cpumask(int cpu);
    $ find . -name "*.S" | xargs grep clear_tasks_mm_cpumask
    $

    Fixes: e1ecbbc3fa83 ("perf probe: Fix to handle optimized not-inlined functions")
    Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: http://lore.kernel.org/lkml/157199319438.8075.4695576954550638618.stgit@devnote2
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/probe-finder.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
    index 2b6513e5725c..71633f55f045 100644
    --- a/tools/perf/util/probe-finder.c
    +++ b/tools/perf/util/probe-finder.c
    @@ -982,7 +982,7 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data)
    param->retval = find_probe_point_by_line(pf);
    } else if (die_is_func_instance(sp_die)) {
    /* Instances always have the entry address */
    - dwarf_entrypc(sp_die, &pf->addr);
    + die_entrypc(sp_die, &pf->addr);
    /* But in some case the entry address is 0 */
    if (pf->addr == 0) {
    pr_debug("%s has no entry PC. Skipped\n",
    --
    2.21.0
    \
     
     \ /
      Last update: 2019-11-07 20:04    [W:5.275 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site