Received: by 10.213.65.68 with SMTP id h4csp1014077imn; Wed, 4 Apr 2018 11:03:25 -0700 (PDT) X-Google-Smtp-Source: AIpwx49AXdAC/KncnKV7u8U1T7SHYBgjjLOAmXavXxBl1A69jH1qwKsYADFGRNiSKleCCtZHRuP+ X-Received: by 2002:a17:902:6e8c:: with SMTP id v12-v6mr19319946plk.24.1522865005331; Wed, 04 Apr 2018 11:03:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522865005; cv=none; d=google.com; s=arc-20160816; b=V29T2d0Cz/KNmqd0l/iyKjC2P+2VfGGVtrFv61NFF8G90n7rALaZIKE7yBaLACLUzF Ewqee5ERiXm8QTwWnlLUIi0Z8zsAXC8pYSYp3QvBSz5D6GLNOREP7kniRrJuBNg7+iux 2gRhqimV4+tiv7/1jJwoQhShtBbJyKO/eWgS63uPsz+XCmXIZp5O4JAX2URqiJQHphTD bqtLg5+DcvR/C7b2fcHWF/y/J8ltRHxYMRGy838+vYmQOo+VBAv1FG/iHypSPQNcT0R2 n8A0PuyjTHmaL3MOxxEiPu4zISf9KdnoTavEEdmeSIMqN4B0zsxKoOESJyIM19N8um9Q zRQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=3DBdD8jSuRDUsCwyrUfbOYL46+xccroy/lqPCfJlTHQ=; b=hdF+4X2qvmyrziObqX6Rllo3FHqqBn5KWJRrmlJAnHI56Pe6u9MoDuH/IlL11Tci3o UzUT0z78hGdYLIx4iv75ChfuZTKq8R+5cKBp4UcZ/XaMDIHlrCQAcu3aeBEvPB3/REZe +ea0a6ZOzsqQcDqqQaGpEORZq192h+rCvKs1IDqVJ/Pl1vy/d0/ydJ5SeB8s29h4BwXp rB9JUuAmDaA2C+3zEaNHFbm0CRyxaR9tPPV+DpvWDqV8Pqsp4VB96V+GyqbMSQsP+/Db C5DdOCjF+OC53CaN8vHi0OWFvnpzAu503TnJ76KrlWCeNSShU+0f0mFO+is/E5Xuuraj xMVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p6si1208261pgq.292.2018.04.04.11.03.10; Wed, 04 Apr 2018 11:03:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751307AbeDDSCF (ORCPT + 99 others); Wed, 4 Apr 2018 14:02:05 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:37742 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750890AbeDDSCD (ORCPT ); Wed, 4 Apr 2018 14:02:03 -0400 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w34Hxuii032072 for ; Wed, 4 Apr 2018 14:02:03 -0400 Received: from e06smtp10.uk.ibm.com (e06smtp10.uk.ibm.com [195.75.94.106]) by mx0a-001b2d01.pphosted.com with ESMTP id 2h51hex3kj-1 (version=TLSv1.2 cipher=AES256-SHA256 bits=256 verify=NOT) for ; Wed, 04 Apr 2018 14:02:03 -0400 Received: from localhost by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 4 Apr 2018 19:01:57 +0100 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 4 Apr 2018 19:01:55 +0100 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w34I1tTj19595288; Wed, 4 Apr 2018 18:01:55 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6D7735204C; Wed, 4 Apr 2018 17:53:02 +0100 (BST) Received: from localhost.localdomain (unknown [9.40.193.84]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 902BC52059; Wed, 4 Apr 2018 17:53:01 +0100 (BST) From: Sandipan Das To: acme@kernel.org, jolsa@redhat.com Cc: linux-kernel@vger.kernel.org, naveen.n.rao@linux.vnet.ibm.com, sukadev@linux.vnet.ibm.com Subject: [RFC PATCH] perf tools powerpc: Fix callchain ip filtering Date: Wed, 4 Apr 2018 23:31:52 +0530 X-Mailer: git-send-email 2.14.3 X-TM-AS-GCONF: 00 x-cbid: 18040418-0040-0000-0000-0000042A76CB X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18040418-0041-0000-0000-0000262DA9DF Message-Id: <20180404180152.18964-1-sandipan@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-04-04_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1804040180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For powerpc64, if a probe is added for a function without specifying a line number, the corresponding trap instruction is placed at offset 0 (for big endian) or 8 (for little endian) from the start address of the function. This address is in the function prologue and the trap instruction preceeds the instructions to set up the stack frame. Therefore, at this point during execution, the return address for the function is yet to be written to its caller's stack frame. So, the LR value at index 2 of the callchain ips provided by the kernel is still valid and must not be skipped. This can be observed on a powerpc64le system running Fedora 27 as shown below. # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton # perf record -e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1 # perf script Without this patch, the output is: ping 27909 [007] 532219.943481: probe_libc:inet_pton: (7fff99b0af28) 15af28 __GI___inet_pton (/usr/lib64/libc-2.26.so) 1105b4 getaddrinfo (/usr/lib64/libc-2.26.so) With this patch applied, the output is: ping 27909 [007] 532219.943481: probe_libc:inet_pton: (7fff99b0af28) 15af28 __GI___inet_pton (/usr/lib64/libc-2.26.so) 10fa54 gaih_inet.constprop.7 (/usr/lib64/libc-2.26.so) 1105b4 getaddrinfo (/usr/lib64/libc-2.26.so) Fixes: a60335ba3298 ("perf tools powerpc: Adjust callchain based on DWARF debug info") Signed-off-by: Sandipan Das --- tools/perf/arch/powerpc/util/skip-callchain-idx.c | 58 ++++++++++++++++------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/tools/perf/arch/powerpc/util/skip-callchain-idx.c b/tools/perf/arch/powerpc/util/skip-callchain-idx.c index 0c370f81e002..1533d85191fd 100644 --- a/tools/perf/arch/powerpc/util/skip-callchain-idx.c +++ b/tools/perf/arch/powerpc/util/skip-callchain-idx.c @@ -212,6 +212,37 @@ static int check_return_addr(struct dso *dso, u64 map_start, Dwarf_Addr pc) return rc; } +/* + * Return: + * 0 if return address for the program counter @pc is on stack + * 1 if return address is in LR and no new stack frame was allocated + * 2 if return address is in LR and a new frame was allocated (but not + * yet used) + * -1 in case of errors + */ +static int get_return_addr(struct thread *thread, u64 ip) +{ + struct addr_location al; + struct dso *dso = NULL; + int rc = -1; + + thread__find_addr_location(thread, PERF_RECORD_MISC_USER, + MAP__FUNCTION, ip, &al); + + if (!al.map || !al.map->dso) { + pr_debug("%" PRIx64 " dso is NULL\n", ip); + return rc; + } + + dso = al.map->dso; + rc = check_return_addr(dso, al.map->start, ip); + + pr_debug("[DSO %s, sym %s, ip 0x%" PRIx64 "] rc %d\n", + dso->long_name, al.sym->name, ip, rc); + + return rc; +} + /* * The callchain saved by the kernel always includes the link register (LR). * @@ -237,32 +268,25 @@ static int check_return_addr(struct dso *dso, u64 map_start, Dwarf_Addr pc) */ int arch_skip_callchain_idx(struct thread *thread, struct ip_callchain *chain) { - struct addr_location al; - struct dso *dso = NULL; int rc; - u64 ip; u64 skip_slot = -1; if (chain->nr < 3) return skip_slot; - ip = chain->ips[2]; + rc = get_return_addr(thread, chain->ips[1]); - thread__find_addr_location(thread, PERF_RECORD_MISC_USER, - MAP__FUNCTION, ip, &al); - - if (al.map) - dso = al.map->dso; - - if (!dso) { - pr_debug("%" PRIx64 " dso is NULL\n", ip); + if (rc == 1) + /* Return address is still in LR and has not been updated + * in caller's stack frame. This is because the probe was + * placed at an offset from the start of the function that + * comes before the prologue code to set up the stack frame. + * So, an attempt to skip an entry based on chain->ips[2], + * i.e. the LR value, should not be made. + */ return skip_slot; - } - rc = check_return_addr(dso, al.map->start, ip); - - pr_debug("[DSO %s, sym %s, ip 0x%" PRIx64 "] rc %d\n", - dso->long_name, al.sym->name, ip, rc); + rc = get_return_addr(thread, chain->ips[2]); if (rc == 0) { /* -- 2.14.3