From patchwork Mon Dec 15 14:50:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Naveen N. Rao" X-Patchwork-Id: 421429 X-Patchwork-Delegate: michael@ellerman.id.au Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A460B1400E7 for ; Tue, 16 Dec 2014 01:57:47 +1100 (AEDT) Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by lists.ozlabs.org (Postfix) with ESMTP id 3799E1A136D for ; Tue, 16 Dec 2014 01:57:47 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from e23smtp08.au.ibm.com (e23smtp08.au.ibm.com [202.81.31.141]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 70B6B1A01DE for ; Tue, 16 Dec 2014 01:51:14 +1100 (AEDT) Received: from /spool/local by e23smtp08.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 16 Dec 2014 00:51:13 +1000 Received: from d23dlp03.au.ibm.com (202.81.31.214) by e23smtp08.au.ibm.com (202.81.31.205) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 16 Dec 2014 00:51:12 +1000 Received: from d23relay08.au.ibm.com (d23relay08.au.ibm.com [9.185.71.33]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id AEEB43578060 for ; Tue, 16 Dec 2014 01:51:11 +1100 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay08.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id sBFEpBlS35193076 for ; Tue, 16 Dec 2014 01:51:11 +1100 Received: from d23av04.au.ibm.com (localhost [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id sBFEpA1q004758 for ; Tue, 16 Dec 2014 01:51:11 +1100 Received: from naverao1-tp.in.ibm.com ([9.79.206.194]) by d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id sBFEoirq004216; Tue, 16 Dec 2014 01:51:08 +1100 From: "Naveen N. Rao" To: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, acme@kernel.org, mpe@ellerman.id.au Subject: [PATCHv2 7/8] perf probe powerpc: Use DWARF info only if necessary Date: Mon, 15 Dec 2014 20:20:37 +0530 Message-Id: X-Mailer: git-send-email 2.1.3 In-Reply-To: References: In-Reply-To: References: X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14121514-0029-0000-0000-000000D1CF59 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Use symbol table lookups by default if DWARF is not necessary, since powerpc ABIv2 encodes local entry points in the symbol table and the function entry address in DWARF may not be appropriate for kprobes, as described here: https://sourceware.org/bugzilla/show_bug.cgi?id=17638 "The DWARF address ranges deliberately include the *whole* function, both global and local entry points." ... "If you want to set probes on a local entry point, you should look up the symbol in the main symbol table (not DWARF), and check the st_other bits; they will indicate whether the function has a local entry point, and what its offset from the global entry point is. Note that GDB does the same when setting a breakpoint on a function entry." Signed-off-by: Naveen N. Rao --- Changes from previous patchset: Generalize and introduce helper to prefer symbol table over DWARF. tools/perf/arch/powerpc/util/sym-handling.c | 9 +++++++++ tools/perf/config/Makefile | 1 + tools/perf/util/probe-event.c | 6 ++++++ tools/perf/util/probe-event.h | 6 ++++++ 4 files changed, 22 insertions(+) diff --git a/tools/perf/arch/powerpc/util/sym-handling.c b/tools/perf/arch/powerpc/util/sym-handling.c index a27bfaf..22fc2e6 100644 --- a/tools/perf/arch/powerpc/util/sym-handling.c +++ b/tools/perf/arch/powerpc/util/sym-handling.c @@ -36,3 +36,12 @@ inline void arch_elf_sym_decode(GElf_Sym *sym __maybe_unused) sym->st_value += PPC64_LOCAL_ENTRY_OFFSET(sym->st_other); #endif } + +inline bool prefer_symtab(void) +{ +#if defined(_CALL_ELF) && _CALL_ELF == 2 + return true; +#else + return false; +#endif +} diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index 35cf934..849f686 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile @@ -384,6 +384,7 @@ ifeq ($(ARCH),powerpc) CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX endif CFLAGS += -DHAVE_ARCH_SYMBOL_HANDLING + CFLAGS += -DARCH_PREFER_SYMTAB endif ifndef NO_LIBUNWIND diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 7eb9b27..dfc3151 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -2373,6 +2373,12 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev, } } + if (prefer_symtab() && !perf_probe_event_need_dwarf(pev)) { + ret = find_probe_trace_events_from_map(pev, tevs, max_tevs, target); + if (ret > 0) + return ret; /* Found in symbol table */ + } + /* Convert perf_probe_event with debuginfo */ ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target); if (ret != 0) diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 8564451..5f92906 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h @@ -141,6 +141,12 @@ extern int show_available_funcs(const char *module, struct strfilter *filter, extern int probe_function_filter(struct map *map __maybe_unused, struct symbol *sym); +#ifdef ARCH_PREFER_SYMTAB +extern bool prefer_symtab(void); +#else +static inline bool prefer_symtab(void) { return false; }; +#endif + /* Maximum index number of event-name postfix */ #define MAX_EVENT_INDEX 1024