perf symbols: Do lazy symtab loading for the kernel & modules too
Just like we do with the other DSOs. This also simplifies the kernel_maps setup process, now all that the tools need to do is to call kernel_maps__init and the maps for the modules and kernel will be created, then, later, when kernel_maps__find_symbol() is used, it will also call maps__find_symbol that already checks if the symtab was loaded, loading it if needed. Now if one does 'perf top --hide_kernel_symbols' we won't pay the price of loading the (many) symbols in /proc/kallsyms or vmlinux. 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: <1258757489-5978-4-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
此提交包含在:
@@ -830,6 +830,8 @@ static void handle_keypress(int c)
|
||||
case 'q':
|
||||
case 'Q':
|
||||
printf("exiting.\n");
|
||||
if (dump_symtab)
|
||||
dsos__fprintf(stderr);
|
||||
exit(0);
|
||||
case 's':
|
||||
prompt_symbol(&sym_filter_entry, "Enter details symbol");
|
||||
@@ -946,30 +948,6 @@ static int symbol_filter(struct map *map, struct symbol *sym)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_symbols(void)
|
||||
{
|
||||
struct dso *kernel = dsos__load_kernel();
|
||||
|
||||
if (kernel == NULL)
|
||||
return -1;
|
||||
|
||||
if (dsos__load_modules() < 0)
|
||||
pr_debug("Couldn't read the complete list of modules, "
|
||||
"continuing...\n");
|
||||
|
||||
if (dsos__load_modules_sym(symbol_filter) < 0)
|
||||
pr_warning("Failed to read module symbols, continuing...\n");
|
||||
|
||||
if (dso__load_kernel_sym(kernel, symbol_filter, 1) <= 0)
|
||||
pr_debug("Couldn't read the complete list of kernel symbols, "
|
||||
"continuing...\n");
|
||||
|
||||
if (dump_symtab)
|
||||
dsos__fprintf(stderr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void event__process_sample(const event_t *self, int counter)
|
||||
{
|
||||
u64 ip = self->ip.ip;
|
||||
@@ -1012,7 +990,7 @@ static void event__process_sample(const event_t *self, int counter)
|
||||
if (hide_kernel_symbols)
|
||||
return;
|
||||
|
||||
sym = kernel_maps__find_symbol(ip, &map);
|
||||
sym = kernel_maps__find_symbol(ip, &map, symbol_filter);
|
||||
if (sym == NULL)
|
||||
return;
|
||||
break;
|
||||
@@ -1339,7 +1317,7 @@ static const struct option options[] = {
|
||||
|
||||
int cmd_top(int argc, const char **argv, const char *prefix __used)
|
||||
{
|
||||
int counter;
|
||||
int counter, err;
|
||||
|
||||
page_size = sysconf(_SC_PAGE_SIZE);
|
||||
|
||||
@@ -1363,10 +1341,11 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
|
||||
if (delay_secs < 1)
|
||||
delay_secs = 1;
|
||||
|
||||
parse_symbols();
|
||||
err = kernel_maps__init(true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
parse_source(sym_filter_entry);
|
||||
|
||||
|
||||
/*
|
||||
* User specified count overrides default frequency.
|
||||
*/
|
||||
|
新增問題並參考
封鎖使用者