diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index dbb5f03670053dbc144b11d22624b513e85e6472..eb95b883fb44121f9953f731d1df9e5ffb22af91 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -460,14 +460,15 @@ int machine__process_lost_event(struct machine *machine __maybe_unused, return 0; } -static struct dso *machine__module_dso(struct machine *machine, const char *filename) +static struct dso* +machine__module_dso(struct machine *machine, struct kmod_path *m, + const char *filename) { struct dso *dso; - bool compressed; - dso = dsos__find(&machine->kernel_dsos, filename, false); + dso = dsos__find(&machine->kernel_dsos, m->name, true); if (!dso) { - dso = dsos__addnew(&machine->kernel_dsos, filename); + dso = dsos__addnew(&machine->kernel_dsos, m->name); if (dso == NULL) return NULL; @@ -477,8 +478,11 @@ static struct dso *machine__module_dso(struct machine *machine, const char *file dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; /* _KMODULE_COMP should be next to _KMODULE */ - if (is_kernel_module(filename, &compressed) && compressed) + 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; @@ -487,17 +491,25 @@ static struct dso *machine__module_dso(struct machine *machine, const char *file struct map *machine__new_module(struct machine *machine, u64 start, const char *filename) { - struct map *map; - struct dso *dso = machine__module_dso(machine, filename); + 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; + goto out; map_groups__insert(&machine->kmaps, map); + +out: + free(m.name); return map; } @@ -1058,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 +