From: Steven Rostedt <rostedt@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Andrew Morton <akpm@linux-foundation.org>,
Vincent Donnefort <vdonnefort@google.com>
Subject: [for-next][PATCH 2/5] ring-buffer: Unify ring buffer minimum page calculations
Date: Mon, 19 Oct 2026 15:33:32 -0400 [thread overview]
Message-ID: <20261019193345.285303044@kernel.org> (raw)
In-Reply-To: <20261019193330.365764549@kernel.org>
From: Vincent Donnefort <vdonnefort@google.com>
The codebase scatters hardcoded minimum page limits across multiple
places. Introduce RING_BUFFER_MIN_NR_PAGES and rb_calculate_nr_pages()
to formalize the requirement of two pages in a ring buffer.
Link: https://patch.msgid.link/20260911193937.602202-4-vdonnefort@google.com
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/linux/ring_buffer.h | 9 ++++++++-
kernel/trace/ring_buffer.c | 32 +++++++++++++------------------
kernel/trace/simple_ring_buffer.c | 4 ++--
3 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h
index eac3e9080c3c..e4370064273e 100644
--- a/include/linux/ring_buffer.h
+++ b/include/linux/ring_buffer.h
@@ -98,6 +98,13 @@ struct trace_buffer *__ring_buffer_alloc_range(unsigned long size, unsigned flag
void *ring_buffer_meta_scratch(struct trace_buffer *buffer, unsigned int *size);
+/*
+ * A minimum of 2 pages ensures we can always swap a page out of the ring
+ * buffer. This does not account for the reader page or any other page
+ * containing meta data used by static ring buffers.
+ */
+#define RING_BUFFER_MIN_NR_PAGES 2UL
+
/*
* Because the ring buffer is generic, if other users of the ring buffer get
* traced by ftrace, it can produce lockdep warnings. We need to keep each
@@ -287,7 +294,7 @@ static inline struct ring_buffer_desc *__first_ring_buffer_desc(struct trace_buf
static inline unsigned long __calc_nr_pages_ring_buffer_desc(size_t size)
{
/* Takes into account the reader page */
- return max(DIV_ROUND_UP(size, PAGE_SIZE - BUF_PAGE_HDR_SIZE), 2UL) + 1;
+ return max(DIV_ROUND_UP(size, PAGE_SIZE - BUF_PAGE_HDR_SIZE), RING_BUFFER_MIN_NR_PAGES) + 1;
}
static inline size_t trace_buffer_desc_size(size_t buffer_size, unsigned int nr_cpus)
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 04bb94c29f58..1b148cd891c8 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -642,6 +642,11 @@ static __always_inline unsigned int rb_subbuf_max_data_size(struct trace_buffer
return rb_subbuf_capacity(buffer) - RB_EVNT_HDR_SIZE - sizeof(event->array[0]);
}
+static unsigned long rb_calculate_nr_pages(struct trace_buffer *buffer, unsigned long size)
+{
+ return max(DIV_ROUND_UP(size, rb_subbuf_capacity(buffer)), RING_BUFFER_MIN_NR_PAGES);
+}
+
/**
* rb_subbuf_start - Get the start address of a subbuffer
* @buffer: A trace buffer
@@ -2864,7 +2869,7 @@ static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flags,
goto fail_free_buffers;
/* Need at least two pages plus the reader page */
- if (nr_pages < 3)
+ if (nr_pages < RING_BUFFER_MIN_NR_PAGES + 1)
goto fail_free_buffers;
again:
@@ -2876,7 +2881,7 @@ static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flags,
ptr += subbuf_size * nr_pages;
}
if (ptr > end) {
- if (nr_pages <= 3)
+ if (nr_pages <= RING_BUFFER_MIN_NR_PAGES + 1)
goto fail_free_buffers;
nr_pages--;
goto again;
@@ -2899,13 +2904,10 @@ static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flags,
if (nr_pages > rb_static_max_pages())
goto fail_free_buffers;
- if (nr_pages < 2)
+ if (nr_pages < RING_BUFFER_MIN_NR_PAGES)
goto fail_free_buffers;
} else {
- /* need at least two pages */
- nr_pages = DIV_ROUND_UP(size, rb_subbuf_capacity(buffer));
- if (nr_pages < 2)
- nr_pages = 2;
+ nr_pages = rb_calculate_nr_pages(buffer, size);
}
cpumask_set_cpu(cpu, buffer->cpumask);
@@ -3318,11 +3320,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
mutex_lock(&buffer->mutex);
atomic_inc(&buffer->resizing);
- nr_pages = DIV_ROUND_UP(size, rb_subbuf_capacity(buffer));
-
- /* we need a minimum of two pages */
- if (nr_pages < 2)
- nr_pages = 2;
+ nr_pages = rb_calculate_nr_pages(buffer, size);
if (cpu_id == RING_BUFFER_ALL_CPUS) {
/*
@@ -7502,12 +7500,8 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
}
/* Update the number of pages to match the new size */
- nr_pages = old_capacity * buffer->buffers[cpu]->nr_pages;
- nr_pages = DIV_ROUND_UP(nr_pages, rb_subbuf_capacity(buffer));
-
- /* we need a minimum of two pages */
- if (nr_pages < 2)
- nr_pages = 2;
+ nr_pages = rb_calculate_nr_pages(buffer,
+ old_capacity * buffer->buffers[cpu]->nr_pages);
cpu_buffer->nr_pages_to_update = nr_pages;
@@ -8102,7 +8096,7 @@ int trace_rb_cpu_prepare(unsigned int cpu, struct hlist_node *node)
}
/* allocate minimum pages, user can later expand it */
if (!nr_pages_same)
- nr_pages = 2;
+ nr_pages = RING_BUFFER_MIN_NR_PAGES;
buffer->buffers[cpu] =
rb_allocate_cpu_buffer(buffer, nr_pages, cpu);
if (!buffer->buffers[cpu]) {
diff --git a/kernel/trace/simple_ring_buffer.c b/kernel/trace/simple_ring_buffer.c
index 49913bb0057a..abfaf9bee12e 100644
--- a/kernel/trace/simple_ring_buffer.c
+++ b/kernel/trace/simple_ring_buffer.c
@@ -383,8 +383,8 @@ int simple_ring_buffer_init_mm(struct simple_rb_per_cpu *cpu_buffer,
void *page;
int i;
- /* At least 1 reader page and two pages in the ring-buffer */
- if (desc->nr_page_va < 3)
+ /* At least RING_BUFFER_MIN_NR_PAGES and 1 reader page */
+ if (desc->nr_page_va < RING_BUFFER_MIN_NR_PAGES + 1)
return -EINVAL;
memset(cpu_buffer, 0, sizeof(*cpu_buffer));
--
2.53.0
next prev parent reply other threads:[~2026-10-19 19:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-19 19:33 [for-next][PATCH 0/5] ring-buffer: Updates for 7.4 Steven Rostedt
2026-10-19 19:33 ` [for-next][PATCH 1/5] ring-buffer: Add a MAINTAINERS category specific for the tracing ring-buffer Steven Rostedt
2026-10-19 19:33 ` Steven Rostedt [this message]
2026-10-19 19:33 ` [for-next][PATCH 3/5] ring-buffer: Clean up resize_disabled checks Steven Rostedt
2026-10-19 19:33 ` [for-next][PATCH 4/5] ring-buffer: Remove unnecessary cpumask_test_cpu Steven Rostedt
2026-10-19 19:33 ` [for-next][PATCH 5/5] ring-buffer: Take cpus_read_lock() when changing the subbuf order Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261019193345.285303044@kernel.org \
--to=rostedt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=vdonnefort@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®