• Masami Hiramatsu's avatar
    perf probe: Fix to probe a function which has no entry pc · 5d16dbcc
    Masami Hiramatsu authored
    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: e1ecbbc3 ("perf probe: Fix to handle optimized not-inlined functions")
    Reported-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: default avatarMasami 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@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    5d16dbcc
probe-finder.c 46.1 KB