perf symbols: Ditch vdso global variable
authorArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 3 Feb 2010 18:52:02 +0000 (16:52 -0200)
committerIngo Molnar <mingo@elte.hu>
Thu, 4 Feb 2010 08:33:26 +0000 (09:33 +0100)
We can check using strcmp, most DSOs don't start with '[' so the
test is cheap enough and we had to test it there anyway since
when reading perf.data files we weren't calling the routine that
created this global variable and thus weren't setting it as
"loaded", which was causing a bogus:

  Failed to open [vdso], continuing without symbols

Message as the first line of 'perf report'.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1265223128-11786-3-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/util/map.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index 36ff0bf0315dd8632f081c3d09a40c1ff14e15e4..f6626cc3df2eecd7cb613c4d3c06cec7de1db670 100644 (file)
@@ -68,8 +68,13 @@ struct map *map__new(struct mmap_event *event, enum map_type type,
                map__init(self, type, event->start, event->start + event->len,
                          event->pgoff, dso);
 
-               if (self->dso == vdso || anon)
+               if (anon) {
+set_identity:
                        self->map_ip = self->unmap_ip = identity__map_ip;
+               } else if (strcmp(filename, "[vdso]") == 0) {
+                       dso__set_loaded(dso, self->type);
+                       goto set_identity;
+               }
        }
        return self;
 out_delete:
index 051d71b33df0fd709023e743291f3aa461193e1e..e752837363ee210418aa57bc9916fa6aef1c6af7 100644 (file)
@@ -53,11 +53,6 @@ bool dso__sorted_by_name(const struct dso *self, enum map_type type)
        return self->sorted_by_name & (1 << type);
 }
 
-static void dso__set_loaded(struct dso *self, enum map_type type)
-{
-       self->loaded |= (1 << type);
-}
-
 static void dso__set_sorted_by_name(struct dso *self, enum map_type type)
 {
        self->sorted_by_name |= (1 << type);
@@ -1697,7 +1692,6 @@ out_fixup:
 
 LIST_HEAD(dsos__user);
 LIST_HEAD(dsos__kernel);
-struct dso *vdso;
 
 static void dsos__add(struct list_head *head, struct dso *dso)
 {
@@ -1790,24 +1784,12 @@ static struct dso *dsos__create_kernel(const char *vmlinux)
 {
        struct dso *kernel = dso__new_kernel(vmlinux);
 
-       if (kernel == NULL)
-               return NULL;
-
-       vdso = dso__new("[vdso]");
-       if (vdso == NULL)
-               goto out_delete_kernel_dso;
-       dso__set_loaded(vdso, MAP__FUNCTION);
-
-       dso__read_running_kernel_build_id(kernel);
-
-       dsos__add(&dsos__kernel, kernel);
-       dsos__add(&dsos__user, vdso);
+       if (kernel != NULL) {
+               dso__read_running_kernel_build_id(kernel);
+               dsos__add(&dsos__kernel, kernel);
+       }
 
        return kernel;
-
-out_delete_kernel_dso:
-       dso__delete(kernel);
-       return NULL;
 }
 
 int __map_groups__create_kernel_maps(struct map_groups *self,
index e6a59e5c2beaddb5a2440228772457f3cb52ac47..e90568a9e4675888d4aafe95f39d20b13b103bc0 100644 (file)
@@ -121,6 +121,11 @@ void dso__delete(struct dso *self);
 bool dso__loaded(const struct dso *self, enum map_type type);
 bool dso__sorted_by_name(const struct dso *self, enum map_type type);
 
+static inline void dso__set_loaded(struct dso *self, enum map_type type)
+{
+       self->loaded |= (1 << type);
+}
+
 void dso__sort_by_name(struct dso *self, enum map_type type);
 
 extern struct list_head dsos__user, dsos__kernel;
@@ -161,5 +166,4 @@ int kallsyms__parse(const char *filename, void *arg,
 int symbol__init(void);
 bool symbol_type__is_a(char symbol_type, enum map_type map_type);
 
-extern struct dso *vdso;
 #endif /* __PERF_SYMBOL */