]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.14.213/powerpc-perf-exclude-kernel-samples-while-counting-events-in-user-space.patch
Drop nfc patches from older trees
[thirdparty/kernel/stable-queue.git] / releases / 4.14.213 / powerpc-perf-exclude-kernel-samples-while-counting-events-in-user-space.patch
1 From aa8e21c053d72b6639ea5a7f1d3a1d0209534c94 Mon Sep 17 00:00:00 2001
2 From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
3 Date: Wed, 25 Nov 2020 02:26:55 -0500
4 Subject: powerpc/perf: Exclude kernel samples while counting events in user space.
5
6 From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
7
8 commit aa8e21c053d72b6639ea5a7f1d3a1d0209534c94 upstream.
9
10 Perf event attritube supports exclude_kernel flag to avoid
11 sampling/profiling in supervisor state (kernel). Based on this event
12 attr flag, Monitor Mode Control Register bit is set to freeze on
13 supervisor state. But sometimes (due to hardware limitation), Sampled
14 Instruction Address Register (SIAR) locks on to kernel address even
15 when freeze on supervisor is set. Patch here adds a check to drop
16 those samples.
17
18 Cc: stable@vger.kernel.org
19 Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
20 Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
21 Link: https://lore.kernel.org/r/1606289215-1433-1-git-send-email-atrajeev@linux.vnet.ibm.com
22 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23
24 ---
25 arch/powerpc/perf/core-book3s.c | 10 ++++++++++
26 1 file changed, 10 insertions(+)
27
28 --- a/arch/powerpc/perf/core-book3s.c
29 +++ b/arch/powerpc/perf/core-book3s.c
30 @@ -2068,6 +2068,16 @@ static void record_and_restart(struct pe
31 perf_event_update_userpage(event);
32
33 /*
34 + * Due to hardware limitation, sometimes SIAR could sample a kernel
35 + * address even when freeze on supervisor state (kernel) is set in
36 + * MMCR2. Check attr.exclude_kernel and address to drop the sample in
37 + * these cases.
38 + */
39 + if (event->attr.exclude_kernel && record)
40 + if (is_kernel_addr(mfspr(SPRN_SIAR)))
41 + record = 0;
42 +
43 + /*
44 * Finally record data if requested.
45 */
46 if (record) {