diff options
Diffstat (limited to 'tools/perf/builtin-top.c')
| -rw-r--r-- | tools/perf/builtin-top.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 57e232f13bc1..c968bd3391e0 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -169,7 +169,7 @@ static void sig_winch_handler(int sig __used) | |||
| 169 | update_print_entries(&winsize); | 169 | update_print_entries(&winsize); |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | static void parse_source(struct sym_entry *syme) | 172 | static int parse_source(struct sym_entry *syme) |
| 173 | { | 173 | { |
| 174 | struct symbol *sym; | 174 | struct symbol *sym; |
| 175 | struct sym_entry_source *source; | 175 | struct sym_entry_source *source; |
| @@ -180,12 +180,21 @@ static void parse_source(struct sym_entry *syme) | |||
| 180 | u64 len; | 180 | u64 len; |
| 181 | 181 | ||
| 182 | if (!syme) | 182 | if (!syme) |
| 183 | return; | 183 | return -1; |
| 184 | |||
| 185 | sym = sym_entry__symbol(syme); | ||
| 186 | map = syme->map; | ||
| 187 | |||
| 188 | /* | ||
| 189 | * We can't annotate with just /proc/kallsyms | ||
| 190 | */ | ||
| 191 | if (map->dso->origin == DSO__ORIG_KERNEL) | ||
| 192 | return -1; | ||
| 184 | 193 | ||
| 185 | if (syme->src == NULL) { | 194 | if (syme->src == NULL) { |
| 186 | syme->src = zalloc(sizeof(*source)); | 195 | syme->src = zalloc(sizeof(*source)); |
| 187 | if (syme->src == NULL) | 196 | if (syme->src == NULL) |
| 188 | return; | 197 | return -1; |
| 189 | pthread_mutex_init(&syme->src->lock, NULL); | 198 | pthread_mutex_init(&syme->src->lock, NULL); |
| 190 | } | 199 | } |
| 191 | 200 | ||
| @@ -195,9 +204,6 @@ static void parse_source(struct sym_entry *syme) | |||
| 195 | pthread_mutex_lock(&source->lock); | 204 | pthread_mutex_lock(&source->lock); |
| 196 | goto out_assign; | 205 | goto out_assign; |
| 197 | } | 206 | } |
| 198 | |||
| 199 | sym = sym_entry__symbol(syme); | ||
| 200 | map = syme->map; | ||
| 201 | path = map->dso->long_name; | 207 | path = map->dso->long_name; |
| 202 | 208 | ||
| 203 | len = sym->end - sym->start; | 209 | len = sym->end - sym->start; |
| @@ -209,7 +215,7 @@ static void parse_source(struct sym_entry *syme) | |||
| 209 | 215 | ||
| 210 | file = popen(command, "r"); | 216 | file = popen(command, "r"); |
| 211 | if (!file) | 217 | if (!file) |
| 212 | return; | 218 | return -1; |
| 213 | 219 | ||
| 214 | pthread_mutex_lock(&source->lock); | 220 | pthread_mutex_lock(&source->lock); |
| 215 | source->lines_tail = &source->lines; | 221 | source->lines_tail = &source->lines; |
| @@ -245,6 +251,7 @@ static void parse_source(struct sym_entry *syme) | |||
| 245 | out_assign: | 251 | out_assign: |
| 246 | sym_filter_entry = syme; | 252 | sym_filter_entry = syme; |
| 247 | pthread_mutex_unlock(&source->lock); | 253 | pthread_mutex_unlock(&source->lock); |
| 254 | return 0; | ||
| 248 | } | 255 | } |
| 249 | 256 | ||
| 250 | static void __zero_source_counters(struct sym_entry *syme) | 257 | static void __zero_source_counters(struct sym_entry *syme) |
| @@ -991,7 +998,17 @@ static void event__process_sample(const event_t *self, | |||
| 991 | if (sym_filter_entry_sched) { | 998 | if (sym_filter_entry_sched) { |
| 992 | sym_filter_entry = sym_filter_entry_sched; | 999 | sym_filter_entry = sym_filter_entry_sched; |
| 993 | sym_filter_entry_sched = NULL; | 1000 | sym_filter_entry_sched = NULL; |
| 994 | parse_source(sym_filter_entry); | 1001 | if (parse_source(sym_filter_entry) < 0) { |
| 1002 | struct symbol *sym = sym_entry__symbol(sym_filter_entry); | ||
| 1003 | |||
| 1004 | pr_err("Can't annotate %s", sym->name); | ||
| 1005 | if (sym_filter_entry->map->dso->origin == DSO__ORIG_KERNEL) { | ||
| 1006 | pr_err(": No vmlinux file was found in the path:\n"); | ||
| 1007 | vmlinux_path__fprintf(stderr); | ||
| 1008 | } else | ||
| 1009 | pr_err(".\n"); | ||
| 1010 | exit(1); | ||
| 1011 | } | ||
| 995 | } | 1012 | } |
| 996 | 1013 | ||
| 997 | syme = symbol__priv(al.sym); | 1014 | syme = symbol__priv(al.sym); |
