]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - tools/perf/builtin-top.c
Merge branch 'perf/urgent' into perf/core
[mirror_ubuntu-artful-kernel.git] / tools / perf / builtin-top.c
index 37512e936235359aa4ebbf93d21831cce56750d7..c574c5b3d0e6e78759e03876d6ae686d39f62f1b 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "util/symbol.h"
 #include "util/color.h"
+#include "util/thread.h"
 #include "util/util.h"
 #include <linux/rbtree.h>
 #include "util/parse-options.h"
@@ -96,9 +97,6 @@ static int                    display_weighted                = -1;
  * Symbols
  */
 
-static u64                     min_ip;
-static u64                     max_ip = -1ll;
-
 struct sym_entry {
        struct rb_node          rb_node;
        struct list_head        node;
@@ -106,6 +104,7 @@ struct sym_entry {
        unsigned long           snap_count;
        double                  weight;
        int                     skip;
+       struct map              *map;
        struct source_line      *source;
        struct source_line      *lines;
        struct source_line      **lines_tail;
@@ -119,12 +118,11 @@ struct sym_entry {
 static void parse_source(struct sym_entry *syme)
 {
        struct symbol *sym;
-       struct module *module;
-       struct section *section = NULL;
+       struct map *map;
        FILE *file;
        char command[PATH_MAX*2];
-       const char *path = vmlinux_name;
-       u64 start, end, len;
+       const char *path;
+       u64 len;
 
        if (!syme)
                return;
@@ -135,27 +133,15 @@ static void parse_source(struct sym_entry *syme)
        }
 
        sym = (struct symbol *)(syme + 1);
-       module = sym->module;
-
-       if (module)
-               path = module->path;
-       if (!path)
-               return;
-
-       start = sym->obj_start;
-       if (!start)
-               start = sym->start;
+       map = syme->map;
+       path = map->dso->long_name;
 
-       if (module) {
-               section = module->sections->find_section(module->sections, ".text");
-               if (section)
-                       start -= section->vma;
-       }
-
-       end = start + sym->end - sym->start + 1;
        len = sym->end - sym->start;
 
-       sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s", start, end, path);
+       sprintf(command,
+               "objdump --start-address=0x%016Lx "
+                        "--stop-address=0x%016Lx -dS %s",
+               sym->start, sym->end, path);
 
        file = popen(command, "r");
        if (!file)
@@ -187,13 +173,11 @@ static void parse_source(struct sym_entry *syme)
 
                if (strlen(src->line)>8 && src->line[8] == ':') {
                        src->eip = strtoull(src->line, NULL, 16);
-                       if (section)
-                               src->eip += section->vma;
+                       src->eip += map->start;
                }
                if (strlen(src->line)>8 && src->line[16] == ':') {
                        src->eip = strtoull(src->line, NULL, 16);
-                       if (section)
-                               src->eip += section->vma;
+                       src->eip += map->start;
                }
        }
        pclose(file);
@@ -245,16 +229,9 @@ static void lookup_sym_source(struct sym_entry *syme)
        struct symbol *symbol = (struct symbol *)(syme + 1);
        struct source_line *line;
        char pattern[PATH_MAX];
-       char *idx;
 
        sprintf(pattern, "<%s>:", symbol->name);
 
-       if (symbol->module) {
-               idx = strstr(pattern, "\t");
-               if (idx)
-                       *idx = 0;
-       }
-
        pthread_mutex_lock(&syme->source_lock);
        for (line = syme->lines; line; line = line->next) {
                if (strstr(line->line, pattern)) {
@@ -516,8 +493,8 @@ static void print_sym_table(void)
                if (verbose)
                        printf(" - %016llx", sym->start);
                printf(" : %s", sym->name);
-               if (sym->module)
-                       printf("\t[%s]", sym->module->name);
+               if (syme->map->dso->name[0] == '[')
+                       printf(" \t%s", syme->map->dso->name);
                printf("\n");
        }
 }
@@ -788,7 +765,7 @@ static const char *skip_symbols[] = {
        NULL
 };
 
-static int symbol_filter(struct dso *self, struct symbol *sym)
+static int symbol_filter(struct map *map, struct symbol *sym)
 {
        struct sym_entry *syme;
        const char *name = sym->name;
@@ -810,7 +787,8 @@ static int symbol_filter(struct dso *self, struct symbol *sym)
            strstr(name, "_text_end"))
                return 1;
 
-       syme = dso__sym_priv(self, sym);
+       syme = dso__sym_priv(map->dso, sym);
+       syme->map = map;
        pthread_mutex_init(&syme->source_lock, NULL);
        if (!sym_filter_entry && sym_filter && !strcmp(name, sym_filter))
                sym_filter_entry = syme;
@@ -827,34 +805,14 @@ static int symbol_filter(struct dso *self, struct symbol *sym)
 
 static int parse_symbols(void)
 {
-       struct rb_node *node;
-       struct symbol  *sym;
-       int use_modules = vmlinux_name ? 1 : 0;
-
-       kernel_dso = dso__new("[kernel]", sizeof(struct sym_entry));
-       if (kernel_dso == NULL)
+       if (dsos__load_kernel(vmlinux_name, sizeof(struct sym_entry),
+                             symbol_filter, verbose, 1) <= 0)
                return -1;
 
-       if (dso__load_kernel(kernel_dso, vmlinux_name, symbol_filter, verbose, use_modules) <= 0)
-               goto out_delete_dso;
-
-       node = rb_first(&kernel_dso->syms);
-       sym = rb_entry(node, struct symbol, rb_node);
-       min_ip = sym->start;
-
-       node = rb_last(&kernel_dso->syms);
-       sym = rb_entry(node, struct symbol, rb_node);
-       max_ip = sym->end;
-
        if (dump_symtab)
-               dso__fprintf(kernel_dso, stderr);
+               dsos__fprintf(stderr);
 
        return 0;
-
-out_delete_dso:
-       dso__delete(kernel_dso);
-       kernel_dso = NULL;
-       return -1;
 }
 
 /*
@@ -862,10 +820,11 @@ out_delete_dso:
  */
 static void record_ip(u64 ip, int counter)
 {
-       struct symbol *sym = dso__find_symbol(kernel_dso, ip);
+       struct map *map;
+       struct symbol *sym = kernel_maps__find_symbol(ip, &map);
 
        if (sym != NULL) {
-               struct sym_entry *syme = dso__sym_priv(kernel_dso, sym);
+               struct sym_entry *syme = dso__sym_priv(map->dso, sym);
 
                if (!syme->skip) {
                        syme->count[counter]++;