From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D7B52EA75E for ; Tue, 10 Mar 2026 14:35:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773153353; cv=none; b=C3FEZkl74xEe2gCjL4+eLqg6VtjY78sPbGbN3wNsSY1Z+anpFeTqHnwMvPBJyIgEhazH32r6bfo5+Qz89uQXdm+xTbQNy7ewfMaqs9+oWoJNTTrl2Puo8oFBE5d4TsHqNivQ0VfTEx2YNclTvv/RQyFecN6UB2g+lW0iUzWlri0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773153353; c=relaxed/simple; bh=2PCWxGlFEABLL356eTafZ/7it6XK4MUMeEAaHfgC3AU=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=HWmRaBs2oslpnl0bAKa3wAtkGrqOzbrx3qi5WmZOObZPqLXYVA7cBFIxYy/SpDFFrGt2070HZCq/VJqc/5QnKfnp24HH/S3kax7uqeMTiZzIKeQG0Cn86L0r5no32nOSwYZ2n36CETJ7AwLSzACnCee1r5du5X0XYlogoCIuW/k= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AaatZbRq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AaatZbRq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5A5EDC19423; Tue, 10 Mar 2026 14:35:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773153353; bh=2PCWxGlFEABLL356eTafZ/7it6XK4MUMeEAaHfgC3AU=; h=Date:From:To:Cc:Subject:References:From; b=AaatZbRq77lc7dXHDTfZN0NChrkHf52Bd9Bnvor9K7oPLhwsyTSy4f0fxCxjbypSE cZL7Y/dfjnN3WymjdXkFGHqEqYbcv8fU7wIq+Gm3UMaf2cHjDPyLSI9gQP/1uYNUid StWnlplQv+0bjyRiFXixxmwS7vS4bredkxVVIvwvcEA9ZLQOLUL0FnerZVqFmyWeAV Tt4aGKieG5GJO3VSDpzdUhyBMVoEe8hk/49tXo8dipgM9HaBUW7MgVSvkN+DlXEb3z UYypXvTleWVyvGB/YbSxeLbwLNgbASthZxvkftuql/W6mZXbXwCtGMcHday0BU1ZnY WAdymLtbpqURg== Received: from rostedt by gandalf with local (Exim 4.99.1) (envelope-from ) id 1vzyBn-00000002ZbK-1WEv; Tue, 10 Mar 2026 10:36:03 -0400 Message-ID: <20260310143603.219118299@kernel.org> User-Agent: quilt/0.69 Date: Tue, 10 Mar 2026 10:35:19 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Vincent Donnefort Subject: [for-next][PATCH 04/18] ring-buffer: Add non-consuming read for ring-buffer remotes References: <20260310143515.132579088@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 From: Vincent Donnefort Hopefully, the remote will only swap pages on the kernel instruction (via the swap_reader_page() callback). This means we know at what point the ring-buffer geometry has changed. It is therefore possible to rearrange the kernel view of that ring-buffer to allow non-consuming read. Link: https://patch.msgid.link/20260309162516.2623589-5-vdonnefort@google.com Reviewed-by: Steven Rostedt (Google) Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt (Google) --- kernel/trace/ring_buffer.c | 75 +++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 88218377fa29..fb39dd43e00b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -5388,10 +5388,51 @@ static bool rb_read_remote_meta_page(struct ring_buffer_per_cpu *cpu_buffer) return rb_num_of_entries(cpu_buffer); } +static void rb_update_remote_head(struct ring_buffer_per_cpu *cpu_buffer) +{ + struct buffer_page *next, *orig; + int retry = 3; + + orig = next = cpu_buffer->head_page; + rb_inc_page(&next); + + /* Run after the writer */ + while (cpu_buffer->head_page->page->time_stamp > next->page->time_stamp) { + rb_inc_page(&next); + + rb_list_head_clear(cpu_buffer->head_page->list.prev); + rb_inc_page(&cpu_buffer->head_page); + rb_set_list_to_head(cpu_buffer->head_page->list.prev); + + if (cpu_buffer->head_page == orig) { + if (WARN_ON_ONCE(!(--retry))) + return; + } + } + + orig = cpu_buffer->commit_page = cpu_buffer->head_page; + retry = 3; + + while (cpu_buffer->commit_page->page->time_stamp < next->page->time_stamp) { + rb_inc_page(&next); + rb_inc_page(&cpu_buffer->commit_page); + + if (cpu_buffer->commit_page == orig) { + if (WARN_ON_ONCE(!(--retry))) + return; + } + } +} + static void rb_iter_reset(struct ring_buffer_iter *iter) { struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; + if (cpu_buffer->remote) { + rb_read_remote_meta_page(cpu_buffer); + rb_update_remote_head(cpu_buffer); + } + /* Iterator usage is expected to have record disabled */ iter->head_page = cpu_buffer->reader_page; iter->head = cpu_buffer->reader_page->read; @@ -5544,7 +5585,7 @@ rb_update_iter_read_stamp(struct ring_buffer_iter *iter, static struct buffer_page * __rb_get_reader_page_from_remote(struct ring_buffer_per_cpu *cpu_buffer) { - struct buffer_page *new_reader, *prev_reader; + struct buffer_page *new_reader, *prev_reader, *prev_head, *new_head, *last; if (!rb_read_remote_meta_page(cpu_buffer)) return NULL; @@ -5568,10 +5609,32 @@ __rb_get_reader_page_from_remote(struct ring_buffer_per_cpu *cpu_buffer) WARN_ON_ONCE(prev_reader == new_reader); - cpu_buffer->reader_page->page = new_reader->page; - cpu_buffer->reader_page->id = new_reader->id; - cpu_buffer->reader_page->read = 0; - cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp; + prev_head = new_reader; /* New reader was also the previous head */ + new_head = prev_head; + rb_inc_page(&new_head); + last = prev_head; + rb_dec_page(&last); + + /* Clear the old HEAD flag */ + rb_list_head_clear(cpu_buffer->head_page->list.prev); + + prev_reader->list.next = prev_head->list.next; + prev_reader->list.prev = prev_head->list.prev; + + /* Swap prev_reader with new_reader */ + last->list.next = &prev_reader->list; + new_head->list.prev = &prev_reader->list; + + new_reader->list.prev = &new_reader->list; + new_reader->list.next = &new_head->list; + + /* Reactivate the HEAD flag */ + rb_set_list_to_head(&last->list); + + cpu_buffer->head_page = new_head; + cpu_buffer->reader_page = new_reader; + cpu_buffer->pages = &new_head->list; + cpu_buffer->read_stamp = new_reader->page->time_stamp; cpu_buffer->lost_events = cpu_buffer->meta_page->reader.lost_events; return rb_page_size(cpu_buffer->reader_page) ? cpu_buffer->reader_page : NULL; @@ -6155,7 +6218,7 @@ ring_buffer_read_start(struct trace_buffer *buffer, int cpu, gfp_t flags) struct ring_buffer_per_cpu *cpu_buffer; struct ring_buffer_iter *iter; - if (!cpumask_test_cpu(cpu, buffer->cpumask) || buffer->remote) + if (!cpumask_test_cpu(cpu, buffer->cpumask)) return NULL; iter = kzalloc_obj(*iter, flags); -- 2.51.0