linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Sandipan Das <sandipan@linux.ibm.com>,
	Jiri Olsa <jolsa@redhat.com>,
	Maynard Johnson <maynard@us.ibm.com>,
	"Naveen N . Rao" <naveen.n.rao@linux.vnet.ibm.com>,
	Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>,
	Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL 4.14 35/67] perf powerpc: Fix callchain ip filtering when return address is in a register
Date: Fri, 7 Sep 2018 00:37:47 +0000	[thread overview]
Message-ID: <20180907003716.57737-35-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180907003716.57737-1-alexander.levin@microsoft.com>

From: Sandipan Das <sandipan@linux.ibm.com>

[ Upstream commit 9068533e4f470daf2b0f29c71d865990acd8826e ]

For powerpc64, perf will filter out the second entry in the callchain,
i.e. the LR value, if the return address of the function corresponding
to the probed location has already been saved on its caller's stack.

The state of the return address is determined using debug information.
At any point within a function, if the return address is already saved
somewhere, a DWARF expression can tell us about its location. If the
return address in still in LR only, no DWARF expression would exist.

Typically, the instructions in a function's prologue first copy the LR
value to R0 and then pushes R0 on to the stack. If LR has already been
copied to R0 but R0 is yet to be pushed to the stack, we can still get a
DWARF expression that says that the return address is in R0. This is
indicating that getting a DWARF expression for the return address does
not guarantee the fact that it has already been saved on the stack.

This can be observed on a powerpc64le system running Fedora 27 as shown
below.

  # objdump -d /usr/lib64/libc-2.26.so | less
  ...
  000000000015af20 <inet_pton>:
    15af20:       0b 00 4c 3c     addis   r2,r12,11
    15af24:       e0 c1 42 38     addi    r2,r2,-15904
    15af28:       a6 02 08 7c     mflr    r0
    15af2c:       f0 ff c1 fb     std     r30,-16(r1)
    15af30:       f8 ff e1 fb     std     r31,-8(r1)
    15af34:       78 1b 7f 7c     mr      r31,r3
    15af38:       78 23 83 7c     mr      r3,r4
    15af3c:       78 2b be 7c     mr      r30,r5
    15af40:       10 00 01 f8     std     r0,16(r1)
    15af44:       c1 ff 21 f8     stdu    r1,-64(r1)
    15af48:       28 00 81 f8     std     r4,40(r1)
  ...

  # readelf --debug-dump=frames-interp /usr/lib64/libc-2.26.so | less
  ...
  00027024 0000000000000024 00027028 FDE cie=00000000 pc=000000000015af20..000000000015af88
     LOC           CFA      r30   r31   ra
  000000000015af20 r1+0     u     u     u
  000000000015af34 r1+0     c-16  c-8   r0
  000000000015af48 r1+64    c-16  c-8   c+16
  000000000015af5c r1+0     c-16  c-8   c+16
  000000000015af78 r1+0     u     u
  ...

  # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x18
  # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1
  # perf script

Before:

  ping  2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
              7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
              7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
                 12f152d70 _init+0xbfc (/usr/bin/ping)
              7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
              7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
                         0 [unknown] ([unknown])

After:

  ping  2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
              7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
              7fff7e26fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
              7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
                 12f152d70 _init+0xbfc (/usr/bin/ping)
              7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
              7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
                         0 [unknown] ([unknown])

Reported-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Maynard Johnson <maynard@us.ibm.com>
Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/r/66e848a7bdf2d43b39210a705ff6d828a0865661.1530724939.git.sandipan@linux.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
 tools/perf/arch/powerpc/util/skip-callchain-idx.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tools/perf/arch/powerpc/util/skip-callchain-idx.c b/tools/perf/arch/powerpc/util/skip-callchain-idx.c
index bd630c222e65..9d1f6e976a5a 100644
--- a/tools/perf/arch/powerpc/util/skip-callchain-idx.c
+++ b/tools/perf/arch/powerpc/util/skip-callchain-idx.c
@@ -58,9 +58,13 @@ static int check_return_reg(int ra_regno, Dwarf_Frame *frame)
 	}
 
 	/*
-	 * Check if return address is on the stack.
+	 * Check if return address is on the stack. If return address
+	 * is in a register (typically R0), it is yet to be saved on
+	 * the stack.
 	 */
-	if (nops != 0 || ops != NULL)
+	if ((nops != 0 || ops != NULL) &&
+		!(nops == 1 && ops[0].atom == DW_OP_regx &&
+			ops[0].number2 == 0 && ops[0].offset == 0))
 		return 0;
 
 	/*
-- 
2.17.1

  parent reply	other threads:[~2018-09-07  0:39 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-07  0:37 [PATCH AUTOSEL 4.14 01/67] usb: dwc3: change stream event enable bit back to 13 Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 03/67] iommu/arm-smmu-v3: sync the OVACKFLG to PRIQ consumer register Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 02/67] usb: usbtest: use irqsave() in USB's complete callback Sasha Levin
2018-09-07  5:43   ` Greg Kroah-Hartman
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 04/67] iommu/arm-smmu: Error out only if not enough context interrupts Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 05/67] iommu/io-pgtable-arm-v7s: Abort allocation when table address overflows the PTE Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 06/67] ALSA: pcm: Add __force to cast in snd_pcm_lib_read/write() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 07/67] ALSA: msnd: Fix the default sample sizes Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 08/67] ALSA: usb-audio: Fix multiple definitions in AU0828_DEVICE() macro Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 09/67] xfrm: fix 'passing zero to ERR_PTR()' warning Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 11/67] gfs2: Special-case rindex for gfs2_grow Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 10/67] amd-xgbe: use dma_mapping_error to check map errors Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 12/67] clk: imx6ul: fix missing of_node_put() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 13/67] clk: core: Potentially free connection id Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 14/67] clk: clk-fixed-factor: Clear OF_POPULATED flag in case of failure Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 15/67] kbuild: add .DELETE_ON_ERROR special target Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 16/67] media: tw686x: Fix oops on buffer alloc failure Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 17/67] dmaengine: pl330: fix irq race with terminate_all Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 18/67] MIPS: ath79: fix system restart Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 19/67] media: videobuf2-core: check for q->error in vb2_core_qbuf() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 21/67] block: allow max_discard_segments to be stacked Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 20/67] IB/rxe: Drop QP0 silently Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 22/67] IB/ipoib: Fix error return code in ipoib_dev_init() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 24/67] media: ov5645: Supported external clock is 24MHz Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 23/67] mtd/maps: fix solutionengine.c printk format warnings Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 25/67] perf test: Fix subtest number when showing results Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 27/67] ARM: exynos: Define EINT_WAKEUP_MASK registers for S5Pv210 and Exynos5433 Sasha Levin
2018-09-07  6:33   ` Krzysztof Kozlowski
2018-09-12 17:44     ` Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 26/67] gfs2: Don't reject a supposedly full bitmap if we have blocks reserved Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 28/67] perf tools: Synthesize GROUP_DESC feature in pipe mode Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 29/67] iio: ad9523: Fix displayed phase Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 31/67] fbdev: omapfb: off by one in omapfb_register_client() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 30/67] iio: sca3000: Fix missing return in switch Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 32/67] perf tools: Fix struct comm_str removal crash Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 33/67] video: goldfishfb: fix memory leak on driver remove Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 34/67] fbdev/via: fix defined but not used warning Sasha Levin
2018-09-07  0:37 ` Sasha Levin [this message]
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 36/67] video: fbdev: pxafb: clear allocated memory for video modes Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 37/67] fbdev: Distinguish between interlaced and progressive modes Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 38/67] ARM: exynos: Clear global variable on init error path Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 39/67] perf powerpc: Fix callchain ip filtering Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 40/67] nvme-rdma: unquiesce queues when deleting the controller Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 42/67] powerpc/powernv: opal_put_chars partial write fix Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 41/67] KVM: arm/arm64: vgic: Fix possible spectre-v1 write in vgic_mmio_write_apr() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 43/67] staging: bcm2835-camera: fix timeout handling in wait_for_completion_timeout Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 44/67] staging: bcm2835-camera: handle wait_for_completion_timeout return properly Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 45/67] ASoC: rt5514: Fix the issue of the delay volume applied Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 46/67] MIPS: jz4740: Bump zload address Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 47/67] mac80211: restrict delayed tailroom needed decrement Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 48/67] Smack: Fix handling of IPv4 traffic received by PF_INET6 sockets Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 49/67] wan/fsl_ucc_hdlc: use IS_ERR_VALUE() to check return value of qe_muram_alloc Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 50/67] arm64: fix possible spectre-v1 write in ptrace_hbp_set_event() Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 51/67] reset: imx7: Fix always writing bits as 0 Sasha Levin
2018-09-07  0:37 ` [PATCH AUTOSEL 4.14 52/67] efi/arm: preserve early mapping of UEFI memory map longer for BGRT Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 54/67] xen-netfront: fix queue name setting Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 53/67] nfp: avoid buffer leak when FW communication fails Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 55/67] arm64: dts: qcom: db410c: Fix Bluetooth LED trigger Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 56/67] ARM: dts: qcom: msm8974-hammerhead: increase load on l20 for sdhci Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 57/67] s390/qeth: fix race in used-buffer accounting Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 59/67] platform/x86: toshiba_acpi: Fix defined but not used build warnings Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 58/67] s390/qeth: reset layer2 attribute on layer switch Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 60/67] KVM: arm/arm64: Fix vgic init race Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 62/67] i2c: aspeed: Fix initial values of master and slave state Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 61/67] drivers/base: stop new probing during shutdown Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 63/67] dmaengine: mv_xor_v2: kill the tasklets upon exit Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 64/67] crypto: sharah - Unregister correct algorithms for SAHARA 3 Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 65/67] x86/pti: Check the return value of pti_user_pagetable_walk_p4d() Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 66/67] x86/pti: Check the return value of pti_user_pagetable_walk_pmd() Sasha Levin
2018-09-07  0:38 ` [PATCH AUTOSEL 4.14 67/67] x86/mm/pti: Add an overflow check to pti_clone_pmds() Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180907003716.57737-35-alexander.levin@microsoft.com \
    --to=alexander.levin@microsoft.com \
    --cc=acme@redhat.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maynard@us.ibm.com \
    --cc=naveen.n.rao@linux.vnet.ibm.com \
    --cc=ravi.bangoria@linux.vnet.ibm.com \
    --cc=sandipan@linux.ibm.com \
    --cc=stable@vger.kernel.org \
    --cc=sukadev@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).