Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp3058579rwo; Mon, 24 Jul 2023 05:47:35 -0700 (PDT) X-Google-Smtp-Source: APBJJlEfQ4mv/waiG0ZKPxcnHl6dwdR1n+cbihb2N7vfNfAz9s+giLPPExUVAmkSdgdHUIAclTiF X-Received: by 2002:a17:90a:a50b:b0:265:8184:5903 with SMTP id a11-20020a17090aa50b00b0026581845903mr6723751pjq.40.1690202854669; Mon, 24 Jul 2023 05:47:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690202854; cv=none; d=google.com; s=arc-20160816; b=MRGGGhPcyziW50ddbD+i/6CYxMIvie414+4BHe086wib5KSq5oC1HU9Ou0WnaV9kAI A935t8WV6x+VLelN8cl/xnqReCOSv6yrLa/X6omQyL5DW3qADbOx39cwojXGzMGy7qCN rMojhwK1SGVFYUqL/lxxlA7m78ld7KokfRbbhnhGpj+rETLp869WUjm2B9/pIMCGH9k9 JX5vO2+jF51g74RrgoV4TRJoY4LTcn5lzMkNGLOMvqQjdici9R+jdnOOZpeojRTjpoDZ pZAWcijHR3MeB0z26D9ZIa/zuhMLtj6p1a03Eh3i9jBfWPJOSvvqvB0Q9TFwkuZ4j5sG /L4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=OYSXvDlDai66uHwc/uQZE6ztzohN+EWjJYgybQcUIeg=; fh=xeRAkzy4SUDGCCwe38IYFSy40EBkw1ZAAQcHUZQRgmQ=; b=Rsu8JqJRNL3IbRvIbyVxLUWZFrzZ+5xy72qO4KP1jyvhjUUZlUusU/yB05Byasliys NGMW1lCBxdo5RJQIAUG4Xdtj+iyx1RQRWPYmxEKnrC0lc9iTEgOH4LePy7dQCDIh2Qvh 0Vc5B9foAhGPrqVquTqYPP3mnyyzSnTFmxLAIhouyx5Le30VEnx/2eqS8/EtP8Hy6rRj siBrcT3IiX953xWjd9zmyynI+C6mYLu/pinFcaBNUF2TpGbw4Cbfj895CZiuO+XVV91/ N3NhNRgmUelP25S5iA8elqOMzCkMsGizK0x0nbfD4SvskV2BCGRnDaAwFTqisO2LUBxX /yPA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t24-20020a17090aba9800b00263532fa6f5si11515836pjr.172.2023.07.24.05.47.22; Mon, 24 Jul 2023 05:47:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230168AbjGXM3Z (ORCPT + 99 others); Mon, 24 Jul 2023 08:29:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229847AbjGXM3W (ORCPT ); Mon, 24 Jul 2023 08:29:22 -0400 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4674710EF; Mon, 24 Jul 2023 05:29:11 -0700 (PDT) Received: from dggpeml500012.china.huawei.com (unknown [172.30.72.53]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4R8fXq2Qw4zHqcG; Mon, 24 Jul 2023 20:26:35 +0800 (CST) Received: from [10.67.110.218] (10.67.110.218) by dggpeml500012.china.huawei.com (7.185.36.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Mon, 24 Jul 2023 20:29:08 +0800 Message-ID: Date: Mon, 24 Jul 2023 20:29:08 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH] ring-buffer: Fix wrong stat of cpu_buffer->read Content-Language: en-US To: Steven Rostedt CC: , , , References: <20230724054040.3489499-1-zhengyejian1@huawei.com> <20230724044304.5a93a266@rorschach.local.home> From: Zheng Yejian In-Reply-To: <20230724044304.5a93a266@rorschach.local.home> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.67.110.218] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpeml500012.china.huawei.com (7.185.36.15) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2023/7/24 16:43, Steven Rostedt wrote: > Do you folks find it fun to post a fix right after I send Linus a pull request? ;-) It's always so coincidental :-) > > Thanks, I'll queue it up (but I will wait a bit before posting in case > more fixes trickle in) Thanks! -- Zheng Yejian > > -- Steve > > > On Mon, 24 Jul 2023 13:40:40 +0800 > Zheng Yejian wrote: > >> When pages are removed in rb_remove_pages(), 'cpu_buffer->read' is set >> to 0 in order to make sure any read iterators reset themselves. However, >> this will mess 'entries' stating, see following steps: >> >> # cd /sys/kernel/tracing/ >> # 1. Enlarge ring buffer prepare for later reducing: >> # echo 20 > per_cpu/cpu0/buffer_size_kb >> # 2. Write a log into ring buffer of cpu0: >> # taskset -c 0 echo "hello1" > trace_marker >> # 3. Read the log: >> # cat per_cpu/cpu0/trace_pipe >> <...>-332 [000] ..... 62.406844: tracing_mark_write: hello1 >> # 4. Stop reading and see the stats, now 0 entries, and 1 event readed: >> # cat per_cpu/cpu0/stats >> entries: 0 >> [...] >> read events: 1 >> # 5. Reduce the ring buffer >> # echo 7 > per_cpu/cpu0/buffer_size_kb >> # 6. Now entries became unexpected 1 because actually no entries!!! >> # cat per_cpu/cpu0/stats >> entries: 1 >> [...] >> read events: 0 >> >> To fix it, introduce 'page_removed' field to count total removed pages >> since last reset, then use it to let read iterators reset themselves >> instead of changing the 'read' pointer. >> >> Fixes: 83f40318dab0 ("ring-buffer: Make removal of ring buffer pages atomic") >> Signed-off-by: Zheng Yejian >> --- >> kernel/trace/ring_buffer.c | 22 ++++++++++++---------- >> 1 file changed, 12 insertions(+), 10 deletions(-) >> >> diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c >> index de061dd47313..46b4a3c7c3bf 100644 >> --- a/kernel/trace/ring_buffer.c >> +++ b/kernel/trace/ring_buffer.c >> @@ -523,6 +523,8 @@ struct ring_buffer_per_cpu { >> rb_time_t before_stamp; >> u64 event_stamp[MAX_NEST]; >> u64 read_stamp; >> + /* pages removed since last reset */ >> + unsigned long pages_removed; >> /* ring buffer pages to update, > 0 to add, < 0 to remove */ >> long nr_pages_to_update; >> struct list_head new_pages; /* new pages to add */ >> @@ -559,6 +561,7 @@ struct ring_buffer_iter { >> struct buffer_page *head_page; >> struct buffer_page *cache_reader_page; >> unsigned long cache_read; >> + unsigned long cache_pages_removed; >> u64 read_stamp; >> u64 page_stamp; >> struct ring_buffer_event *event; >> @@ -1957,6 +1960,8 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages) >> to_remove = rb_list_head(to_remove)->next; >> head_bit |= (unsigned long)to_remove & RB_PAGE_HEAD; >> } >> + /* Read iterators need to reset themselves when some pages removed */ >> + cpu_buffer->pages_removed += nr_removed; >> >> next_page = rb_list_head(to_remove)->next; >> >> @@ -1978,12 +1983,6 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages) >> cpu_buffer->head_page = list_entry(next_page, >> struct buffer_page, list); >> >> - /* >> - * change read pointer to make sure any read iterators reset >> - * themselves >> - */ >> - cpu_buffer->read = 0; >> - >> /* pages are removed, resume tracing and then free the pages */ >> atomic_dec(&cpu_buffer->record_disabled); >> raw_spin_unlock_irq(&cpu_buffer->reader_lock); >> @@ -4395,6 +4394,7 @@ static void rb_iter_reset(struct ring_buffer_iter *iter) >> >> iter->cache_reader_page = iter->head_page; >> iter->cache_read = cpu_buffer->read; >> + iter->cache_pages_removed = cpu_buffer->pages_removed; >> >> if (iter->head) { >> iter->read_stamp = cpu_buffer->read_stamp; >> @@ -4849,12 +4849,13 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts) >> buffer = cpu_buffer->buffer; >> >> /* >> - * Check if someone performed a consuming read to >> - * the buffer. A consuming read invalidates the iterator >> - * and we need to reset the iterator in this case. >> + * Check if someone performed a consuming read to the buffer >> + * or removed some pages from the buffer. In these cases, >> + * iterator was invalidated and we need to reset it. >> */ >> if (unlikely(iter->cache_read != cpu_buffer->read || >> - iter->cache_reader_page != cpu_buffer->reader_page)) >> + iter->cache_reader_page != cpu_buffer->reader_page || >> + iter->cache_pages_removed != cpu_buffer->pages_removed)) >> rb_iter_reset(iter); >> >> again: >> @@ -5298,6 +5299,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) >> cpu_buffer->last_overrun = 0; >> >> rb_head_page_activate(cpu_buffer); >> + cpu_buffer->pages_removed = 0; >> } >> >> /* Must have disabled the cpu buffer then done a synchronize_rcu */ > >