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

perf/x86/intel: Expose LBR callstack to user space tooling

With LBR call stack feature enable, there are three callchain options.
Enable the 3rd callchain option (LBR callstack) to user space tooling.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: linux-api@vger.kernel.org
Link: http://lkml.kernel.org/r/20141105093759.GQ10501@worktop.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Peter Zijlstra and committed by
Ingo Molnar
2c44b193 aa54ae9b

+12 -20
-8
arch/x86/kernel/cpu/perf_event.h
··· 523 523 int lbr_stack_state; 524 524 }; 525 525 526 - enum { 527 - PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = PERF_SAMPLE_BRANCH_MAX_SHIFT, 528 - PERF_SAMPLE_BRANCH_SELECT_MAP_SIZE, 529 - 530 - PERF_SAMPLE_BRANCH_CALL_STACK = 531 - 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, 532 - }; 533 - 534 526 #define x86_add_quirk(func_) \ 535 527 do { \ 536 528 static struct x86_pmu_quirk __quirk __initdata = { \
+4 -4
arch/x86/kernel/cpu/perf_event_intel_lbr.c
··· 537 537 u64 mask = 0, v; 538 538 int i; 539 539 540 - for (i = 0; i < PERF_SAMPLE_BRANCH_SELECT_MAP_SIZE; i++) { 540 + for (i = 0; i < PERF_SAMPLE_BRANCH_MAX_SHIFT; i++) { 541 541 if (!(br_type & (1ULL << i))) 542 542 continue; 543 543 ··· 821 821 /* 822 822 * Map interface branch filters onto LBR filters 823 823 */ 824 - static const int nhm_lbr_sel_map[PERF_SAMPLE_BRANCH_SELECT_MAP_SIZE] = { 824 + static const int nhm_lbr_sel_map[PERF_SAMPLE_BRANCH_MAX_SHIFT] = { 825 825 [PERF_SAMPLE_BRANCH_ANY_SHIFT] = LBR_ANY, 826 826 [PERF_SAMPLE_BRANCH_USER_SHIFT] = LBR_USER, 827 827 [PERF_SAMPLE_BRANCH_KERNEL_SHIFT] = LBR_KERNEL, ··· 840 840 [PERF_SAMPLE_BRANCH_COND_SHIFT] = LBR_JCC, 841 841 }; 842 842 843 - static const int snb_lbr_sel_map[PERF_SAMPLE_BRANCH_SELECT_MAP_SIZE] = { 843 + static const int snb_lbr_sel_map[PERF_SAMPLE_BRANCH_MAX_SHIFT] = { 844 844 [PERF_SAMPLE_BRANCH_ANY_SHIFT] = LBR_ANY, 845 845 [PERF_SAMPLE_BRANCH_USER_SHIFT] = LBR_USER, 846 846 [PERF_SAMPLE_BRANCH_KERNEL_SHIFT] = LBR_KERNEL, ··· 852 852 [PERF_SAMPLE_BRANCH_COND_SHIFT] = LBR_JCC, 853 853 }; 854 854 855 - static const int hsw_lbr_sel_map[PERF_SAMPLE_BRANCH_SELECT_MAP_SIZE] = { 855 + static const int hsw_lbr_sel_map[PERF_SAMPLE_BRANCH_MAX_SHIFT] = { 856 856 [PERF_SAMPLE_BRANCH_ANY_SHIFT] = LBR_ANY, 857 857 [PERF_SAMPLE_BRANCH_USER_SHIFT] = LBR_USER, 858 858 [PERF_SAMPLE_BRANCH_KERNEL_SHIFT] = LBR_KERNEL,
+8 -8
include/uapi/linux/perf_event.h
··· 166 166 PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ 167 167 PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ 168 168 169 + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ 170 + 169 171 PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ 170 172 }; 171 173 ··· 177 175 PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, 178 176 179 177 PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, 180 - PERF_SAMPLE_BRANCH_ANY_CALL = 181 - 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, 182 - PERF_SAMPLE_BRANCH_ANY_RETURN = 183 - 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, 184 - PERF_SAMPLE_BRANCH_IND_CALL = 185 - 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, 186 - PERF_SAMPLE_BRANCH_ABORT_TX = 187 - 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, 178 + PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, 179 + PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, 180 + PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, 181 + PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, 188 182 PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, 189 183 PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, 190 184 PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, 185 + 186 + PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, 191 187 192 188 PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, 193 189 };