Merge tag 'perf-core-for-mingo-20160607' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / tools / perf / util / machine.c
index f9644f7..a0c186a 100644 (file)
@@ -43,6 +43,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
 
        machine->symbol_filter = NULL;
        machine->id_hdr_size = 0;
+       machine->kptr_restrict_warned = false;
        machine->comm_exec = false;
        machine->kernel_start = 0;
 
@@ -709,7 +710,7 @@ static struct dso *machine__get_kernel(struct machine *machine)
        if (machine__is_host(machine)) {
                vmlinux_name = symbol_conf.vmlinux_name;
                if (!vmlinux_name)
-                       vmlinux_name = "[kernel.kallsyms]";
+                       vmlinux_name = DSO__NAME_KALLSYMS;
 
                kernel = machine__findnew_kernel(machine, vmlinux_name,
                                                 "[kernel]", DSO_TYPE_KERNEL);
@@ -1135,10 +1136,10 @@ int machine__create_kernel_maps(struct machine *machine)
 {
        struct dso *kernel = machine__get_kernel(machine);
        const char *name;
-       u64 addr = machine__get_running_kernel_start(machine, &name);
+       u64 addr;
        int ret;
 
-       if (!addr || kernel == NULL)
+       if (kernel == NULL)
                return -1;
 
        ret = __machine__create_kernel_maps(machine, kernel);
@@ -1160,8 +1161,9 @@ int machine__create_kernel_maps(struct machine *machine)
         */
        map_groups__fixup_end(&machine->kmaps);
 
-       if (maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name,
-                                            addr)) {
+       addr = machine__get_running_kernel_start(machine, &name);
+       if (!addr) {
+       } else if (maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name, addr)) {
                machine__destroy_kernel_maps(machine);
                return -1;
        }
@@ -1351,11 +1353,16 @@ int machine__process_mmap2_event(struct machine *machine,
        if (map == NULL)
                goto out_problem_map;
 
-       thread__insert_map(thread, map);
+       ret = thread__insert_map(thread, map);
+       if (ret)
+               goto out_problem_insert;
+
        thread__put(thread);
        map__put(map);
        return 0;
 
+out_problem_insert:
+       map__put(map);
 out_problem_map:
        thread__put(thread);
 out_problem:
@@ -1401,11 +1408,16 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event
        if (map == NULL)
                goto out_problem_map;
 
-       thread__insert_map(thread, map);
+       ret = thread__insert_map(thread, map);
+       if (ret)
+               goto out_problem_insert;
+
        thread__put(thread);
        map__put(map);
        return 0;
 
+out_problem_insert:
+       map__put(map);
 out_problem_map:
        thread__put(thread);
 out_problem:
@@ -1769,11 +1781,6 @@ static int resolve_lbr_callchain_sample(struct thread *thread,
                 */
                int mix_chain_nr = i + 1 + lbr_nr + 1;
 
-               if (mix_chain_nr > (int)sysctl_perf_event_max_stack + PERF_MAX_BRANCH_DEPTH) {
-                       pr_warning("corrupted callchain. skipping...\n");
-                       return 0;
-               }
-
                for (j = 0; j < mix_chain_nr; j++) {
                        if (callchain_param.order == ORDER_CALLEE) {
                                if (j < i + 1)
@@ -1811,9 +1818,9 @@ static int thread__resolve_callchain_sample(struct thread *thread,
 {
        struct branch_stack *branch = sample->branch_stack;
        struct ip_callchain *chain = sample->callchain;
-       int chain_nr = min(max_stack, (int)chain->nr);
+       int chain_nr = chain->nr;
        u8 cpumode = PERF_RECORD_MISC_USER;
-       int i, j, err;
+       int i, j, err, nr_entries;
        int skip_idx = -1;
        int first_call = 0;
 
@@ -1828,8 +1835,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,
         * Based on DWARF debug information, some architectures skip
         * a callchain entry saved by the kernel.
         */
-       if (chain->nr < sysctl_perf_event_max_stack)
-               skip_idx = arch_skip_callchain_idx(thread, chain);
+       skip_idx = arch_skip_callchain_idx(thread, chain);
 
        /*
         * Add branches to call stack for easier browsing. This gives
@@ -1889,12 +1895,8 @@ static int thread__resolve_callchain_sample(struct thread *thread,
        }
 
 check_calls:
-       if (chain->nr > sysctl_perf_event_max_stack && (int)chain->nr > max_stack) {
-               pr_warning("corrupted callchain. skipping...\n");
-               return 0;
-       }
-
-       for (i = first_call; i < chain_nr; i++) {
+       for (i = first_call, nr_entries = 0;
+            i < chain_nr && nr_entries < max_stack; i++) {
                u64 ip;
 
                if (callchain_param.order == ORDER_CALLEE)
@@ -1908,6 +1910,9 @@ check_calls:
 #endif
                ip = chain->ips[j];
 
+               if (ip < PERF_CONTEXT_MAX)
+                       ++nr_entries;
+
                err = add_callchain_ip(thread, cursor, parent, root_al, &cpumode, ip);
 
                if (err)