From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 80A5D46DFFC for ; Fri, 14 Aug 2026 12:41:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711291; cv=none; b=JbQ+f1FAodawyaIXbcwzMKvPXLtGDF95GGEx0EdanbIqHC7ytKZKJIlGmWuZSo8VQT/F2/j/0Dlny0R6DW55JNsogT3oCVgFOPz6IfyHuvkQiz7STV/d4cFjGIuK5t3SxK2aXNIuKWAXY2BA35d7JrkgA1JqDsvtJDdA/gi7Oxg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711291; c=relaxed/simple; bh=6yDJG2wHUM9+NysuBYzDpb7C1bzDrsFuxvtVXoLdoVY=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=iaPWj+Z26O5y5/QcnvyYS/vxY6b0yH8va0c179hMy42CbAUF6gvWu/5G24DwFG+LuvRoJ8fadCfqNP9mE638yfmTdxA0iB0jrjXZcUOoVFuqD9HwmHbg8lkJO2a1xw+RRUiPRsc3S7fRSyo3BOSUilsGx7p4v9vNVOJL0CpfEkU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cxZEJ5hV; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cxZEJ5hV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5CBDE1F00ADB; Fri, 14 Aug 2026 12:41:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711284; bh=aOmggwjKU223JTOm3U+UT56kxIkA9TH3PtpyL0gvfzg=; h=Date:From:To:Cc:Subject:References; b=cxZEJ5hVu3px7Ku3Z6CJ/ob1zQfZfP9qGVs2gTDeIrMmr9Nztk5YybjtkUfOQin/R sFkxxlrhEhJuh07APTwE4mOvgO5R3r94XAmE3HuUHM5+4EBqg4eGiFLLrmrCrT13pK QrRGqQAw0jL9SWiRNUWBhv2xYSRnkJQm8sqpSKJaNH3AuDx3N7mTF1v1arVYReJiLu iY6YuUS9Rbe/RKHTCC/OwaisTLtso0nl0u6b2SVz2TxaqmASeoRLQR5znIU1X3IcHY LIqpWto0x1nmk0PM2Ov+oIfYqTR/HBVWsNETp4KFTDzubENNUlIWrlqWaf+l1x4SP9 L/NHystORS26g== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003znI-2UK6; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124142.456409435@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:30 -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 7/9] ring-buffer: Dynamically calculate max_data_size References: <20260814124123.133362396@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 The ring buffer order can be dynamically modified and temporarily disables writing to do so. It is therefore safe to use the updated value to calculate the maximum event size which can be written onto the ring buffer. However, notice it is hardly making any difference for trace_marker because of the TRACE_MARKER_MAX_SIZE limit. For an 8KiB subbuf size, trace_marker can take 4096 characters while it can 'only' take 4054 bytes for smaller subbufs. Link: https://patch.msgid.link/20260813131152.3589632-8-vdonnefort@google.com Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 796c10319d6a..2204a121ef7e 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -598,7 +598,6 @@ struct trace_buffer { struct ring_buffer_meta *meta; unsigned int subbuf_order; - unsigned int max_data_size; }; static __always_inline unsigned int rb_subbuf_size(struct trace_buffer *buffer) @@ -620,6 +619,23 @@ static __always_inline unsigned int rb_subbuf_capacity(struct trace_buffer *buff return rb_subbuf_size(buffer) - BUF_PAGE_HDR_SIZE; } +/** + * rb_subbuf_max_data_size - Get the maximum payload size of a single event + * @buffer: A trace buffer + * + * Return: The maximum data payload size that can be stored in a single event. + */ +static __always_inline unsigned int rb_subbuf_max_data_size(struct trace_buffer *buffer) +{ + struct ring_buffer_event *event; + + /* + * surely rb_subbuf_capacity() is bigger than + * RINGBUF_TYPE_DATA_TYPE_LEN_MAX (see ring_buffer_event_length). + */ + return rb_subbuf_capacity(buffer) - RB_EVNT_HDR_SIZE - sizeof(event->array[0]); +} + /** * rb_subbuf_start - Get the start address of a subbuffer * @buffer: A trace buffer @@ -2773,9 +2789,6 @@ static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flags, buffer->subbuf_order = order; subbuf_size = (PAGE_SIZE << order); - /* Max payload is buffer page size - header (8bytes) */ - buffer->max_data_size = rb_subbuf_capacity(buffer) - (sizeof(u32) * 2); - buffer->flags = flags; buffer->clock = trace_clock_local; buffer->reader_lock_key = key; @@ -4941,7 +4954,7 @@ rb_reserve_next_event(struct trace_buffer *buffer, if (ring_buffer_time_stamp_abs(cpu_buffer->buffer)) { add_ts_default = RB_ADD_STAMP_ABSOLUTE; info.length += RB_LEN_TIME_EXTEND; - if (info.length > cpu_buffer->buffer->max_data_size) + if (info.length > rb_subbuf_max_data_size(cpu_buffer->buffer)) goto out_fail; } else { add_ts_default = RB_ADD_STAMP_NONE; @@ -5016,7 +5029,7 @@ ring_buffer_lock_reserve(struct trace_buffer *buffer, unsigned long length) if (unlikely(atomic_read(&cpu_buffer->record_disabled))) goto out; - if (unlikely(length > buffer->max_data_size)) + if (unlikely(length > rb_subbuf_max_data_size(buffer))) goto out; if (unlikely(trace_recursive_lock(cpu_buffer))) @@ -5163,7 +5176,7 @@ int ring_buffer_write(struct trace_buffer *buffer, if (atomic_read(&cpu_buffer->record_disabled)) return -EBUSY; - if (length > buffer->max_data_size) + if (length > rb_subbuf_max_data_size(buffer)) return -EBUSY; if (unlikely(trace_recursive_lock(cpu_buffer))) @@ -6522,8 +6535,9 @@ unsigned long ring_buffer_max_event_size(struct trace_buffer *buffer) { /* If abs timestamp is requested, events have a timestamp too */ if (ring_buffer_time_stamp_abs(buffer)) - return buffer->max_data_size - RB_LEN_TIME_EXTEND; - return buffer->max_data_size; + return rb_subbuf_max_data_size(buffer) - RB_LEN_TIME_EXTEND; + + return rb_subbuf_max_data_size(buffer); } EXPORT_SYMBOL_GPL(ring_buffer_max_event_size); @@ -7941,7 +7955,7 @@ int ring_buffer_map_get_reader(struct trace_buffer *buffer, int cpu) * missed events, then record it there. */ commit = rb_page_size(reader); - if (rb_subbuf_capacity(buffer) - commit >= sizeof(missed_events)) { + if (rb_page_capacity(reader) - commit >= sizeof(missed_events)) { memcpy(&dpage->data[commit], &missed_events, sizeof(missed_events)); local_add(RB_MISSED_STORED, &dpage->commit); -- 2.53.0