From patchwork Thu Oct 12 14:00:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 115497 Delivered-To: patch@linaro.org Received: by 10.140.22.163 with SMTP id 32csp378046qgn; Tue, 10 Oct 2017 23:02:44 -0700 (PDT) X-Google-Smtp-Source: AOwi7QCLa4rOmboJMQ3Fc+lRPiXdkSKcBlsc7RO/TZaDkekitu06lKCOl06lEzgQzDHw2MzA95VO X-Received: by 10.98.93.75 with SMTP id r72mr15516548pfb.331.1507701764313; Tue, 10 Oct 2017 23:02:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507701764; cv=none; d=google.com; s=arc-20160816; b=xGXnn9ZsdQm7PgfjSA2wUmrxgZ2x+xIvDTJ5mIqqRox00t7MCiUObS9QdgM/cykGbQ dwIZASSYN1NDUdnMvtn16c8gYITeLjjEMQK2vlimBv4o1Oc/m6aiPXjrVaURLaBm8t/Z dg02Z+yDZy9hA/qk8zu96mLGHXvjzAnGAncGvAQ69ZFPrgRaNSd0N+RRobIbezvwWi4H LpRYO4BGpHScKWh+dlDRQyHdV/zyyFPQhOSHG39pWNtjpv/kh7m3CQzYGj5jfT0V0Dvg Q7y19YKNVRxn0zex3zuUmd1+4elana9HyR00yDQ+3VCz1QQEoiCMkNDh93bm/xQnU/zc QKgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=oESBLm2WkK+/9QqVkG1CqMEztkQOfA91+9ShGsCo53c=; b=whzHhDe76BKoWs3hx1XtgNiH4RW6q4J4DQtmMxSVG7oQKJ3Ugcl2BmQO9qjFqjavtP noXbPmMc4EuXwvgE/YUlG0SoPPKtGyodlRpmJEQ6LqjuSKSRZW4dBmdsTYFROKJ6zSbY Fg6e51k2JxaeKS673rlHs8L2tRO6qZltLYdVcoZ5ZiyVj8K8G6WJ8f9BBRLwEaahCmEa ZGds98mnQ2SRT+dKtvI4v9r2UAYxIukY5mTtslFHl8eqRub7mh14SjaQCNNj1dxdQiOo PE400GTNlxUOzH4XPgQ5rrn3uTGjHRsytyH+DtdbBI27eGaYkDArNbaVBJxxqBwrTISo gEBg== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f30si8052134plf.719.2017.10.10.23.02.43; Tue, 10 Oct 2017 23:02:44 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756951AbdJKGCm (ORCPT + 26 others); Wed, 11 Oct 2017 02:02:42 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7548 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750729AbdJKGCl (ORCPT ); Wed, 11 Oct 2017 02:02:41 -0400 Received: from 172.30.72.59 (EHLO DGGEMS407-HUB.china.huawei.com) ([172.30.72.59]) by dggrg05-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id DIX39033; Wed, 11 Oct 2017 13:56:09 +0800 (CST) Received: from localhost.localdomain (10.110.60.55) by DGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP Server id 14.3.301.0; Wed, 11 Oct 2017 13:55:58 +0800 From: Wang Nan To: , , CC: Wang Nan , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Namhyung Kim , Alexander Shishkin , Adrian Hunter , Andi Kleen , Li Zefan Subject: [PATCH] perf tools: fix: Force backward ring buffer mapped readonly Date: Thu, 12 Oct 2017 22:00:52 +0800 Message-ID: <20171012140052.5658-1-wangnan0@huawei.com> X-Mailer: git-send-email 2.9.3 MIME-Version: 1.0 X-Originating-IP: [10.110.60.55] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090202.59DDB27A.00A4, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: d57cc27ca4ddf5146568860c96047c03 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org perf record's --overwrite option doesn't work as we expect. For example: $ ~/linux/tools/perf$ sudo rm ./perf.data* rm: cannot remove './perf.data*': No such file or directory : ~/linux/tools/perf$ sudo ./perf record -m 4 -e raw_syscalls:* -g --overwrite \ --switch-output=1s --tail-synthesize dd if=/dev/zero of=/dev/null [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221460002 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221460102 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221460202 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221460302 ] ^C[ perf record: Woken up 1 times to write data ] 2066346+0 records in 2066346+0 records out 1057969152 bytes (1.1 GB, 1009 MiB) copied, 4.25983 s, 248 MB/s [ perf record: Dump perf.data.2017101221460332 ] [ perf record: Captured and wrote 0.034 MB perf.data. ] $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221460002 | head -n 1 dd 3918 [006] 182589.668954: raw_syscalls:sys_exit: NR 59 = 0 $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221460102 | head -n 1 dd 3918 [006] 182589.668954: raw_syscalls:sys_exit: NR 59 = 0 $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221460202 | head -n 1 dd 3918 [006] 182589.668954: raw_syscalls:sys_exit: NR 59 = 0 $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221460302 | head -n 1 dd 3918 [006] 182589.668954: raw_syscalls:sys_exit: NR 59 = 0 In the above example we get same records from the backward ring buffer all the time. Overwriting is not triggered. This commit maps backward ring buffers readonly, make it overwritable. It is safe because we assume backward ring buffer always overwritable in other part of code. After applying this patch: $ ~/linux/tools/perf$ sudo ./perf record -m 4 -e raw_syscalls:* -g --overwrite \ --switch-output=1s --tail-synthesize dd if=/dev/zero of=/dev/null [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221540350 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221540451 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221540551 ] [ perf record: dump data: Woken up 1 times ] [ perf record: Dump perf.data.2017101221540651 ] ^C[ perf record: Woken up 1 times to write data ] 1604606+0 records in 1604605+0 records out 821557760 bytes (822 MB, 783 MiB) copied, 4.42736 s, 186 MB/s [ perf record: Dump perf.data.2017101221540700 ] [ perf record: Captured and wrote 0.034 MB perf.data. ] $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221540350 | head -n 1 dd 5126 [003] 183074.104581: raw_syscalls:sys_exit: NR 0 = 512 $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221540451 | head -n 1 dd 5126 [003] 183075.106496: raw_syscalls:sys_exit: NR 1 = 512 $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221540551 | head -n 1 dd 5126 [003] 183076.108093: raw_syscalls:sys_enter: NR 1 (1, af8000, 200, 871, 0, af8060) $ ~/linux/tools/perf$ sudo ./perf script -i ./perf.data.2017101221540651 | head -n 1 dd 5126 [003] 183077.109676: raw_syscalls:sys_exit: NR 1 = 512 Signed-off-by: Wang Nan Cc: Liang Kan Cc: Arnaldo Carvalho de Melo Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Namhyung Kim Cc: Alexander Shishkin Cc: Adrian Hunter Cc: Andi Kleen Cc: Li Zefan --- tools/perf/util/evlist.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) -- 2.9.3 diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index c6c891e..a86b0d2 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -799,12 +799,14 @@ perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused, } static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx, - struct mmap_params *mp, int cpu_idx, + struct mmap_params *_mp, int cpu_idx, int thread, int *_output, int *_output_backward) { struct perf_evsel *evsel; int revent; int evlist_cpu = cpu_map__cpu(evlist->cpus, cpu_idx); + struct mmap_params *mp = _mp; + struct mmap_params backward_mp; evlist__for_each_entry(evlist, evsel) { struct perf_mmap *maps = evlist->mmap; @@ -815,6 +817,9 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx, if (evsel->attr.write_backward) { output = _output_backward; maps = evlist->backward_mmap; + backward_mp = *mp; + backward_mp.prot &= ~PROT_WRITE; + mp = &backward_mp; if (!maps) { maps = perf_evlist__alloc_mmap(evlist);