Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf callchain: Stop validating callchains by the max_stack sysctl

As thread__resolve_callchain_sample can be used for handling perf.data
files, that could've been recorded with a large max_stack sysctl setting
than what the system used for analysis has set.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Milian Wolff <milian.wolff@kdab.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Zefan Li <lizefan@huawei.com>
Link: http://lkml.kernel.org/n/tip-2995bt2g5yq2m05vga4kip6m@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+5 -20
+5 -20
tools/perf/util/machine.c
··· 1771 1771 */ 1772 1772 int mix_chain_nr = i + 1 + lbr_nr + 1; 1773 1773 1774 - if (mix_chain_nr > (int)sysctl_perf_event_max_stack + PERF_MAX_BRANCH_DEPTH) { 1775 - pr_warning("corrupted callchain. skipping...\n"); 1776 - return 0; 1777 - } 1778 - 1779 1774 for (j = 0; j < mix_chain_nr; j++) { 1780 1775 if (callchain_param.order == ORDER_CALLEE) { 1781 1776 if (j < i + 1) ··· 1810 1815 struct ip_callchain *chain = sample->callchain; 1811 1816 int chain_nr = chain->nr; 1812 1817 u8 cpumode = PERF_RECORD_MISC_USER; 1813 - int i, j, err, nr_entries, nr_contexts; 1818 + int i, j, err, nr_entries; 1814 1819 int skip_idx = -1; 1815 1820 int first_call = 0; 1816 1821 ··· 1825 1830 * Based on DWARF debug information, some architectures skip 1826 1831 * a callchain entry saved by the kernel. 1827 1832 */ 1828 - if (chain_nr < sysctl_perf_event_max_stack) 1829 - skip_idx = arch_skip_callchain_idx(thread, chain); 1833 + skip_idx = arch_skip_callchain_idx(thread, chain); 1830 1834 1831 1835 /* 1832 1836 * Add branches to call stack for easier browsing. This gives ··· 1885 1891 } 1886 1892 1887 1893 check_calls: 1888 - for (i = first_call, nr_entries = 0, nr_contexts = 0; 1894 + for (i = first_call, nr_entries = 0; 1889 1895 i < chain_nr && nr_entries < max_stack; i++) { 1890 1896 u64 ip; 1891 1897 ··· 1900 1906 #endif 1901 1907 ip = chain->ips[j]; 1902 1908 1903 - if (ip >= PERF_CONTEXT_MAX) { 1904 - if (++nr_contexts > sysctl_perf_event_max_contexts_per_stack) 1905 - goto out_corrupted_callchain; 1906 - } else { 1907 - if (++nr_entries > sysctl_perf_event_max_stack) 1908 - goto out_corrupted_callchain; 1909 - } 1909 + if (ip < PERF_CONTEXT_MAX) 1910 + ++nr_entries; 1910 1911 1911 1912 err = add_callchain_ip(thread, cursor, parent, root_al, &cpumode, ip); 1912 1913 ··· 1909 1920 return (err < 0) ? err : 0; 1910 1921 } 1911 1922 1912 - return 0; 1913 - 1914 - out_corrupted_callchain: 1915 - pr_warning("corrupted callchain. skipping...\n"); 1916 1923 return 0; 1917 1924 } 1918 1925