perf annotate: Fix up usage of the build id cache
authorArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 23 May 2010 22:12:25 +0000 (19:12 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 May 2010 01:35:07 +0000 (22:35 -0300)
It was assuming that the cache was always available and also wasn't
checking if the file found in the build id cache was just a kallsyms
file, that is not supported by objdump for disassembly.

Reported-by: Ingo Molnar <mingo@elte.hu>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/hist.c

index 682a6d8..cbf7eae 100644 (file)
@@ -990,6 +990,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
        struct map *map = self->ms.map;
        struct dso *dso = map->dso;
        char *filename = dso__build_id_filename(dso, NULL, 0);
+       bool free_filename = true;
        char command[PATH_MAX * 2];
        FILE *file;
        int err = 0;
@@ -1001,11 +1002,19 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
                               sym->name);
                        return -ENOMEM;
                }
+               goto fallback;
+       } else if (readlink(filename, command, sizeof(command)) < 0 ||
+                  strstr(command, "[kernel.kallsyms]") ||
+                  access(filename, R_OK)) {
+               free(filename);
+fallback:
                /*
-                * If we don't have build-ids, well, lets hope that this
+                * If we don't have build-ids or the build-id file isn't in the
+                * cache, or is just a kallsyms file, well, lets hope that this
                 * DSO is the same as when 'perf record' ran.
                 */
                filename = dso->long_name;
+               free_filename = false;
        }
 
        if (dso->origin == DSO__ORIG_KERNEL) {
@@ -1045,7 +1054,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
 
        pclose(file);
 out_free_filename:
-       if (dso->has_build_id)
+       if (free_filename)
                free(filename);
        return err;
 }