• Arnaldo Carvalho de Melo's avatar
    perf map_groups: Add a front end cache for map lookups by name · 1ae14516
    Arnaldo Carvalho de Melo authored
    Lets see if it helps:
    
    First look at the probeable lines for the function that does lookups by
    name in a map_groups struct:
    
      # perf probe -x ~/bin/perf -L map_groups__find_by_name
      <map_groups__find_by_name@/home/acme/git/perf/tools/perf/util/symbol.c:0>
            0  struct map *map_groups__find_by_name(struct map_groups *mg, const char *name)
            1  {
            2         struct maps *maps = &mg->maps;
                      struct map *map;
    
            5         down_read(&maps->lock);
    
            7         if (mg->last_search_by_name && strcmp(mg->last_search_by_name->dso->short_name, name) == 0) {
            8                 map = mg->last_search_by_name;
            9                 goto out_unlock;
                      }
    
           12         maps__for_each_entry(maps, map)
           13                 if (strcmp(map->dso->short_name, name) == 0) {
           14                         mg->last_search_by_name = map;
           15                         goto out_unlock;
                              }
    
           18         map = NULL;
    
               out_unlock:
           21         up_read(&maps->lock);
           22         return map;
           23  }
    
               int dso__load_vmlinux(struct dso *dso, struct map *map,
                                    const char *vmlinux, bool vmlinux_allocated)
    
      #
    
    Now add a probe to the place where we reuse the last search:
    
      # perf probe -x ~/bin/perf map_groups__find_by_name:8
      Added new event:
        probe_perf:map_groups__find_by_name (on map_groups__find_by_name:8 in /home/acme/bin/perf)
    
      You can now use it in all perf tools, such as:
    
      	perf record -e probe_perf:map_groups__find_by_name -aR sleep 1
    
      #
    
    Now lets do a system wide 'perf stat' counting those events:
    
      # perf stat -e probe_perf:*
    
    Leave it running and lets do a 'perf top', then, after a while, stop the
    'perf stat':
    
      # perf stat -e probe_perf:*
      ^C
       Performance counter stats for 'system wide':
    
                   3,603      probe_perf:map_groups__find_by_name
    
            44.565253139 seconds time elapsed
      #
    
    yeah, good to have.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https://lkml.kernel.org/n/tip-tcz37g3nxv3tvxw3q90vga3p@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1ae14516
map.c 21.2 KB