From nobody Tue Sep 29 00:30:46 2026 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 9C7DE46DFF7 for ; Fri, 14 Aug 2026 12:41:24 +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=1786711287; cv=none; b=VwDyYBybQlAONZOT7CmwQT7JL6ZsdBQxPSRefgpSER4Mfmddt0ucnw43R81KxKvrPp/m+xmUHW9KiMLzpAsb7LNqoqdOkElxI2SZlyAFpyNE8aSJL1El5SMw4/gjWKwi11tdt3uzku8KBXfBSMK3cK/l97P35UC94/8CG2bVqZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711287; c=relaxed/simple; bh=KFqAGLEzMYlDx118sW2l7GzOib8x2bdHsLhb4CEa8DM=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=QzR8eCfveG9euGKa0kBoEEr2SD06XratH+LFGszl6EyNCBGL9DY2CpHkb1xLcPi9XQF7crP+8vFB4DdjWVbC/koB0ALCFKr2oxnVsOHlO4cHXcWkn4TCXqG8Pd+a2Tu+iLCZOM5+M368JU52i0POWZk8DJmqZWGkCPJIQflxFug= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Vngj6BsO; 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="Vngj6BsO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D48E1F00A3A; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711283; bh=bXxB0xjIqxcU0hOpXuZpnK2JglH7X8vV4kPsieN7wC8=; h=Date:From:To:Cc:Subject:References; b=Vngj6BsOH/bW2ddqsuMaNY8hxmRrdIbDKL8gTdlKtOceof/rJlwH7gCUjSS6e9vS5 wISOVg9PrcGoYWDj9nsfbi1BXEJ/q4loK7HYQnwRNzQD13EtPb+SC8iVcPVeQZsrm/ rLccSn7WDPFzLejYNOK69DyuD7thNqx6+BvKU3PTB1FtOgl2tijFHnzx3iqbfUrw4x cRVbPK/jpjgOJZm/SnekevhTlOcCzVpJ8tae1ZZ/ZWwH/BqtTDhwnFwhEKs6mSZjqE b4SGrjkiaROwIMesb8e3i7+2S5TxiqOlPtTWWMeB9IG4Kr3cfLPoPNJ5J4palZ4G5G Jdut2MdrYoSaw== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurED-00000003zkM-2cgA; Fri, 14 Aug 2026 08:41:41 -0400 Message-ID: <20260814124141.483218324@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:24 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Julia Lawall Subject: [for-next][PATCH 1/9] ring-buffer: drop unneeded semicolon 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Julia Lawall When a function-like macro expands to an expression, that expression doesn't need a semicolon after it. All uses have been verified to have their own semicolons. This was found using the following Coccinelle semantic patch: @r@ identifier i : script:ocaml() { String.lowercase_ascii i =3D i }; expression e; @@ *#define i(...) e; Link: https://patch.msgid.link/20260801191002.1383835-6-Julia.Lawall@inria.= fr Signed-off-by: Julia Lawall Acked-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2667992f0aa2..8f34ff6fd066 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -405,11 +405,11 @@ static void free_buffer_page(struct buffer_page *bpag= e) */ #define alloc_cpu_buffer(cpu) (struct ring_buffer_per_cpu *) \ kzalloc_node(ALIGN(sizeof(struct ring_buffer_per_cpu), \ - cache_line_size()), GFP_KERNEL, cpu_to_node(cpu)); + cache_line_size()), GFP_KERNEL, cpu_to_node(cpu)) =20 #define alloc_cpu_page(cpu) (struct buffer_page *) \ kzalloc_node(ALIGN(sizeof(struct buffer_page), \ - cache_line_size()), GFP_KERNEL, cpu_to_node(cpu)); + cache_line_size()), GFP_KERNEL, cpu_to_node(cpu)) =20 static struct buffer_data_page *alloc_cpu_data(int cpu, int order) { --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 63BB346D56E; Fri, 14 Aug 2026 12:41:23 +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=1786711286; cv=none; b=uFX9WJTqhNtPWr/OdCzLj7kPGUlynvbJEaVm8QQk6ViBcVu/XOiCzuNC140PS2eZkPIznr3lghgj1lH3emSWRB47WdEns0jgiNoofFjCoBkjADT27d72otx9xzroKmJa9sXIqccrf+LzMwKNlvOwhLLpwrUsdG34J/iWuP2DXMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711286; c=relaxed/simple; bh=irBzJJwuizB5llBUNRGRfgTfreGG25e4zpVM41V/KoM=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=JBXmPn0F13jiRQ0SElqQxq6/2lJAClWDWt14oAlRaSm1pGtoiQBmOt0H9sSLZ/5z/CPZbrtkhna+LHWsGaqkGBuB5vWIKVg0GR3GyH7nt+tJocxR02pWy3DpJ+0wb0uSVCpaWFEUmnQsX1CW9mtePKYPmrkqhPBEDgjFAN4jAvY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iO3uvMjt; 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="iO3uvMjt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 635421F00A3E; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711283; bh=HVIyGtmoblTtKrNCRMfjG2EbdcAfwJE+kvr8q/m1VOM=; h=Date:From:To:Cc:Subject:References; b=iO3uvMjt8AP1EspC3BBiqNwh/lTRUJbFhgbM4CbdX0EgOXIubSdP+hwHdqKHr67dZ 2BnD7dWNMMG21i7byxyqiSAAmu+ckkESoEiPzWq1l+8ei0v3/xfEaxhjoVhh9tAqVf Ws1+rLHt1xbOLKtzJHPTmliaBM6bs/mvc8D6bmbV4rHSvuE5DZ62vrdjWiklSa+Jwe G+3t8vmeDTE197Ab4EkrF1P6vc1u7JY31WJzfqKkAPN5XQhBZ75FRrU/VINYjeRF6v 0UVwoFtkGSkRLsiPy13zGkhiITbGRlskdm6j0sPf4JIaPPmA3XUyfuSGVFS4PoyKX7 YucZcEdOD8mrA== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurED-00000003zkq-3JZs; Fri, 14 Aug 2026 08:41:41 -0400 Message-ID: <20260814124141.646190168@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:25 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , stable@vger.kernel.org, Sashiko , Vincent Donnefort Subject: [for-next][PATCH 2/9] ring-buffer: Free cpu_buffer::free_page with subbuf_order 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort When sub-buffers use an order greater than 0, cpu_buffer->free_page is allocated with subbuf_order. Use the correct order for cpu_buffer->free_page. Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260813131152.3589632-2-vdonnefort@google.c= om Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page= ") Reported-by: Sashiko Signed-off-by: Vincent Donnefort Reviewed-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 8f34ff6fd066..73a3fb76ba4d 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2631,7 +2631,7 @@ static void rb_free_cpu_buffer(struct ring_buffer_per= _cpu *cpu_buffer) free_buffer_page(bpage); } =20 - free_page((unsigned long)cpu_buffer->free_page); + free_pages((unsigned long)cpu_buffer->free_page, cpu_buffer->buffer->subb= uf_order); =20 kfree(cpu_buffer); } --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 1610346EC7E; Fri, 14 Aug 2026 12:41:24 +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=1786711288; cv=none; b=S+iAKX6sY+RzJaF+qbxVnu3BBK+DhlDnKeMsrsaUhOiTvH4zFT1TSfpNP6NYpHSzkGtTJ9Xd/luEv1iapzeBNN5+2FMXIJk2L6sIYWluayPgnnf4KuEP+B7yGB3nz66CgAnWriAbB+bDnX0iJAarl8BDxCX/8HAn9gkND+TWXNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711288; c=relaxed/simple; bh=JqnHCT32qVO54UOzLmOYNavvaxQn9B1g5DougJpccrw=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=tXi/rn1mB3e70GqI8+EPK2S0qsJG3Oh+1KRpvET3aK61B97Kt3pEflsRQsurm+O/yDg6hQH1mVADK7C3J6rUCrXNX3+x/mdS7nhS493bL7OZyTO3wc8hDmqip5BWqJ4rk8cNbyIm8Kd8WBqvnrh5j0bE/IeGUzj/eFR8WuwmwiE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gDtMtLa5; 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="gDtMtLa5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 731B11F00A3F; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711283; bh=1IS8mEyq71qXVERuAbIYDjD6JjBWkULc6LCRV5cXw4Y=; h=Date:From:To:Cc:Subject:References; b=gDtMtLa5pRig4GZcsDgWPkic3VNmskhhC/8x/dZrjsY0Rk4zflB3ytMNajNSIBHec RG97dlkK1Cos3GvkWBBlyxtOmSk7AIEHHL04km+TLJQfW7uXz35eMteGVDzHCbs78V AGez5d03bX+bgL0tGNpZi/i2FYLGwmrW2SRc7CkoUekYLkKGTJGy3PNXBh6PPWc4Cu 0KBNBhfN4pgiXXK6fKq3djt3wRhcfev4gaQW50a4gucSyEeCctWyjf2YSTm4BhRjUO 7stLBx+TLFENJToMfT434ZXd70Eq18py9vYS4wZbF8s3xU4UoYdVhLmSvxftnsxnAO GkweoUsfyAd6w== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurED-00000003zlK-41gf; Fri, 14 Aug 2026 08:41:41 -0400 Message-ID: <20260814124141.810285258@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:26 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , stable@vger.kernel.org, Sashiko , Vincent Donnefort Subject: [for-next][PATCH 3/9] ring-buffer: Hold cpu_buffer::lock when resizing a subbuf 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort Because, ring_buffer_subbuf_order_set() can clear cpu_buffer->free_page, hold cpu_buffer->lock to prevent races with ring_buffer_alloc_read_page() and ring_buffer_free_read_page(). Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260813131152.3589632-3-vdonnefort@google.c= om Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Reported-by: Sashiko Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 73a3fb76ba4d..0479c404db03 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -7431,8 +7431,10 @@ int ring_buffer_subbuf_order_set(struct trace_buffer= *buffer, int order) cpu_buffer->nr_pages =3D cpu_buffer->nr_pages_to_update; cpu_buffer->nr_pages_to_update =3D 0; =20 + arch_spin_lock(&cpu_buffer->lock); old_free_data_page =3D cpu_buffer->free_page; cpu_buffer->free_page =3D NULL; + arch_spin_unlock(&cpu_buffer->lock); =20 rb_head_page_activate(cpu_buffer); =20 --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 146664657D8; Fri, 14 Aug 2026 12:41:24 +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=1786711289; cv=none; b=riUkp4VtNGUgky5EmL8xv0QMzbng1dwCTycH+PPAMTRKyYa4naNkycVU3alICMoc9xvqkXuR1DVZZVjLQfEHvB3hXOslrEFMHXZ9iK+kgMAPbU6xt3eO2D36HEZVX4jSbVrsDirgsp2mxBuZLNavGrUjMRowezyK8Spn3R7f6wI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711289; c=relaxed/simple; bh=F7KrOn3i2bhTfbaqoYvju3VNdkBiNfk3vhQ1jUwq4WM=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=dF1L7d0QcdQC1j+KXXaPAtOmKMQHpyb22lrHjRSGudi9WbYa0/CYOw4wxv6H6FA/ZZMunT4ovmTlWW35C+Hfy3EiVXlUqQwCB3JYvjDwM+Ou7wN5+nFBfEpIG3xVMzRlu2Vxag5zPJ1SpqaTsJlEKX4tAvgM6b1RsLcwF+MVX7A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ttm/wj7k; 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="Ttm/wj7k" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A98AE1F00A3D; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711283; bh=/MVJR7cBPw8zhUFy7MDVWoll+yuUDELWeajJ0WPK+Es=; h=Date:From:To:Cc:Subject:References; b=Ttm/wj7ksi2gX6HTOWBiQyfJ51orKMkkFSsmW5+JqQ+410QVzeItt2WUggRivMOsh g6jhQtXN875JE9zdidfpj3TFV/4r7koo4KVibLVFtuw9WDT99/nd0Q/h0fJ/Xvk21w h1lw5RxbAzQ2Mw0SeD0bx3R3tjylFbUDyCsxnHWget7Y6DBAbnNhldp+y8ING97RIx 6bRryCnZ8+BJne6qthlFWcEIAvnjGOif/8GE4Kr3/UJUWKmRvU16SqM4B8BsHiFHlu JPD90HQ4ZiAqve7OKgoKWfdvcTjO983JcYH84IZA/vVBx+4igdGNh5FGefbBadzvO4 KTlfUwo2zcUaA== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003zlo-0VAq; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124141.982170841@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:27 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , stable@vger.kernel.org, Vincent Donnefort Subject: [for-next][PATCH 4/9] ring-buffer: Make cpu_buffer::free_page a buffer_data_read_page 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort Discarding a cached reader page after a concurrent ring buffer resize uses the new global subbuf_order for the free_pages() call. This mismatched order may crashes the kernel or leaks memory because the cached page was allocated under the old size. Save the actual free_page order alongside the page address to ensure we always refer to the correct value and do not rely on the potentially stalled cpu_buffer->subbuf_order value. The simplest is to make free_page a buffer_data_read_page which already covers exactly what we need: a page address and a page order. Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260813131152.3589632-4-vdonnefort@google.c= om Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 0479c404db03..0d35fd90ea1d 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -507,7 +507,7 @@ struct ring_buffer_per_cpu { raw_spinlock_t reader_lock; /* serialize readers */ arch_spinlock_t lock; struct lock_class_key lock_key; - struct buffer_data_page *free_page; + struct buffer_data_read_page free_page; unsigned long nr_pages; unsigned int current_context; struct list_head *pages; @@ -2631,7 +2631,7 @@ static void rb_free_cpu_buffer(struct ring_buffer_per= _cpu *cpu_buffer) free_buffer_page(bpage); } =20 - free_pages((unsigned long)cpu_buffer->free_page, cpu_buffer->buffer->subb= uf_order); + free_pages((unsigned long)cpu_buffer->free_page.data, cpu_buffer->free_pa= ge.order); =20 kfree(cpu_buffer); } @@ -6962,9 +6962,9 @@ ring_buffer_alloc_read_page(struct trace_buffer *buff= er, int cpu) local_irq_save(flags); arch_spin_lock(&cpu_buffer->lock); =20 - if (cpu_buffer->free_page) { - bpage->data =3D cpu_buffer->free_page; - cpu_buffer->free_page =3D NULL; + if (cpu_buffer->free_page.data) { + *bpage =3D cpu_buffer->free_page; + cpu_buffer->free_page.data =3D NULL; } =20 arch_spin_unlock(&cpu_buffer->lock); @@ -7016,8 +7016,8 @@ void ring_buffer_free_read_page(struct trace_buffer *= buffer, int cpu, local_irq_save(flags); arch_spin_lock(&cpu_buffer->lock); =20 - if (!cpu_buffer->free_page) { - cpu_buffer->free_page =3D dpage; + if (!cpu_buffer->free_page.data) { + cpu_buffer->free_page =3D *data_page; dpage =3D NULL; } =20 @@ -7390,7 +7390,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) } =20 for_each_buffer_cpu(buffer, cpu) { - struct buffer_data_page *old_free_data_page; + struct buffer_data_read_page old_free_data_page; struct list_head old_pages; unsigned long flags; =20 @@ -7433,7 +7433,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) =20 arch_spin_lock(&cpu_buffer->lock); old_free_data_page =3D cpu_buffer->free_page; - cpu_buffer->free_page =3D NULL; + cpu_buffer->free_page.data =3D NULL; arch_spin_unlock(&cpu_buffer->lock); =20 rb_head_page_activate(cpu_buffer); @@ -7445,7 +7445,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) list_del_init(&bpage->list); free_buffer_page(bpage); } - free_pages((unsigned long)old_free_data_page, old_order); + free_pages((unsigned long)old_free_data_page.data, old_free_data_page.or= der); =20 rb_check_pages(cpu_buffer); } --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 BCDF346EC9E; Fri, 14 Aug 2026 12:41:28 +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=1786711292; cv=none; b=OhUCXlxok/FWKLbhlkCfHWnVI7kMoIViJRS9PP1r1rDIWlYMFlReD4FtD5pGM7bgd2MfMUkEL1iT6seCKrvGHaz0M12gFL817/w+Yf1v/UrW8i1StkUPszjezYNlAxammmPClbXBj598Rx8Pu63rVhVr+hsFt36060RdQGiT1mI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711292; c=relaxed/simple; bh=19Aza+r8AI8c0ABBe+VtdwpbDMWRnfy291aP2xd8FC4=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=gM1um5fOQhMrleEuMU5aHFpsK1vG8m4Per5AHCPS6Rz/naLUEeMkuamLqo2z0gI6GJ4UQi6MW7sLp4kBq4BKl/QWL+DFiido5mvFVqcJs656mDgCqvSoxwgCSfplpNNidcwT4RxxM4lOBTACu4zapKMIYZhaklWdRR2HGDdPcSw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YX4xjBRe; 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="YX4xjBRe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D9DD91F00ACA; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711284; bh=KYBsyKkbdbzwqWFBVwGDdJrHuJARdhZEJN8hsgChdTg=; h=Date:From:To:Cc:Subject:References; b=YX4xjBReJxOrIMXESgW8thn5pba6drZZLaCfD1sVmjvBk3iuKxzL6emiyD7v1JJsu wb14bH9Tb0ZkBiAX/fXNl7VM4X8DTY0gBhqaorFJY+O2+VMsBn829ZAacwDFR3Ubjk E9lb+AN07etmz4MSZ4qm9YCWiQjuv0p7gq6ZUZfQM4jcnrA6JCo0F9OqDcjue6O57G xXbIArMYcSgQeRkWYGEe4Ntl2iPvoP268r6scUpGtj/iLO9WFwS/8rtQOPAkg/KPPt XDO7EzVV3fZFlf19hYxBW63KBlq20vh+2b36dfdZwXAvTIhr0z/ihQ3AGoDVvcUVqM y55eVgpjEwBww== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003zmI-1B8N; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124142.138126038@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:28 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , stable@vger.kernel.org, Sashiko , Vincent Donnefort Subject: [for-next][PATCH 5/9] ring-buffer: Fix subbuf resize race with ring buffer readers 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort trace_buffer subbuf_size is read lockless in ring_buffer_read_page() and ring_buffer_read_start(), while it can simultaneously be resized with ring_buffer_subbuf_order_set(). Instead of trace_buffer::subbuf_size, use bpage::order in ring_buffer_read_start() and ring_buffer_read_page(). In ring_buffer_read_start(), even with resize_disabled, there is still a possibility of a race with a buffer modification. Hold the trace_buffer mutex to synchronise with any pending ring buffer order modification. trace_buffer::subbuf_size is now actually useless, remove it. Also, create accessors rb_subbuf_capacity() and rb_page_capacity() which return the actual size available for storing events, while rb_subbuf_size() returns the actual subbuf page-size. Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260813131152.3589632-5-vdonnefort@google.c= om Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page= ") Reported-by: Sashiko Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 167 +++++++++++++++++++++++-------------- 1 file changed, 106 insertions(+), 61 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 0d35fd90ea1d..e436793ed5c1 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -391,6 +391,17 @@ static __always_inline unsigned int rb_page_size(struc= t buffer_page *bpage) return rb_data_page_size(bpage->page); } =20 +/** + * rb_page_capacity - Get the capacity of a buffer page + * @bpage: The buffer page + * + * Return: The maximum size available for events in the given buffer page. + */ +static __always_inline unsigned int rb_page_capacity(struct buffer_page *b= page) +{ + return (PAGE_SIZE << bpage->order) - BUF_PAGE_HDR_SIZE; +} + static void free_buffer_page(struct buffer_page *bpage) { /* Range pages are not to be freed */ @@ -586,11 +597,42 @@ struct trace_buffer { =20 struct ring_buffer_meta *meta; =20 - unsigned int subbuf_size; unsigned int subbuf_order; unsigned int max_data_size; }; =20 +static __always_inline unsigned int rb_subbuf_size(struct trace_buffer *bu= ffer) +{ + return PAGE_SIZE << buffer->subbuf_order; +} + +/** + * rb_subbuf_capacity - Get the capacity of a subbuffer + * @buffer: A trace buffer + * + * Unsafe to use without holding trace_buffer::mutex or with resizing enab= led. + * Consider rb_page_capacity() instead. + * + * Return: The maximum size available for events in a trace buffer subbuff= er. + */ +static __always_inline unsigned int rb_subbuf_capacity(struct trace_buffer= *buffer) +{ + return rb_subbuf_size(buffer) - BUF_PAGE_HDR_SIZE; +} + +/** + * rb_subbuf_start - Get the start address of a subbuffer + * @buffer: A trace buffer + * @addr: An address of an event on a subbuffer + * + * Return: The start of the subbuffer for where @addr sits + */ +static __always_inline +unsigned long rb_subbuf_start(struct trace_buffer *buffer, unsigned long a= ddr) +{ + return addr & ~((unsigned long)(rb_subbuf_size(buffer) - 1)); +} + struct ring_buffer_iter { struct ring_buffer_per_cpu *cpu_buffer; unsigned long head; @@ -630,7 +672,7 @@ int ring_buffer_print_page_header(struct trace_buffer *= buffer, struct trace_seq trace_seq_printf(s, "\tfield: char data;\t" "offset:%u;\tsize:%u;\tsigned:%u;\n", (unsigned int)offsetof(typeof(field), data), - (unsigned int)(buffer ? buffer->subbuf_size : + (unsigned int)(buffer ? rb_subbuf_capacity(buffer) : PAGE_SIZE - BUF_PAGE_HDR_SIZE), (unsigned int)is_signed_type(char)); =20 @@ -1620,7 +1662,7 @@ rb_range_align_subbuf(unsigned long addr, int subbuf_= size, int nr_subbufs) */ static void *rb_range_meta(struct trace_buffer *buffer, int nr_pages, int = cpu) { - int subbuf_size =3D buffer->subbuf_size + BUF_PAGE_HDR_SIZE; + int subbuf_size =3D rb_subbuf_size(buffer); struct ring_buffer_cpu_meta *meta; struct ring_buffer_meta *bmeta; unsigned long ptr; @@ -2432,8 +2474,8 @@ static int __rb_allocate_pages(struct ring_buffer_per= _cpu *cpu_buffer, bpage->id =3D i + 1; cpu_buffer->subbuf_ids[i + 1] =3D bpage; } else { - int order =3D cpu_buffer->buffer->subbuf_order; - bpage->page =3D alloc_cpu_data(cpu_buffer->cpu, order); + bpage->page =3D alloc_cpu_data(cpu_buffer->cpu, + cpu_buffer->buffer->subbuf_order); if (!bpage->page) goto free_pages; } @@ -2556,8 +2598,7 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, l= ong nr_pages, int cpu) bpage->range =3D 1; cpu_buffer->subbuf_ids[0] =3D bpage; } else { - int order =3D cpu_buffer->buffer->subbuf_order; - bpage->page =3D alloc_cpu_data(cpu, order); + bpage->page =3D alloc_cpu_data(cpu, bpage->order); if (!bpage->page) goto fail_free_reader; } @@ -2731,10 +2772,9 @@ static struct trace_buffer *alloc_buffer(unsigned lo= ng size, unsigned flags, =20 buffer->subbuf_order =3D order; subbuf_size =3D (PAGE_SIZE << order); - buffer->subbuf_size =3D subbuf_size - BUF_PAGE_HDR_SIZE; =20 /* Max payload is buffer page size - header (8bytes) */ - buffer->max_data_size =3D buffer->subbuf_size - (sizeof(u32) * 2); + buffer->max_data_size =3D rb_subbuf_capacity(buffer) - (sizeof(u32) * 2); =20 buffer->flags =3D flags; buffer->clock =3D trace_clock_local; @@ -2818,9 +2858,8 @@ static struct trace_buffer *alloc_buffer(unsigned lon= g size, unsigned flags, if (nr_pages < 2) goto fail_free_buffers; } else { - /* need at least two pages */ - nr_pages =3D DIV_ROUND_UP(size, buffer->subbuf_size); + nr_pages =3D DIV_ROUND_UP(size, rb_subbuf_capacity(buffer)); if (nr_pages < 2) nr_pages =3D 2; } @@ -3203,7 +3242,7 @@ static void update_pages_handler(struct work_struct *= work) * @size: the new size. * @cpu_id: the cpu buffer to resize * - * Minimum size is 2 * buffer->subbuf_size. + * Minimum size is 2 * rb_subbuf_capacity(buffer). * * Returns 0 on success and < 0 on failure. */ @@ -3225,12 +3264,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, = unsigned long size, !cpumask_test_cpu(cpu_id, buffer->cpumask)) return 0; =20 - nr_pages =3D DIV_ROUND_UP(size, buffer->subbuf_size); - - /* we need a minimum of two pages */ - if (nr_pages < 2) - nr_pages =3D 2; - /* * Keep CPUs from coming online while resizing to synchronize * with new per CPU buffers being created. @@ -3241,6 +3274,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, = unsigned long size, mutex_lock(&buffer->mutex); atomic_inc(&buffer->resizing); =20 + nr_pages =3D DIV_ROUND_UP(size, rb_subbuf_capacity(buffer)); + + /* we need a minimum of two pages */ + if (nr_pages < 2) + nr_pages =3D 2; + if (cpu_id =3D=3D RING_BUFFER_ALL_CPUS) { /* * Don't succeed if resizing is disabled, as a reader might be @@ -3513,7 +3552,7 @@ rb_event_index(struct ring_buffer_per_cpu *cpu_buffer= , struct ring_buffer_event { unsigned long addr =3D (unsigned long)event; =20 - addr &=3D (PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1; + addr &=3D (unsigned long)rb_subbuf_size(cpu_buffer->buffer) - 1; =20 return addr - BUF_PAGE_HDR_SIZE; } @@ -3755,8 +3794,8 @@ static inline void rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, unsigned long tail, struct rb_event_info *info) { - unsigned long bsize =3D READ_ONCE(cpu_buffer->buffer->subbuf_size); struct buffer_page *tail_page =3D info->tail_page; + unsigned long bsize =3D rb_page_capacity(tail_page); struct ring_buffer_event *event; unsigned long length =3D info->length; =20 @@ -4101,8 +4140,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buf= fer, =20 new_index =3D rb_event_index(cpu_buffer, event); old_index =3D new_index + rb_event_ts_length(event); - addr =3D (unsigned long)event; - addr &=3D ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); + addr =3D rb_subbuf_start(cpu_buffer->buffer, (unsigned long)event); =20 bpage =3D READ_ONCE(cpu_buffer->tail_page); =20 @@ -4767,7 +4805,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buf= fer, tail =3D write - info->length; =20 /* See if we shot pass the end of this buffer page */ - if (unlikely(write > cpu_buffer->buffer->subbuf_size)) { + if (unlikely(write > rb_page_capacity(tail_page))) { check_buffer(cpu_buffer, info, CHECK_FULL_PAGE); return rb_move_tail(cpu_buffer, tail, info); } @@ -5012,7 +5050,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_bu= ffer, struct buffer_page *bpage =3D cpu_buffer->commit_page; struct buffer_page *start; =20 - addr &=3D ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); + addr =3D rb_subbuf_start(cpu_buffer->buffer, addr); =20 /* Do the likely case first */ if (likely(bpage->page =3D=3D (void *)addr)) { @@ -5799,7 +5837,6 @@ static struct buffer_page * __rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) { int max_loops =3D cpu_buffer->ring_meta ? cpu_buffer->nr_pages : 3; - unsigned long bsize =3D READ_ONCE(cpu_buffer->buffer->subbuf_size); struct buffer_page *reader =3D NULL; unsigned long overwrite; unsigned long flags; @@ -5947,7 +5984,7 @@ __rb_get_reader_page(struct ring_buffer_per_cpu *cpu_= buffer) #define USECS_WAIT 1000000 for (nr_loops =3D 0; nr_loops < USECS_WAIT; nr_loops++) { /* If the write is past the end of page, a writer is still updating it */ - if (likely(!reader || rb_page_write(reader) <=3D bsize)) + if (likely(!reader || rb_page_write(reader) <=3D rb_page_capacity(reader= ))) break; =20 udelay(1); @@ -6380,36 +6417,44 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); struct ring_buffer_iter * ring_buffer_read_start(struct trace_buffer *buffer, int cpu, gfp_t flags) { + struct ring_buffer_iter *iter __free(kfree) =3D kzalloc_obj(*iter, flags); struct ring_buffer_per_cpu *cpu_buffer; - struct ring_buffer_iter *iter; - - if (!cpumask_test_cpu(cpu, buffer->cpumask)) - return NULL; =20 - iter =3D kzalloc_obj(*iter, flags); if (!iter) return NULL; =20 - /* Holds the entire event: data and meta data */ - iter->event_size =3D buffer->subbuf_size; - iter->event =3D kmalloc(iter->event_size, flags); - if (!iter->event) { - kfree(iter); + if (!cpumask_test_cpu(cpu, buffer->cpumask)) return NULL; - } =20 cpu_buffer =3D buffer->buffers[cpu]; =20 - iter->cpu_buffer =3D cpu_buffer; + /* + * Only KDB is using GFP_ATOMIC, for the others, lock the buffer to + * prevent concurrent resizing. + */ + if (gfpflags_allow_blocking(flags)) + mutex_lock(&buffer->mutex); =20 atomic_inc(&cpu_buffer->resize_disabled); =20 + if (gfpflags_allow_blocking(flags)) + mutex_unlock(&buffer->mutex); + + /* Holds the entire event: data and meta data. */ + iter->event_size =3D rb_page_capacity(READ_ONCE(cpu_buffer->reader_page)); + iter->event =3D kmalloc(iter->event_size, flags); + if (!iter->event) { + atomic_dec(&cpu_buffer->resize_disabled); + return NULL; + } + iter->cpu_buffer =3D cpu_buffer; + guard(raw_spinlock_irqsave)(&cpu_buffer->reader_lock); arch_spin_lock(&cpu_buffer->lock); rb_iter_reset(iter); arch_spin_unlock(&cpu_buffer->lock); =20 - return iter; + return_ptr(iter); } EXPORT_SYMBOL_GPL(ring_buffer_read_start); =20 @@ -6463,7 +6508,7 @@ unsigned long ring_buffer_size(struct trace_buffer *b= uffer, int cpu) if (!cpumask_test_cpu(cpu, buffer->cpumask)) return 0; =20 - return buffer->subbuf_size * buffer->buffers[cpu]->nr_pages; + return rb_subbuf_capacity(buffer) * buffer->buffers[cpu]->nr_pages; } EXPORT_SYMBOL_GPL(ring_buffer_size); =20 @@ -7094,15 +7139,15 @@ int ring_buffer_read_page(struct trace_buffer *buff= er, if (!data_page || !data_page->data) return -1; =20 - if (data_page->order !=3D buffer->subbuf_order) - return -1; - dpage =3D data_page->data; if (!dpage) return -1; =20 guard(raw_spinlock_irqsave)(&cpu_buffer->reader_lock); =20 + if (data_page->order !=3D cpu_buffer->reader_page->order) + return -1; + reader =3D rb_get_reader_page(cpu_buffer); if (!reader) return -1; @@ -7228,7 +7273,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer, * missed events, then record it there. */ if (missed_events > 0 && - buffer->subbuf_size - size >=3D sizeof(missed_events)) { + rb_page_capacity(reader) - size >=3D sizeof(missed_events)) { memcpy(&dpage->data[size], &missed_events, sizeof(missed_events)); local_add(RB_MISSED_STORED, &dpage->commit); @@ -7248,8 +7293,8 @@ int ring_buffer_read_page(struct trace_buffer *buffer, /* * This page may be off to user land. Zero it out here. */ - if (size < buffer->subbuf_size) - memset(&dpage->data[size], 0, buffer->subbuf_size - size); + if (size < rb_page_capacity(reader)) + memset(&dpage->data[size], 0, rb_page_capacity(reader) - size); =20 return read; } @@ -7275,7 +7320,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_read_page_data); */ int ring_buffer_subbuf_size_get(struct trace_buffer *buffer) { - return buffer->subbuf_size + BUF_PAGE_HDR_SIZE; + return rb_subbuf_size(buffer); } EXPORT_SYMBOL_GPL(ring_buffer_subbuf_size_get); =20 @@ -7320,7 +7365,8 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) { struct ring_buffer_per_cpu *cpu_buffer; struct buffer_page *bpage, *tmp; - int old_order, old_size; + unsigned int old_capacity; + int old_order; int nr_pages; int psize; int err; @@ -7329,9 +7375,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) if (!buffer || order < 0) return -EINVAL; =20 - if (buffer->subbuf_order =3D=3D order) - return 0; - psize =3D (1 << order) * PAGE_SIZE; if (psize <=3D BUF_PAGE_HDR_SIZE) return -EINVAL; @@ -7340,18 +7383,21 @@ int ring_buffer_subbuf_order_set(struct trace_buffe= r *buffer, int order) if (psize > RB_WRITE_MASK + 1) return -EINVAL; =20 - old_order =3D buffer->subbuf_order; - old_size =3D buffer->subbuf_size; - /* prevent another thread from changing buffer sizes */ guard(mutex)(&buffer->mutex); + + old_order =3D buffer->subbuf_order; + if (old_order =3D=3D order) + return 0; + + old_capacity =3D rb_subbuf_capacity(buffer); + atomic_inc(&buffer->record_disabled); =20 /* Make sure all commits have finished */ synchronize_rcu(); =20 buffer->subbuf_order =3D order; - buffer->subbuf_size =3D psize - BUF_PAGE_HDR_SIZE; =20 /* Make sure all new buffers are allocated, before deleting the old ones = */ for_each_buffer_cpu(buffer, cpu) { @@ -7367,8 +7413,8 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) } =20 /* Update the number of pages to match the new size */ - nr_pages =3D old_size * buffer->buffers[cpu]->nr_pages; - nr_pages =3D DIV_ROUND_UP(nr_pages, buffer->subbuf_size); + nr_pages =3D old_capacity * buffer->buffers[cpu]->nr_pages; + nr_pages =3D DIV_ROUND_UP(nr_pages, rb_subbuf_capacity(buffer)); =20 /* we need a minimum of two pages */ if (nr_pages < 2) @@ -7456,7 +7502,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer = *buffer, int order) =20 error: buffer->subbuf_order =3D old_order; - buffer->subbuf_size =3D old_size; =20 atomic_dec(&buffer->record_disabled); =20 @@ -7534,7 +7579,7 @@ static void rb_setup_ids_meta_page(struct ring_buffer= _per_cpu *cpu_buffer, =20 meta->meta_struct_len =3D sizeof(*meta); meta->nr_subbufs =3D nr_subbufs; - meta->subbuf_size =3D cpu_buffer->buffer->subbuf_size + BUF_PAGE_HDR_SIZE; + meta->subbuf_size =3D rb_subbuf_size(cpu_buffer->buffer); meta->meta_page_size =3D meta->subbuf_size; =20 rb_update_meta_page(cpu_buffer); @@ -7896,7 +7941,7 @@ int ring_buffer_map_get_reader(struct trace_buffer *b= uffer, int cpu) * missed events, then record it there. */ commit =3D rb_page_size(reader); - if (buffer->subbuf_size - commit >=3D sizeof(missed_events)) { + if (rb_subbuf_capacity(buffer) - commit >=3D sizeof(missed_events)) { memcpy(&dpage->data[commit], &missed_events, sizeof(missed_events)); local_add(RB_MISSED_STORED, &dpage->commit); @@ -7928,7 +7973,7 @@ int ring_buffer_map_get_reader(struct trace_buffer *b= uffer, int cpu) out: /* Some archs do not have data cache coherency between kernel and user-sp= ace */ flush_kernel_vmap_range(cpu_buffer->reader_page->page, - buffer->subbuf_size + BUF_PAGE_HDR_SIZE); + rb_subbuf_size(buffer)); =20 rb_update_meta_page(cpu_buffer); =20 --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 ED81346EC8F; 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=1786711290; cv=none; b=G0cOGdz5/NTh0voHuLu4IjiyckL5RFt0WhVLlVFtarVSod6F6elup5LX3Gj/Ihlq/8BVeG2OlKwyjlZwEcZJ9d64WKZ0KZ1QSgyPbIScWln8aSIyeF/wwtVE6fzQ8KPWG4Nyn0fmX5QUtiTNnJsFElzJUXbPC/n8gvcGPLz1Ll0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711290; c=relaxed/simple; bh=csj+y7b87J57izW7dshInivp64LxKu4YFyOL3Nz+XhE=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=GWA74kAuZLjv9hAr6jY/jk13ylLWPl/iMR4ctWgFlA4IG6zDhOXMoYhIkXktCd6SdifnI8L+04MmDjLdddFxdlrc1t4uFzk5dCuXQgJvPiT7MvQzspmVpl+zRLRHgxRwT5mf+bEc0FkB6ncOt8cC70kPnhAk23705hCBiJk2KmE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PCLb+bbb; 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="PCLb+bbb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E977F1F00ACF; Fri, 14 Aug 2026 12:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786711284; bh=CDKIlCxcHcHVQcLzlXr/2oBd2JZPxlPkIoB88zc/hVY=; h=Date:From:To:Cc:Subject:References; b=PCLb+bbbeyz8Xe0mXoEgTeyXO5LEvKutrU5AL/9/qMWnNZrMKya3RTboD9kFZgrey bAZG2KITSUtNRs4IoPqZfDeP2ciyDG5Y/7r1m2XISbVtTd7aFcKhR+TxjvQUfu8SlV flpLxUD+CQCmbOwoji5QFUwqjTqu83/Zk5jzcPq1AebVCeUXnnNGtRBG9FYWFCsNJR SL8TvLTfcElhX9sgrY00KGy4W9Qo5770jj1/uIJG3yqer1Px/baNgm5wNOnOdeZLJw 691/Xm1f1mLCz4Ya8J5fTRmBeoLpHA0VTwQy3wO6f/9uSo2SBfWw95e1+j6SK2R/pg b7hpHiVckMMTg== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003zmm-1q5W; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124142.300131278@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:29 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , stable@vger.kernel.org, Sashiko , Vincent Donnefort Subject: [for-next][PATCH 6/9] ring-buffer: Fix subbuf resize race with ring_buffer_alloc_read_page() 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort ring_buffer_alloc_read_page() is racy with ring_buffer_subbuf_order_set, it can allocate a reader page with an outdated order. This isn't a big issue, the user can still re-allocate a new reader page and try again. However, what is more problematic is if the value of subbuf_order changes in the middle of ring_buffer_alloc_read_page(). In that case, bpage->order might not match the actual allocated memory. Use bpage->order for the allocation to prevent this race. Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260813131152.3589632-6-vdonnefort@google.c= om Fixes: bce761d75745 ("ring-buffer: Read and write to ring buffers with cust= om sub buffer size") Reported-by: Sashiko Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index e436793ed5c1..796c10319d6a 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -7018,7 +7018,7 @@ ring_buffer_alloc_read_page(struct trace_buffer *buff= er, int cpu) if (bpage->data) { rb_init_data_page(bpage->data); } else { - bpage->data =3D alloc_cpu_data(cpu, cpu_buffer->buffer->subbuf_order); + bpage->data =3D alloc_cpu_data(cpu, bpage->order); if (!bpage->data) { kfree(bpage); return ERR_PTR(-ENOMEM); --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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-Transfer-Encoding: quoted-printable 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.c= om 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; =20 unsigned int subbuf_order; - unsigned int max_data_size; }; =20 static __always_inline unsigned int rb_subbuf_size(struct trace_buffer *bu= ffer) @@ -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; } =20 +/** + * 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 ev= ent. + */ +static __always_inline unsigned int rb_subbuf_max_data_size(struct trace_b= uffer *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->arra= y[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 lon= g size, unsigned flags, buffer->subbuf_order =3D order; subbuf_size =3D (PAGE_SIZE << order); =20 - /* Max payload is buffer page size - header (8bytes) */ - buffer->max_data_size =3D rb_subbuf_capacity(buffer) - (sizeof(u32) * 2); - buffer->flags =3D flags; buffer->clock =3D trace_clock_local; buffer->reader_lock_key =3D 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 =3D RB_ADD_STAMP_ABSOLUTE; info.length +=3D 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 =3D 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; =20 - if (unlikely(length > buffer->max_data_size)) + if (unlikely(length > rb_subbuf_max_data_size(buffer))) goto out; =20 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; =20 - if (length > buffer->max_data_size) + if (length > rb_subbuf_max_data_size(buffer)) return -EBUSY; =20 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); =20 @@ -7941,7 +7955,7 @@ int ring_buffer_map_get_reader(struct trace_buffer *b= uffer, int cpu) * missed events, then record it there. */ commit =3D rb_page_size(reader); - if (rb_subbuf_capacity(buffer) - commit >=3D sizeof(missed_events)) { + if (rb_page_capacity(reader) - commit >=3D sizeof(missed_events)) { memcpy(&dpage->data[commit], &missed_events, sizeof(missed_events)); local_add(RB_MISSED_STORED, &dpage->commit); --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 216FC46D547 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=1786711290; cv=none; b=qwJj1BDO4F3SgIoeJZZMcHB6CGtlGz95pZs9wD+OU9/c0AIJvvIcqHyn1HCTsTGm/PQ75jv60W9A2pCadQGrsg4ihfapOrE3wajkbxmMqzlc9445hZu7QknyCrlTFhXHjJIkZlCr1O1g9iUEwpd9XaAXHJNXgO3D8sBcxNue2xo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711290; c=relaxed/simple; bh=pRp8Xay4LOsxnW3T3FkqZwK0Lw3xbqy1/PeoWNnCBjs=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=X4qkHYXKhGtZABR/aAzJfCxnifGRCU7t44AhmhjvWJElO2V31eWWV+4GIr7buioM/B3vZVTWAS3IiQsGL5vXj+l/ywagbcc7hrTwZNvgsZ1gbRH7qHF6b/F9avYmmJC2PcuO9OmH+OkBJGYdRhYkZXolCQ2fNie0/r4fw3KbnqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LiXPks3z; 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="LiXPks3z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 46EA01F00ADF; 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=iO9SbxqACJltPKSromtYYa9mBd4aG54z6rz/670OXAU=; h=Date:From:To:Cc:Subject:References; b=LiXPks3zwYTJIJw5FdVt82szQvEzSJys0MbTEoveda0fyU1M5xpVI8M+7gMXO/JIG t1o1Pq5fA9YYj9oGB198JfIYSebTyxAvaI471csJoozWPmvvNv3QudSYBbfz1DxcsI +ifnDEtytm1jf2Mxw84u1AjpnDFNHB+FoZTtTbC7YEhAfLEJWHscofY/zFZIIHepIx afCveWeaQ1XQQLP1FccB354GBgZbhys64kSGP5R6vuVvIxaKevbXKhggkx7X72tL/0 8LaARPL+cxrl+cdkb3tN9+Ynr0+zuKcslmFO+7fLJJsDjnrv9ducs7Rfvg+W+6SRPk 5KEn5K17Jvl1A== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003znn-3685; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124142.613014512@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:31 -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 8/9] ring-buffer: Remove trace_buffer::cpus 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort The 'cpus' field in struct trace_buffer became useless in commit 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing their allocation order"). Remove it Link: https://patch.msgid.link/20260813131152.3589632-9-vdonnefort@google.c= om Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2204a121ef7e..f75aafc755bd 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -572,7 +572,6 @@ struct ring_buffer_per_cpu { =20 struct trace_buffer { unsigned flags; - int cpus; atomic_t record_disabled; atomic_t resizing; cpumask_var_t cpumask; @@ -2796,7 +2795,6 @@ static struct trace_buffer *alloc_buffer(unsigned lon= g size, unsigned flags, init_irq_work(&buffer->irq_work.work, rb_wake_up_waiters); init_waitqueue_head(&buffer->irq_work.waiters); =20 - buffer->cpus =3D nr_cpu_ids; =20 bsize =3D sizeof(void *) * nr_cpu_ids; buffer->buffers =3D kzalloc(ALIGN(bsize, cache_line_size()), --=20 2.53.0 From nobody Tue Sep 29 00:30:46 2026 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 ABF2846EC95 for ; Fri, 14 Aug 2026 12:41:29 +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=1786711293; cv=none; b=k2/I9F56DVJsS3Z1GHLrtW1tR1Ywivw+T3KrP3prxEqdduiH9G3KHdMPt3lEf1f0Fvc1rFUxg6IP96j4Uf75qN2gT4xyCawFWSzuhasbFmDeurlyH62QP7IwGNXm/tVychT6C2Y25vf3XqXTyd+JceScDAbCDX6bAbiuqxxYka4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786711293; c=relaxed/simple; bh=SKhvFGVw4DdnbhHxAqTGiyJNC3LTiY5uW+1yta5aPDg=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=UKQcCYseDP8OKJDDVMOIFyYHwD/dYbagF1NyFWVhforYi7jUKD9/bhX66gP3pV2ZFYIX/TX3jSmlLH9nlSFFjbNzsgzJRS8ueNE8vPNQ0j8qFj1jpjqklvf4s57/pSW1BbXbgTHG6pMwRZUhL8Xg8iGEtr36qQQ5+gGKui/26ag= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SJAb37Fp; 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="SJAb37Fp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 795461F00ADE; 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=OXNPe/FGNewPuKZStiOfZOcX2GUk1kB2Duf3ynAArYo=; h=Date:From:To:Cc:Subject:References; b=SJAb37Fpor8MjAIRUA5hPW4IAFpEem4aU0TIAOa36RlWXJermj8TNaWGToMnBjBQt FzDn3gXUkHyVUY97sQuje77nX/l3NlDgFiWUEIg/uiKESot5vWH2jCHnxn8KTfOP9B FbWgnAF2Yi4WixJiuiqFJyVALUYrFQ4dUOY9EURRLFVhdLteOh3GAvzWfrjUNWmsOh Z5sNj7h0EuexKaPJqJlhEltyMjKcaEtnQfKyKNHiaStNhLAa304lV4kTKiH8NbtqDx aTUTZ9clfMUA/fdZDDgM/w+cxIhyof0Tw+2n007JZUm5xMQ2B0/vJxssjSyjzlwR0e r4HpVVjNayGHg== Received: from rostedt by gandalf with local (Exim 4.99.4) (envelope-from ) id 1wurEE-00000003zoI-3mnH; Fri, 14 Aug 2026 08:41:42 -0400 Message-ID: <20260814124142.757403608@kernel.org> User-Agent: quilt/0.69 Date: Fri, 14 Aug 2026 08:41:32 -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 9/9] ring-buffer: Remove ring_buffer_per_cpu::mapped 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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Vincent Donnefort ring_buffer_per_cpu::mapped tracks if a ring-buffer is either mapped by user-space or if it is a persistent buffer. We already have user_mapped for the former and ring_meta for the latter. Get rid of mapped and instead create rb_is_static(). A static ring-buffer cannot be resized, swapped or have its pages extracted. Link: https://patch.msgid.link/20260813131152.3589632-10-vdonnefort@google.= com Signed-off-by: Vincent Donnefort Signed-off-by: Steven Rostedt --- kernel/trace/ring_buffer.c | 45 ++++++++++++++------------------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index f75aafc755bd..5fc009edc1ec 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -514,7 +514,7 @@ struct ring_buffer_per_cpu { int cpu; atomic_t record_disabled; atomic_t resize_disabled; - struct trace_buffer *buffer; + struct trace_buffer *buffer; raw_spinlock_t reader_lock; /* serialize readers */ arch_spinlock_t lock; struct lock_class_key lock_key; @@ -552,7 +552,6 @@ struct ring_buffer_per_cpu { /* pages removed since last reset */ unsigned long pages_removed; =20 - unsigned int mapped; unsigned int user_mapped; /* user space mapping */ struct mutex mapping_lock; struct buffer_page **subbuf_ids; /* ID to subbuf VA */ @@ -648,6 +647,11 @@ unsigned long rb_subbuf_start(struct trace_buffer *buf= fer, unsigned long addr) return addr & ~((unsigned long)(rb_subbuf_size(buffer) - 1)); } =20 +static bool rb_is_static(struct ring_buffer_per_cpu *cpu_buffer) +{ + return cpu_buffer->user_mapped || cpu_buffer->remote || cpu_buffer->ring_= meta; +} + struct ring_buffer_iter { struct ring_buffer_per_cpu *cpu_buffer; unsigned long head; @@ -2578,7 +2582,6 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, l= ong nr_pages, int cpu) * Range mapped buffers have the same restrictions as memory * mapped ones do. */ - cpu_buffer->mapped =3D 1; cpu_buffer->ring_meta =3D rb_range_meta(buffer, nr_pages, cpu); bpage->page =3D rb_range_buffer(cpu_buffer, 0); if (!bpage->page) @@ -6667,12 +6670,11 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) rb_head_page_activate(cpu_buffer); cpu_buffer->pages_removed =3D 0; =20 - if (cpu_buffer->mapped) { - rb_update_meta_page(cpu_buffer); - if (cpu_buffer->ring_meta) { - struct ring_buffer_cpu_meta *meta =3D cpu_buffer->ring_meta; - meta->commit_buffer =3D meta->head_buffer; - } + rb_update_meta_page(cpu_buffer); + if (cpu_buffer->ring_meta) { + struct ring_buffer_cpu_meta *meta =3D cpu_buffer->ring_meta; + + meta->commit_buffer =3D meta->head_buffer; } } =20 @@ -6921,8 +6923,8 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_= a, cpu_buffer_a =3D buffer_a->buffers[cpu]; cpu_buffer_b =3D buffer_b->buffers[cpu]; =20 - /* It's up to the callers to not try to swap mapped buffers */ - if (WARN_ON_ONCE(cpu_buffer_a->mapped || cpu_buffer_b->mapped)) + /* It's up to the callers to not try to swap static buffers */ + if (WARN_ON_ONCE(rb_is_static(cpu_buffer_a) || rb_is_static(cpu_buffer_b)= )) return -EBUSY; =20 /* At least make sure the two buffers are somewhat the same */ @@ -7134,7 +7136,6 @@ int ring_buffer_read_page(struct trace_buffer *buffer, unsigned int size; unsigned int read; u64 save_timestamp; - bool force_memcpy; =20 if (!cpumask_test_cpu(cpu, buffer->cpumask)) return -1; @@ -7173,8 +7174,6 @@ int ring_buffer_read_page(struct trace_buffer *buffer, /* Check if any events were dropped */ missed_events =3D cpu_buffer->lost_events; =20 - force_memcpy =3D cpu_buffer->mapped || cpu_buffer->remote; - /* * If this page has been partially read or * if len is not big enough to read the rest of the page or @@ -7184,7 +7183,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer, */ if (read || (len < (size - read)) || cpu_buffer->reader_page =3D=3D cpu_buffer->commit_page || - force_memcpy) { + rb_is_static(cpu_buffer)) { struct buffer_data_page *rpage =3D cpu_buffer->reader_page->page; unsigned int rpos =3D read; unsigned int pos =3D 0; @@ -7633,11 +7632,7 @@ static int __rb_inc_dec_mapped(struct ring_buffer_pe= r_cpu *cpu_buffer, =20 lockdep_assert_held(&cpu_buffer->mapping_lock); =20 - /* mapped is always greater or equal to user_mapped */ - if (WARN_ON(cpu_buffer->mapped < cpu_buffer->user_mapped)) - return -EINVAL; - - if (inc && cpu_buffer->mapped =3D=3D UINT_MAX) + if (inc && cpu_buffer->user_mapped =3D=3D UINT_MAX) return -EBUSY; =20 if (WARN_ON(!inc && cpu_buffer->user_mapped =3D=3D 0)) @@ -7646,13 +7641,10 @@ static int __rb_inc_dec_mapped(struct ring_buffer_p= er_cpu *cpu_buffer, mutex_lock(&cpu_buffer->buffer->mutex); raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); =20 - if (inc) { + if (inc) cpu_buffer->user_mapped++; - cpu_buffer->mapped++; - } else { + else cpu_buffer->user_mapped--; - cpu_buffer->mapped--; - } =20 raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); mutex_unlock(&cpu_buffer->buffer->mutex); @@ -7824,7 +7816,6 @@ int ring_buffer_map(struct trace_buffer *buffer, int = cpu, if (!err) { raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); /* This is the first time it is mapped by user */ - cpu_buffer->mapped++; cpu_buffer->user_mapped =3D 1; raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); } else { @@ -7881,8 +7872,6 @@ int ring_buffer_unmap(struct trace_buffer *buffer, in= t cpu) raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); =20 /* This is the last user space mapping */ - if (!WARN_ON_ONCE(cpu_buffer->mapped < cpu_buffer->user_mapped)) - cpu_buffer->mapped--; cpu_buffer->user_mapped =3D 0; =20 raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); --=20 2.53.0