perf machine: Move kernel mmap name into struct machine
authorJiri Olsa <jolsa@kernel.org>
Thu, 15 Feb 2018 12:26:30 +0000 (13:26 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 16 Feb 2018 17:25:57 +0000 (14:25 -0300)
It simplifies and centralizes the code. The kernel mmap name is set for
machine type, which we know from the beginning, so there's no reason to
generate it every time we need it.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20180215122635.24029-5-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/build-id.c
tools/perf/util/event.c
tools/perf/util/machine.c
tools/perf/util/machine.h
tools/perf/util/symbol.c

index 7f8553630c4d9f37d252aa480eed903d25112f80..537eadd81914f6ae4c5cd64c9fd5f109fe532b50 100644 (file)
@@ -316,7 +316,6 @@ static int machine__write_buildid_table(struct machine *machine,
                                        struct feat_fd *fd)
 {
        int err = 0;
-       char nm[PATH_MAX];
        struct dso *pos;
        u16 kmisc = PERF_RECORD_MISC_KERNEL,
            umisc = PERF_RECORD_MISC_USER;
@@ -338,9 +337,8 @@ static int machine__write_buildid_table(struct machine *machine,
                        name = pos->short_name;
                        name_len = pos->short_name_len;
                } else if (dso__is_kcore(pos)) {
-                       machine__mmap_name(machine, nm, sizeof(nm));
-                       name = nm;
-                       name_len = strlen(nm);
+                       name = machine->mmap_name;
+                       name_len = strlen(name);
                } else {
                        name = pos->long_name;
                        name_len = pos->long_name_len;
@@ -813,12 +811,10 @@ static int dso__cache_build_id(struct dso *dso, struct machine *machine)
        bool is_kallsyms = dso__is_kallsyms(dso);
        bool is_vdso = dso__is_vdso(dso);
        const char *name = dso->long_name;
-       char nm[PATH_MAX];
 
        if (dso__is_kcore(dso)) {
                is_kallsyms = true;
-               machine__mmap_name(machine, nm, sizeof(nm));
-               name = nm;
+               name = machine->mmap_name;
        }
        return build_id_cache__add_b(dso->build_id, sizeof(dso->build_id), name,
                                     dso->nsinfo, is_kallsyms, is_vdso);
index 44e603c2794493366c75676b73b298723c94b70f..4644e751a3e32d7af5ccded3757b2a603b8a75c0 100644 (file)
@@ -894,8 +894,6 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
                                       struct machine *machine)
 {
        size_t size;
-       const char *mmap_name;
-       char name_buff[PATH_MAX];
        struct map *map = machine__kernel_map(machine);
        struct kmap *kmap;
        int err;
@@ -918,7 +916,6 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
                return -1;
        }
 
-       mmap_name = machine__mmap_name(machine, name_buff, sizeof(name_buff));
        if (machine__is_host(machine)) {
                /*
                 * kernel uses PERF_RECORD_MISC_USER for user space maps,
@@ -931,7 +928,7 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
 
        kmap = map__kmap(map);
        size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
-                       "%s%s", mmap_name, kmap->ref_reloc_sym->name) + 1;
+                       "%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
        size = PERF_ALIGN(size, sizeof(u64));
        event->mmap.header.type = PERF_RECORD_MMAP;
        event->mmap.header.size = (sizeof(event->mmap) -
index c976384f9022e270b6d9e084f3cc21fcfe9513a0..b1f1961b13f4f55a58bbfcc68a30fe4baa46f6ab 100644 (file)
@@ -48,6 +48,27 @@ static void machine__threads_init(struct machine *machine)
        }
 }
 
+static int machine__set_mmap_name(struct machine *machine)
+{
+       if (machine__is_host(machine)) {
+               if (symbol_conf.vmlinux_name)
+                       machine->mmap_name = strdup(symbol_conf.vmlinux_name);
+               else
+                       machine->mmap_name = strdup("[kernel.kallsyms]");
+       } else if (machine__is_default_guest(machine)) {
+               if (symbol_conf.default_guest_vmlinux_name)
+                       machine->mmap_name = strdup(symbol_conf.default_guest_vmlinux_name);
+               else
+                       machine->mmap_name = strdup("[guest.kernel.kallsyms]");
+       } else {
+               if (asprintf(&machine->mmap_name, "[guest.kernel.kallsyms.%d]",
+                        machine->pid) < 0)
+                       machine->mmap_name = NULL;
+       }
+
+       return machine->mmap_name ? 0 : -ENOMEM;
+}
+
 int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
 {
        int err = -ENOMEM;
@@ -75,6 +96,9 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
        if (machine->root_dir == NULL)
                return -ENOMEM;
 
+       if (machine__set_mmap_name(machine))
+               goto out;
+
        if (pid != HOST_KERNEL_ID) {
                struct thread *thread = machine__findnew_thread(machine, -1,
                                                                pid);
@@ -92,8 +116,10 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
        err = 0;
 
 out:
-       if (err)
+       if (err) {
                zfree(&machine->root_dir);
+               zfree(&machine->mmap_name);
+       }
        return 0;
 }
 
@@ -186,6 +212,7 @@ void machine__exit(struct machine *machine)
        dsos__exit(&machine->dsos);
        machine__exit_vdso(machine);
        zfree(&machine->root_dir);
+       zfree(&machine->mmap_name);
        zfree(&machine->current_tid);
 
        for (i = 0; i < THREADS__TABLE_SIZE; i++) {
@@ -328,20 +355,6 @@ void machines__process_guests(struct machines *machines,
        }
 }
 
-char *machine__mmap_name(struct machine *machine, char *bf, size_t size)
-{
-       if (machine__is_host(machine))
-               snprintf(bf, size, "[%s]", "kernel.kallsyms");
-       else if (machine__is_default_guest(machine))
-               snprintf(bf, size, "[%s]", "guest.kernel.kallsyms");
-       else {
-               snprintf(bf, size, "[%s.%d]", "guest.kernel.kallsyms",
-                        machine->pid);
-       }
-
-       return bf;
-}
-
 void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
 {
        struct rb_node *node;
@@ -777,25 +790,13 @@ size_t machine__fprintf(struct machine *machine, FILE *fp)
 
 static struct dso *machine__get_kernel(struct machine *machine)
 {
-       const char *vmlinux_name = NULL;
+       const char *vmlinux_name = machine->mmap_name;
        struct dso *kernel;
 
        if (machine__is_host(machine)) {
-               vmlinux_name = symbol_conf.vmlinux_name;
-               if (!vmlinux_name)
-                       vmlinux_name = DSO__NAME_KALLSYMS;
-
                kernel = machine__findnew_kernel(machine, vmlinux_name,
                                                 "[kernel]", DSO_TYPE_KERNEL);
        } else {
-               char bf[PATH_MAX];
-
-               if (machine__is_default_guest(machine))
-                       vmlinux_name = symbol_conf.default_guest_vmlinux_name;
-               if (!vmlinux_name)
-                       vmlinux_name = machine__mmap_name(machine, bf,
-                                                         sizeof(bf));
-
                kernel = machine__findnew_kernel(machine, vmlinux_name,
                                                 "[guest.kernel]",
                                                 DSO_TYPE_GUEST_KERNEL);
@@ -1295,7 +1296,6 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
                                              union perf_event *event)
 {
        struct map *map;
-       char kmmap_prefix[PATH_MAX];
        enum dso_kernel_type kernel_type;
        bool is_kernel_mmap;
 
@@ -1303,15 +1303,14 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
        if (machine__uses_kcore(machine))
                return 0;
 
-       machine__mmap_name(machine, kmmap_prefix, sizeof(kmmap_prefix));
        if (machine__is_host(machine))
                kernel_type = DSO_TYPE_KERNEL;
        else
                kernel_type = DSO_TYPE_GUEST_KERNEL;
 
        is_kernel_mmap = memcmp(event->mmap.filename,
-                               kmmap_prefix,
-                               strlen(kmmap_prefix) - 1) == 0;
+                               machine->mmap_name,
+                               strlen(machine->mmap_name) - 1) == 0;
        if (event->mmap.filename[0] == '/' ||
            (!is_kernel_mmap && event->mmap.filename[0] == '[')) {
                map = machine__findnew_module_map(machine, event->mmap.start,
@@ -1322,7 +1321,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
                map->end = map->start + event->mmap.len;
        } else if (is_kernel_mmap) {
                const char *symbol_name = (event->mmap.filename +
-                               strlen(kmmap_prefix));
+                               strlen(machine->mmap_name));
                /*
                 * Should be there already, from the build-id table in
                 * the header.
@@ -1363,7 +1362,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
                up_read(&machine->dsos.lock);
 
                if (kernel == NULL)
-                       kernel = machine__findnew_dso(machine, kmmap_prefix);
+                       kernel = machine__findnew_dso(machine, machine->mmap_name);
                if (kernel == NULL)
                        goto out_problem;
 
index 5ce860b64c74171ec47d61fe11ad18711f2c94b3..cb0a20f3a96bc6af80d2ce184cb36ffb4af41153 100644 (file)
@@ -43,6 +43,7 @@ struct machine {
        bool              comm_exec;
        bool              kptr_restrict_warned;
        char              *root_dir;
+       char              *mmap_name;
        struct threads    threads[THREADS__TABLE_SIZE];
        struct vdso_info  *vdso_info;
        struct perf_env   *env;
@@ -142,8 +143,6 @@ struct machine *machines__find(struct machines *machines, pid_t pid);
 struct machine *machines__findnew(struct machines *machines, pid_t pid);
 
 void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size);
-char *machine__mmap_name(struct machine *machine, char *bf, size_t size);
-
 void machines__set_comm_exec(struct machines *machines, bool comm_exec);
 
 struct machine *machine__new_host(void);
index e366e3060e6b96924b4f87e78f9dbcc3f1c1d313..a1a312d99f30d149eb237c41d2065ae8c272d388 100644 (file)
@@ -1958,8 +1958,7 @@ static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
                pr_debug("Using %s for symbols\n", kallsyms_filename);
        if (err > 0 && !dso__is_kcore(dso)) {
                dso->binary_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
-               machine__mmap_name(machine, path, sizeof(path));
-               dso__set_long_name(dso, strdup(path), true);
+               dso__set_long_name(dso, machine->mmap_name, false);
                map__fixup_start(map);
                map__fixup_end(map);
        }