From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751827AbdJLPQ3 (ORCPT ); Thu, 12 Oct 2017 11:16:29 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:8020 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751119AbdJLPQ2 (ORCPT ); Thu, 12 Oct 2017 11:16:28 -0400 Subject: Re: [PATCH] perf tool: Don't discard prev in backward mode To: References: <20171013231628.27509-1-wangnan0@huawei.com> CC: From: "Wangnan (F)" Message-ID: <9ff681c0-fb71-9e65-3692-7f92f27cfbf5@huawei.com> Date: Thu, 12 Oct 2017 23:12:37 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <20171013231628.27509-1-wangnan0@huawei.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.194.139] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.59DF8748.0005,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: ea7e0244a1a73c5d1f3431f661d63ceb Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Kan, Please see if this patch works for you. On 2017/10/14 7:16, Wang Nan wrote: > Perf record can switch output. The new output should only store the > data after switching. However, in overwrite backward mode, the new > output still have the data from old output. That also brings extra overhead. > > At the end of mmap_read, the position of processed ring buffer is > saved in md->prev. Next mmap_read should be end in md->prev if it is > not overwriten. That avoids to process duplicate data. > However, the md->prev is discarded. So next mmap_read has to process > whole valid ring buffer, which probably include the old processed > data. > > Avoid calling backward_rb_find_range() when md->prev is still > available. > > Signed-off-by: Wang Nan > Cc: Liang Kan > --- > tools/perf/util/mmap.c | 33 +++++++++++++++------------------ > 1 file changed, 15 insertions(+), 18 deletions(-) > > diff --git a/tools/perf/util/mmap.c b/tools/perf/util/mmap.c > index 9fe5f9c..df1de55 100644 > --- a/tools/perf/util/mmap.c > +++ b/tools/perf/util/mmap.c > @@ -287,18 +287,6 @@ static int backward_rb_find_range(void *buf, int mask, u64 head, u64 *start, u64 > return -1; > } > > -static int rb_find_range(void *data, int mask, u64 head, u64 old, > - u64 *start, u64 *end, bool backward) > -{ > - if (!backward) { > - *start = old; > - *end = head; > - return 0; > - } > - > - return backward_rb_find_range(data, mask, head, start, end); > -} > - > int perf_mmap__push(struct perf_mmap *md, bool overwrite, bool backward, > void *to, int push(void *to, void *buf, size_t size)) > { > @@ -310,19 +298,28 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite, bool backward, > void *buf; > int rc = 0; > > - if (rb_find_range(data, md->mask, head, old, &start, &end, backward)) > - return -1; > + start = backward ? head : old; > + end = backward ? old : head; > > if (start == end) > return 0; > > size = end - start; > if (size > (unsigned long)(md->mask) + 1) { > - WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); > + if (!backward) { > + WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); > > - md->prev = head; > - perf_mmap__consume(md, overwrite || backward); > - return 0; > + md->prev = head; > + perf_mmap__consume(md, overwrite || backward); > + return 0; > + } > + > + /* > + * Backward ring buffer is full. We still have a chance to read > + * most of data from it. > + */ > + if (backward_rb_find_range(data, md->mask, head, &start, &end)) > + return -1; > } > > if ((start & md->mask) + size != (end & md->mask)) {