diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-03-22 10:56:19 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-22 10:56:19 +0100 |
commit | 963a70b8a2d65538f7d58b2b84a2ae10a3ecb6ea (patch) | |
tree | 3c104859a1a4c5de6a30aee4e483ee2d0dfaf8c3 /tools/perf/util/machine.c | |
parent | 08b3f913900075a19564ab68967028ab99c95820 (diff) | |
parent | ca33380adf74afb985bf7aab09ec46707a5d2d57 (diff) | |
download | op-kernel-dev-963a70b8a2d65538f7d58b2b84a2ae10a3ecb6ea.zip op-kernel-dev-963a70b8a2d65538f7d58b2b84a2ae10a3ecb6ea.tar.gz |
Merge tag 'perf-core-for-mingo-2' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
- Handle legacy syscalls tracepoints (David Ahern, Arnaldo Carvalho de Melo)
- Indicate which callchain entries are annotated in the
TUI hists browser (report/top) (Arnaldo Carvalho de Melo)
- Fix failure to add multiple probes without debuginfo (He Kuang)
- Fix 'trace' summary_only option (David Ahern)
- Fix race in build_id_cache__add_s() in 'buildid-cache' (Milos Vyletel)
- Don't allow empty argument for field-separator, fixing segfault (Wang Nan)
Infrastructure:
- Add destructor for format_field in libtraceevent (David Ahern)
- Prep work for support lzma compressed kernel modules (Jiri Olsa)
- Update .gitignore with recently added/renamed feature detection files (Yunlong Song)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/machine.c')
-rw-r--r-- | tools/perf/util/machine.c | 83 |
1 files changed, 40 insertions, 43 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 24f8c97..eb95b88 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -460,30 +460,56 @@ int machine__process_lost_event(struct machine *machine __maybe_unused, return 0; } +static struct dso* +machine__module_dso(struct machine *machine, struct kmod_path *m, + const char *filename) +{ + struct dso *dso; + + dso = dsos__find(&machine->kernel_dsos, m->name, true); + if (!dso) { + dso = dsos__addnew(&machine->kernel_dsos, m->name); + if (dso == NULL) + return NULL; + + if (machine__is_host(machine)) + dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; + else + dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; + + /* _KMODULE_COMP should be next to _KMODULE */ + if (m->kmod && m->comp) + dso->symtab_type++; + + dso__set_short_name(dso, strdup(m->name), true); + dso__set_long_name(dso, strdup(filename), true); + } + + return dso; +} + struct map *machine__new_module(struct machine *machine, u64 start, const char *filename) { - struct map *map; - struct dso *dso = __dsos__findnew(&machine->kernel_dsos, filename); - bool compressed; + struct map *map = NULL; + struct dso *dso; + struct kmod_path m; - if (dso == NULL) + if (kmod_path__parse_name(&m, filename)) return NULL; + dso = machine__module_dso(machine, &m, filename); + if (dso == NULL) + goto out; + map = map__new2(start, dso, MAP__FUNCTION); if (map == NULL) - return NULL; - - if (machine__is_host(machine)) - dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; - else - dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; - - /* _KMODULE_COMP should be next to _KMODULE */ - if (is_kernel_module(filename, &compressed) && compressed) - dso->symtab_type++; + goto out; map_groups__insert(&machine->kmaps, map); + +out: + free(m.name); return map; } @@ -1044,40 +1070,11 @@ static int machine__process_kernel_mmap_event(struct machine *machine, strlen(kmmap_prefix) - 1) == 0; if (event->mmap.filename[0] == '/' || (!is_kernel_mmap && event->mmap.filename[0] == '[')) { - - char short_module_name[1024]; - char *name, *dot; - - if (event->mmap.filename[0] == '/') { - name = strrchr(event->mmap.filename, '/'); - if (name == NULL) - goto out_problem; - - ++name; /* skip / */ - dot = strrchr(name, '.'); - if (dot == NULL) - goto out_problem; - /* On some system, modules are compressed like .ko.gz */ - if (is_supported_compression(dot + 1)) - dot -= 3; - if (!is_kmodule_extension(dot + 1)) - goto out_problem; - snprintf(short_module_name, sizeof(short_module_name), - "[%.*s]", (int)(dot - name), name); - strxfrchar(short_module_name, '-', '_'); - } else - strcpy(short_module_name, event->mmap.filename); - map = machine__new_module(machine, event->mmap.start, event->mmap.filename); if (map == NULL) goto out_problem; - name = strdup(short_module_name); - if (name == NULL) - goto out_problem; - - dso__set_short_name(map->dso, name, true); map->end = map->start + event->mmap.len; } else if (is_kernel_mmap) { const char *symbol_name = (event->mmap.filename + |