From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753238AbcD0QUe (ORCPT ); Wed, 27 Apr 2016 12:20:34 -0400 Received: from e28smtp08.in.ibm.com ([125.16.236.8]:34233 "EHLO e28smtp08.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752520AbcD0QUc (ORCPT ); Wed, 27 Apr 2016 12:20:32 -0400 X-IBM-Helo: d28relay08.in.ibm.com X-IBM-MailFrom: naveen.n.rao@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org Date: Wed, 27 Apr 2016 21:50:14 +0530 From: "Naveen N. Rao" To: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, Arnaldo Carvalho de Melo Cc: Mark Wielaard , Thiago Jung Bauermann , Masami Hiramatsu , Michael Ellerman , Balbir Singh , Ananth N Mavinakayanahalli Subject: Re: [PATCH v2 0/2] perf probe fixes for ppc64le Message-ID: <20160427162014.GD15073@naverao1-tp.in.ibm.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-TM-AS-MML: disable x-cbid: 16042716-0029-0000-0000-00000D1395ED Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/04/12 02:40PM, Naveen N Rao wrote: > This patchset fixes three issues found with perf probe on ppc64le: > 1. 'perf test kallsyms' failure on ppc64le (reported by Michael > Ellerman). This was due to the symbols being fixed up during symbol > table load. This is fixed in patch 2 by delaying symbol fixup until > later. > 2. perf probe function offset was being calculated from the local entry > point (LEP), which does not match user expectation when trying to look > at function disassembly output (reported by Ananth N). This is fixed for > kallsyms in patch 1 and for symbol table in patch 2. > 3. perf probe failure with kretprobe when using kallsyms. This was > failing as we were specifying an offset. This is fixed in patch 1. > > A few examples demonstrating the issues and the fix: > > Example for issue (2): > -------------------- > # objdump -d vmlinux | grep -A8 \<_do_fork\>: > c0000000000b6a00 <_do_fork>: > c0000000000b6a00: f7 00 4c 3c addis r2,r12,247 > c0000000000b6a04: 00 86 42 38 addi r2,r2,-31232 > c0000000000b6a08: a6 02 08 7c mflr r0 > c0000000000b6a0c: d0 ff 41 fb std r26,-48(r1) > c0000000000b6a10: 26 80 90 7d mfocrf r12,8 > c0000000000b6a14: d8 ff 61 fb std r27,-40(r1) > c0000000000b6a18: e0 ff 81 fb std r28,-32(r1) > c0000000000b6a1c: e8 ff a1 fb std r29,-24(r1) > # perf probe -v _do_fork+4 > probe-definition(0): _do_fork+4 > symbol:_do_fork file:(null) line:0 offset:4 return:0 lazy:(null) > 0 arguments > Looking at the vmlinux_path (8 entries long) > Using /proc/kcore for kernel object code > Using /proc/kallsyms for symbols > Opening /sys/kernel/debug/tracing//kprobe_events write=1 > Writing event: p:probe/_do_fork _text+748044 > Added new event: > probe:_do_fork (on _do_fork+4) > > You can now use it in all perf tools, such as: > > perf record -e probe:_do_fork -aR sleep 1 > > # printf "%x\n" 748044 > b6a0c > ^^^^^ > This is offset from the LEP. With this, there is also no way to ever > probe between the GEP and the LEP. > > With this patchset: > # perf probe -v _do_fork+4 > probe-definition(0): _do_fork+4 > symbol:_do_fork file:(null) line:0 offset:4 return:0 lazy:(null) > 0 arguments > Looking at the vmlinux_path (8 entries long) > Using /proc/kcore for kernel object code > Using /proc/kallsyms for symbols > Opening /sys/kernel/debug/tracing//kprobe_events write=1 > Writing event: p:probe/_do_fork _text+748036 > Added new event: > probe:_do_fork (on _do_fork+4) > > You can now use it in all perf tools, such as: > > perf record -e probe:_do_fork -aR sleep 1 > > # perf probe -v _do_fork > probe-definition(0): _do_fork > symbol:_do_fork file:(null) line:0 offset:0 return:0 lazy:(null) > 0 arguments > Looking at the vmlinux_path (8 entries long) > Using /proc/kcore for kernel object code > Using /proc/kallsyms for symbols > Opening /sys/kernel/debug/tracing//kprobe_events write=1 > Writing event: p:probe/_do_fork _text+748040 > Added new event: > probe:_do_fork (on _do_fork) > > You can now use it in all perf tools, such as: > > perf record -e probe:_do_fork -aR sleep 1 > > We only offset to the LEP if function entry is specified, otherwise, we > offset from the GEP. > > Example for issue (3): > --------------------- > Before patch: > # perf probe -v _do_fork:%return > probe-definition(0): _do_fork:%return > symbol:_do_fork file:(null) line:0 offset:0 return:1 lazy:(null) > 0 arguments > Looking at the vmlinux_path (8 entries long) > Using /proc/kcore for kernel object code > Using /proc/kallsyms for symbols > Opening /sys/kernel/debug/tracing//kprobe_events write=1 > Writing event: r:probe/_do_fork _do_fork+8 > Failed to write event: Invalid argument > Error: Failed to add events. Reason: Invalid argument (Code: -22) > > After patch: > # perf probe _do_fork:%return > Added new event: > probe:_do_fork (on _do_fork%return) > > You can now use it in all perf tools, such as: > > perf record -e probe:_do_fork -aR sleep 1 > > > Concept Acked-by: Michael Ellerman > > Cc: Mark Wielaard > Cc: Thiago Jung Bauermann > Cc: Arnaldo Carvalho de Melo > Cc: Masami Hiramatsu > Cc: Michael Ellerman > Cc: Balbir Singh > Cc: Ananth N Mavinakayanahalli Arnaldo, Can you please pick this up if you're ok with the changes? - Naveen > > Naveen N. Rao (2): > perf tools: Fix kprobe and kretprobe handling with kallsyms on ppc64le > perf tools: Fix kallsyms perf test on ppc64le > > tools/perf/arch/powerpc/util/sym-handling.c | 43 +++++++++++++++++++++-------- > tools/perf/util/probe-event.c | 5 ++-- > tools/perf/util/probe-event.h | 3 +- > tools/perf/util/symbol-elf.c | 7 +++-- > tools/perf/util/symbol.h | 3 +- > 5 files changed, 43 insertions(+), 18 deletions(-) > > -- > 2.7.4 >