diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-05-28 14:55:26 -0300 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-05-28 23:25:44 +0200 |
commit | 69ee69f63c82e63d9c6c6081d12673af4933c51e (patch) | |
tree | f96e4dd66b6d1261cccad46ac09e6f1180760c4b /Documentation/perf_counter/util/symbol.c | |
parent | a827c875f2ebe69c6e6db5e7f112d4beb4d80f01 (diff) | |
download | lwn-69ee69f63c82e63d9c6c6081d12673af4933c51e.tar.gz lwn-69ee69f63c82e63d9c6c6081d12673af4933c51e.zip |
perf_counter tools: Optionally pass a symbol filter to the dso load routines
Will be used by perf top.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20090528175526.GF4747@ghostprotocols.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'Documentation/perf_counter/util/symbol.c')
-rw-r--r-- | Documentation/perf_counter/util/symbol.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/Documentation/perf_counter/util/symbol.c b/Documentation/perf_counter/util/symbol.c index 504ac3132019..47281210443d 100644 --- a/Documentation/perf_counter/util/symbol.c +++ b/Documentation/perf_counter/util/symbol.c @@ -155,7 +155,7 @@ static int hex2long(char *ptr, unsigned long *long_val) return p - ptr; } -static int dso__load_kallsyms(struct dso *self) +static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter) { struct rb_node *nd, *prevnd; char *line = NULL; @@ -201,7 +201,10 @@ static int dso__load_kallsyms(struct dso *self) if (sym == NULL) goto out_delete_line; - dso__insert_symbol(self, sym); + if (filter && filter(self, sym)) + symbol__delete(sym, self->sym_priv_size); + else + dso__insert_symbol(self, sym); } /* @@ -286,7 +289,8 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, return sec; } -static int dso__load_sym(struct dso *self, int fd, const char *name) +static int dso__load_sym(struct dso *self, int fd, const char *name, + symbol_filter_t filter) { Elf_Data *symstrs; uint32_t nr_syms; @@ -352,9 +356,12 @@ static int dso__load_sym(struct dso *self, int fd, const char *name) if (!f) goto out_elf_end; - dso__insert_symbol(self, f); - - nr++; + if (filter && filter(self, f)) + symbol__delete(f, self->sym_priv_size); + else { + dso__insert_symbol(self, f); + nr++; + } } err = nr; @@ -364,7 +371,7 @@ out_close: return err; } -int dso__load(struct dso *self) +int dso__load(struct dso *self, symbol_filter_t filter) { int size = strlen(self->name) + sizeof("/usr/lib/debug%s.debug"); char *name = malloc(size); @@ -396,7 +403,7 @@ more: fd = open(name, O_RDONLY); } while (fd < 0); - ret = dso__load_sym(self, fd, name); + ret = dso__load_sym(self, fd, name, filter); close(fd); /* @@ -410,28 +417,29 @@ out: return ret; } -static int dso__load_vmlinux(struct dso *self, const char *vmlinux) +static int dso__load_vmlinux(struct dso *self, const char *vmlinux, + symbol_filter_t filter) { int err, fd = open(vmlinux, O_RDONLY); if (fd < 0) return -1; - err = dso__load_sym(self, fd, vmlinux); + err = dso__load_sym(self, fd, vmlinux, filter); close(fd); return err; } -int dso__load_kernel(struct dso *self, const char *vmlinux) +int dso__load_kernel(struct dso *self, const char *vmlinux, symbol_filter_t filter) { int err = -1; if (vmlinux) - err = dso__load_vmlinux(self, vmlinux); + err = dso__load_vmlinux(self, vmlinux, filter); if (err) - err = dso__load_kallsyms(self); + err = dso__load_kallsyms(self, filter); return err; } |