From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4637947CA7C for ; Thu, 13 Aug 2026 13:11:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626719; cv=none; b=VhCRu9Vs+RxadvXMN0cOewBNWDu8sct4ZJZz0CwtRn5NMWJ7HCYvKvNMqMZTMVVTS3BwPPupTYNwwu/aPiY6yF6J0nmcbaZ5Pl7k98aRgQmWDset4VXlXdsjGPup4rPTmwMi6V7ocMheCCtpFvxYm3uPcVEySwecC5CKv2AGf4s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626719; c=relaxed/simple; bh=RnyxOYCwhQgTKJ1d8W1Pm0f+ZLeYf+TecB/avfsb4Jk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UjFpatzxKJfpDkfTzvd0gXE50as0ectKTMWJ2FxSYydrOfDf0SM3jZte5szRviSkYUxMiSQXJvIvQEysvbrN6psRtqllfmsOWBLuh2Gngq/FLk0KStB8KbPYPALXdPWMnyqGW7Vw5H7GUxJh6gYANkWzgj/EmnuMUIMW+db1168= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=sGHR2iyn; arc=none smtp.client-ip=209.85.128.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="sGHR2iyn" Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-496b6f97676so22174625e9.2 for ; Thu, 13 Aug 2026 06:11:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626716; x=1787231516; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mYJnf32SraedkkQAhf1lNG9n6MN2rsucTWkpU2qB8LU=; b=sGHR2iynkyES4Xrn8XksWr32EK3390m5CYr3Unl0uI9YG2YUhaiZTGXe1bUWB5B5vI 2p6FV38iRtAfv/uCFYte1HZp043bSyqSIbGYYGyIfFmiqoFQmVqoGkMcePzZZ82SBQL0 oemJDA8PIqjqOXWZqeI6M1ZydItRtZ66lpCrtBCZGdOkwKxvwihB9TjiiJZHACvzgzNn YbHj84Hfl1uhVSRKpSy2g/HO4svUHRBvB7F4b4oRAwsW31L5qdDkeNNO0ZuTk2s4ejPG Q48bpZRlCAJ9oDS7MNv6xo2MuKy8bodi3aEmaGdyyt5Eub5cE7COITg1HHPrHv+LMTHE Pvsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626716; x=1787231516; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mYJnf32SraedkkQAhf1lNG9n6MN2rsucTWkpU2qB8LU=; b=cUDVbNWThbx5sHMPb0MR0h+kImiNUgH7cY9xf7Sp7AFrb4UOBZm7Zc1QEpSbf/P2e5 Tx05HFIn1Vp6aZa+bgWGnicNi7GWguULr5nECFqiGNVDq1EJ3ekoGa55WEaNyLPw8cym lMoBDbu7ADWTS+neZvTtNiCZTezl9jWbfzskA6iDpGDLraRsBXNUBGyjf+FQAiHCcfWS e9bhVOVmir1B6WsXfkEh+/KiApPFTCjAkuXEjoF3W2c36UT2Rna1854IT/a/IRVbvupl NAE5GUgjgVaKxIW8fKossEgfGrzxGDjzlmVwJ1ffdfLlhQFV1Dploy7ayU7Zs08CeATs mHWA== X-Forwarded-Encrypted: i=1; AHgh+Rptyf7gnd3D5PZ3lob05AFkHBEc5rNcXwlauWt6UOpoM4kJK3KJIt5JbbkxmvzBuo/qZpxNZruA93c7beo=@vger.kernel.org X-Gm-Message-State: AOJu0YwYVNlh5bFvAYvUQ1x4BSTXrUN1fm/EcNxCnBluX6fwakXBOa4u AOJhMSNvqzBA9L6LU+sTHakdI3AJvnuxif7ckEJIX8WvzMZu4otaG1or5LAMCWiGH1Hi8AuX4QP Decl7ufW+p+ocgWQccci8rw== X-Received: from wmbds12.prod.google.com ([2002:a05:600c:628c:b0:493:bccc:32b3]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1394:b0:499:51cc:4e57 with SMTP id 5b1f17b1804b1-49982158b47mr55151435e9.0.1786626716251; Thu, 13 Aug 2026 06:11:56 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:43 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-2-vdonnefort@google.com> Subject: [PATCH v5 01/10] ring-buffer: Free cpu_buffer::free_page with subbuf_order From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort , Sashiko Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page= ") Reported-by: Sashiko Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2667992f0aa2..a3d28b2e2c94 100644 Reviewed-by: Masami Hiramatsu (Google) --- 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96CEB47D466 for ; Thu, 13 Aug 2026 13:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626721; cv=none; b=H+GUEVirWViRvddyJhu7SePi9L8Q+DExKNJKXlLj6RbHaPl/ryaxA64jXQlXM1fA7GBshDKzlwHRK21ONPZ4rU2bha+dj3SnF1gXmznf8XWK4mUOrUJiGsjXP5aih+Sq5OuCEzoWdKrEZ5Mdzr93UOmoEF1lLeYmdu+8uRszNxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626721; c=relaxed/simple; bh=tujv8RbwhrzNmaNzcMSZ3HxX1V8/EjqjdRXAbYVULcE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=K4IbF5nXr5DRHePDMPCdCuYF03NsL/SZ88I3PZ2tyvh/n/5B1BGDtihwhgUFLAOlQroD4Iv5nSWYO+QeS7cy4LKvGu5ihGAjgayAuC1ThlsJeX1AO4A/70KBZ+A4+sp1FYqyMwXCJOKQJlAIhqImEOBiEGi7kLDwj0BVKkewLnE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fi0uHD1j; arc=none smtp.client-ip=209.85.128.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fi0uHD1j" Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4955d314945so3646295e9.0 for ; Thu, 13 Aug 2026 06:11:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626718; x=1787231518; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=SwGJJ+A9z3NJgDEvUS+8UxqlJZhSVXFUJkzDSX5uv20=; b=fi0uHD1jzMz8ceNNeT0Ll8lUKzomGviB1cqowK0+s8iDYNPndAcyfdFrGUbV9gm24W CRwaeQU6nGh4TjPAruwcw+62VsZrbKZjhGBnvsBQpKjZCFKwDVezQ1cj1XCL+g7xuZ7i Axy5sYPB5NPepLOY5zHTfgZ8g3MLmqK5ZMoiLauVQFBoATs5bDa26RvAdNfoPnctaHXS YRh214zeo7mjqqbdkaBlGkwQNjrh7Gwh3zBGfmgzpsevIuASBolk0uPMpdByAc8F7YWB dZQwuvw7lheMsEd7TxBRsQhFwwx7ilHFq1s5KAX3UNfOq74A15i5S6BUco8yAvi5O684 bxIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626718; x=1787231518; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SwGJJ+A9z3NJgDEvUS+8UxqlJZhSVXFUJkzDSX5uv20=; b=ixuYF5jNq1MYPAueq9WDivAj3qSTUMZ46oZMqIanwTmuzGKS4ipep+ovt91nSYH791 H13If2BxoiAg1uUgGZPq+YC6G8u7yAuAymj7hpFTXD71IJj+0ScQo8y5ONcCIdcx1U4I lFAAO/57QNABlIUp8yF5Kn37y3OcEpYY/LvoPiCqz+AZp/8FAUb74eMwxmGh3xUW3dS4 HcnwfhZg/r5ihgv/tQnq70/fqSYJfTHfYhA+HZFLSiKTxktfXUNh5r7bzjI670zsv3sG nEOz8U9Pvxxa4p78DJp5BlQTroMhxOLMg/2rre5MepStixbf/QcoH2+zEYzCiGTShIiY jxlg== X-Forwarded-Encrypted: i=1; AHgh+RqcHgROSALZe8G3X2E2WTOcRw1yJaACMat8v/EaXXVBFjdZMd0/bmORInFEA+HAG1XbcFglzEGuvsIhDeY=@vger.kernel.org X-Gm-Message-State: AOJu0YyxgH8KHnQi38mmSJ2VhBpkNSyMVOfUH/YpjGBuzBIiM6xSoLwV 4V3zLbXjAcEwyYsNd+Ch9elhwILwqQ+MFNMhXb6mPTK9XfbnMZJP6Xp/M1yjyXqX/I368725T6f nXAfyMVi/EM2uGTfdJr71mQ== X-Received: from wmrk17.prod.google.com ([2002:a05:600c:b51:b0:493:f79d:63cc]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3506:b0:499:4892:d022 with SMTP id 5b1f17b1804b1-499821c5b19mr62829445e9.8.1786626717503; Thu, 13 Aug 2026 06:11:57 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:44 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-3-vdonnefort@google.com> Subject: [PATCH v5 02/10] ring-buffer: Hold cpu_buffer::lock when resizing a subbuf From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort , Sashiko Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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(). Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Reported-by: Sashiko Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index a3d28b2e2c94..ec4f5a0c93e8 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3177A47CA9E for ; Thu, 13 Aug 2026 13:12:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626727; cv=none; b=nnPTPuSjmNjhxr+Jmhp/fHti4L/2WXsMIJKNw3PEm83aB9ztW+oqK94dG4yD1GZRjWazfi53fBXXBzJ23SmtTEidesjZAvy8X0/b6nmCElsrqSuPJRJDtaasRcW8Fft5bfqn+HkxLom9FKTjC1y5A423oICUDjq14sMjvjPmf9Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626727; c=relaxed/simple; bh=lKMK0MfkDIfSeWvC4wCnKzYYxJQHB+XsLd1+t3UjMIw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Tfo24W2gbrC5lWYogTs+8SfY91vGhQ5qa2+dYBQYJu3Rfb6DpUnpf9dHkkksm5w25g0v5dTo9Hi+GDFGyPfMUigynQbX1k+EPza6P7yDA7kkPKf57rIcQsyszUkqlQSLn4iyN52v6LtorQKWEwwfsBMtlmzoHtyqAnzlAXA6zJs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nBe93dNL; arc=none smtp.client-ip=209.85.128.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nBe93dNL" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4957287363bso5142155e9.0 for ; Thu, 13 Aug 2026 06:12:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626719; x=1787231519; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=lGl2apXV5AfDfhGS4nKvuLOa4mDzXiM6MBzztIw4crA=; b=nBe93dNLmKC4MkCYH0jzf1JNJHc21nuXJdDAfvP6O+Q0BmulnyidLdq4qXk2ofcGja xuWTJKYEiiFgp0pmBNQm96rbiKIJjW2MJvhLyUVlMr8x/fSi3uIVI4x9nee7u5aQFEEv JVOAuV/aiD6uq4vQChgjNVWOtTsrxtZqkHRkYrBei3CX/0VxuPqsgQdL0YpTf67n5MZW H41OAOWk4NIaf1yN0t1GrntxFMjV3RtAht9In3LU5Cku3mkk4SBpR+9Tv6aXissZofek WAhFL6E8jJK6En7GxqNvIb9gFtsLVCHLgNvTDiY243lwwY78Fly7U0c1nqgbnX6SNIdV ElYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626719; x=1787231519; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lGl2apXV5AfDfhGS4nKvuLOa4mDzXiM6MBzztIw4crA=; b=mvBpgOJgp/Q6wdxOTPzQYSjGeHgzJOvhibZ5sLiQlESkPEYUB8x+w812NQ6wpq+/9x jcRjILMqttojQloIYTvo1BSPdmMZ5mqDpkajoZnkivTClNRkeG0m3RPEln/U6XM/qU9T Kk8ETWLU+pI4bE3RFjw945psn11eGU6xzLgVNNH9OGjXKL7tMyBm5T4oddJOc1coyn0W RdjUzBa0dPy8A0V6LNKZ+IYl5G1CDBniFBE/2+j961IPoOC9r7pfzztEScg2vUkgcma4 L87eyczNHOzRSLFHVi8J69EMUmLEq0J1CUiKRF4NpMf/OtgUM4Nr/5UmfdTkNlM2ROW0 v30A== X-Forwarded-Encrypted: i=1; AHgh+Rrpd7zRFaMbrupDcdIWTNF3/cqVOS5DfV7wt26wYEpaJVpM+6FQds9LxK/3oK+kWasV8+f5lD5UulnjLsw=@vger.kernel.org X-Gm-Message-State: AOJu0YyqMVC+wQpU+X7jEoAH1SP9RO9VN3tv4YMEH0PFF9ktsQHsvaT1 7PNTaWZJ+WsvRc6EZ6eDkU6/4BVvEoduWrBz0MqV3nMfIMJ8id9zFgFtpEY+vhFWRVvBASh8cSZ NqrdUIZcG6E2OhmP8Nj86hg== X-Received: from wmbje11.prod.google.com ([2002:a05:600c:1f8b:b0:495:779a:eb54]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:470d:b0:499:484a:81d0 with SMTP id 5b1f17b1804b1-499821f1ebbmr58742035e9.9.1786626718832; Thu, 13 Aug 2026 06:11:58 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:45 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-4-vdonnefort@google.com> Subject: [PATCH v5 03/10] ring-buffer: Make cpu_buffer::free_page a buffer_data_read_page From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index ec4f5a0c93e8..b6fa258aafe2 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 647EF47D94E for ; Thu, 13 Aug 2026 13:12:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; cv=none; b=K2yzDxWuHwbohAYkIF2irgtGVRwOnBtuwAGVqeef1Qo7xdx/GBZJCnNEQLacwLttpYAWLup/FQ6xXUQ9Km6nST5p21I1jVnZFu9/gJYmlF35YhIIVNyOFXoId475EKR7ejPUEuO+s0589Bo3/VWiROgCmP4SybPl8fjPNbS4T/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; c=relaxed/simple; bh=ajIoEyfb1D7FgWU035XmHhc/950sWbSJvTdKCHSsWDg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lvpftiOl4gmNmzNfwIOHFmW+dYsK0BFfGCUdobY+qwUbOq0in8mUSYtQBh0WzIyRVUr9NoyBxZEevPB4nrc93bAxq8Lhdo7Pvh64KhjrnicZb6JD5vTeIP8L4q7wq7w3thha8cxjD9ywIF3uIDUVGOLQbkI7Z0PRl/teNZD3R1I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=mGgqC/20; arc=none smtp.client-ip=209.85.128.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="mGgqC/20" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4955843c6cdso20057485e9.1 for ; Thu, 13 Aug 2026 06:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626721; x=1787231521; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=i381zhUNdDXU/dyA74ABOy7xndTbTrQQoiRpAn1jHa8=; b=mGgqC/20cZuSiJT+GFvvea1khgeMxikfU5wtntnYwePk35kfJ69TzoaA1lgCeeI4hm cDfTe0/1LZjSt2jg+CpzYi26YgYCjV2aFE+DFG5ED/ixxfNJt5roJbIONMvoL+XtBEbM 9upU0qFvZtpqDBX0p7tjLaYabA7KG7Xuo2HDAGukM3wtOQI6aJERDAA8dejJEKLfXDBE KyO6F35QncPgZnIJek3/wjVsUE1LZQwt1YV+DAG0j3603rGyZalP8d0K0PMibzM/4LuS wzGPan6laeV+XN74PAQkX9HWFZLy/g0+OIGzFsstKX2dV6dKMSH246HiWXup/wiKM+77 BreA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626721; x=1787231521; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=i381zhUNdDXU/dyA74ABOy7xndTbTrQQoiRpAn1jHa8=; b=G01zHQizQOEYyJDT1l6BUFhc85gRw8gFfIvXOxUBR9jojcCQMbaMdMuGb8OkZnLJbl u+biR/ZLiQqaVexdN45EcpWTtPRNHyFltzNJI3gl2rpnbx1P/sBH3PB5uwByHCkAmTXs sDJI/zOkeARdSCv3xTq4Bg4HMyZjPPSSmAJZNZFqtzgtS1vQqacyfyGSCp5dSy/0OWk8 PRWsWbK9hnrnJR4FEClPWTLdupzR3ZRsJted40gSF7HXYz0GgvWV7S9zTcZMtDO0LWiN n1A7BIpiPnPybm0FP4KOiIISYDNXixtcmZ3KOHBIYM2hAMknGj8GZXCPctFitQ9VbLHO qWcA== X-Forwarded-Encrypted: i=1; AHgh+RpwWbuJk4NVCz6BIG2GvXlNstFnwCKALLDVDYyyCEtQ5I8RPp5+hspRrawl1nlWKjQ64BG00gbHq+RaqA4=@vger.kernel.org X-Gm-Message-State: AOJu0YybSQOzg0nfzMUxS9hqUM4B3gkbTNHyVboigkLkOiI09wRuOxDz rGVLMET3CsubsJ4ohmHnjQACg8M4oIo68s1+P//Zw2GTI+LUtLYXxVTc4lfLJZgc3kUwMIVpx+8 aYLMdXMo0Y764+OjTuJgb6Q== X-Received: from wmij20.prod.google.com ([2002:a05:600c:4114:b0:495:5b3d:ed8e]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1993:b0:490:c6c2:52 with SMTP id 5b1f17b1804b1-49982187725mr57630225e9.3.1786626720257; Thu, 13 Aug 2026 06:12:00 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:46 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-5-vdonnefort@google.com> Subject: [PATCH v5 04/10] ring-buffer: Fix subbuf resize race with ring buffer readers From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort , Sashiko Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page= ") Reported-by: Sashiko Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index b6fa258aafe2..ec520c72124e 100644 Acked-by: Masami Hiramatsu (Google) --- 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 (!iter) + return NULL; =20 if (!cpumask_test_cpu(cpu, buffer->cpumask)) return NULL; =20 - iter =3D kzalloc_obj(*iter, flags); - if (!iter) - return NULL; - - /* 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); - return NULL; - } - 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B89947CA94 for ; Thu, 13 Aug 2026 13:12:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; cv=none; b=JYFl786Wa9Egu6WkyEhVJZtQ+1PRWv9mTck+hxz4sagWOB8KoSJsJA/X53yU6wTl5oPVhFhQ77upzZ7oR/3G/T7dHejZZwpXrkj1+WDqdpygco3YXv1SJWGqQS3+zyZQk5MtgTEI9P+wXXg+7uWKBp52QlSJdbBiHwtdDYLKzI4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; c=relaxed/simple; bh=GDfudVeqUNJDDsQyGfFgyXJRGIi8nBlg1DBu2jtXP/E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lWjNcAsHfQu31ChWlX3n6dw2KPcHQhaCXQLQz84veGd7JOzLfc9vMgYEIBDq4+1UYhvD83OHXckeBbQhg5W4sWXzgdvD04Iq2+lTyXsBWusuLcnNc48rv9Lw2J5cYDlf/75mOCL9J6bgZiJHE2UQl5Qpk8l/pOLXSsxxDCpVob8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=mHMfr5fi; arc=none smtp.client-ip=209.85.128.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="mHMfr5fi" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4954dcd6131so20151215e9.3 for ; Thu, 13 Aug 2026 06:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626721; x=1787231521; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ElOrjdWXgbGM4dlqT5NvceC6FVfQO/iUb68RR1af7yw=; b=mHMfr5fiy166N9mdFF5R6g9RIUOjYQHmrTr92I/z/APZr7HPOOz6Xq9OOfgQK82Bf9 9Jn0ROCk0M7b3Xc037ITsUuYDCFfyVk7JRx+3qCdRtLVUiWGGyFUxg7oXBH1bN3yelFM 1pphcPqWf5C2fKz2FmKCZg6gBhF+KIJMBv8katU1sydvNu77tB0MZRaQJdzcHo0BxT43 +4dntL/PvqHeaFOykKtQXqJMPgS8XaSI9//sJbNVXatlhjEcDX7cXBTryp/uJcze5VjT zsq808fFNtzLfBzdSC5HfCXdvRUWehgbeSJ1kL3hUnFDKcuXXaMhMXuDjRvgph2qDHAY dFkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626721; x=1787231521; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ElOrjdWXgbGM4dlqT5NvceC6FVfQO/iUb68RR1af7yw=; b=aucpX+ayMdd5OeOsY6Ne9/A4hYyqq1fTm7kQgtZOTTg8Iah/dFNK7bhmpjrtGsNts7 HC9T44fSbLsxNz2ZiV4oJCNMxeCqqpOgrjb9Aza+dkrJ9IvXG/D6YS0hhOWHy8QkpZXY 3GLFxsRYoLZqX1vENZcrUmQmzSvkMXePruKpk2PFSKs+T0fooIBw3+xpRXj1zz9MeLFZ yfB5Yt5GiPR/g3GOszRP84iaXZCRusTB3X1qFtOFIeCX2YV60F2GcG3L+FVBXmKHRver ZQjOCnoijDs1mbZBOn7G4Q4Uz97q4SLbyTxFLj7/hnXxdfmDO19GFIANXYfOTxh2D/Ms MBGg== X-Forwarded-Encrypted: i=1; AHgh+Rq81KRfuMcf7wD5RcXN/qbjHBI6uld9hNSz999yHOnaavxse7Q7AcYdE1iQIFvoU2RzjdKaYWON12e8l+Q=@vger.kernel.org X-Gm-Message-State: AOJu0YwTvVgo8RpIVLLDhRmwUZxxI+D48TdqnP4ojdJdkrBrJQ/yHfxb 2/9iHE1hpwsdbFT9Yxm2p7wyvfPVtaVUwX0UfAOBSsT1BlnBk3lcUA8LYf1GZpAK92f3/fdC+Rf ORga3fy35HSmOGMNcW8yFdg== X-Received: from wmbf15.prod.google.com ([2002:a05:600c:594f:b0:499:4fc8:f8eb]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1da8:b0:499:726b:7375 with SMTP id 5b1f17b1804b1-499821c3119mr86065855e9.14.1786626721227; Thu, 13 Aug 2026 06:12:01 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:47 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-6-vdonnefort@google.com> Subject: [PATCH v5 05/10] ring-buffer: Fix subbuf resize race with ring_buffer_alloc_read_page() From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort , Sashiko Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Fixes: bce761d75745 ("ring-buffer: Read and write to ring buffers with cust= om sub buffer size") Reported-by: Sashiko Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index ec520c72124e..a00ab8a9cbd0 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C16D147D466 for ; Thu, 13 Aug 2026 13:12:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; cv=none; b=KeOLXU5QF93fATIv1CxO1hhsxOF+5r4Hc2gXg/iIB10nWyJKJPgs4U14LJQwlU6x6z3bE0I29WT/B1ATyyRjdkSldu7nHisZyTSgBfGKdwoIQ0qVo2kR+RU0YxogAv7txSEZ/BLSptwLyASih1Ne/7IdmYbtrkLTY+lfNAfsr+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626726; c=relaxed/simple; bh=DsYs08DZ8hUFmwet/nRRalkwUO3cPuWy/3juGUkblz4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TLYCTGrpjUztPBLtJZPxorwHYklqBbE1n+X0Y8KiKsFaviz8qq7GOs/iLaDsJxi395OQ7pwHyIgWSLLwBWHyTJlRsb+JMNuR07otd54Ns+/+mKJPvWrYc13+AaJpRNvaCMCvpEtfgDY3G5rl90hD8IzL3dPmee/bNK/79UZU1oM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=D1sH0juu; arc=none smtp.client-ip=209.85.128.69 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="D1sH0juu" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4957287363bso5142565e9.0 for ; Thu, 13 Aug 2026 06:12:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626723; x=1787231523; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=twJkNHd+AncbDm6mXlA6aGD5++EB4AgkIIRMWTAGPMM=; b=D1sH0juuVHJ69FGOL2TY1ckgLZ0zb5Kg7EWK+6qmwBcQyAfOVMkdD1lOv2QpyyGZCR 6A751W1KWAfD6WWJ3wFTyDeQ8sJQFMUG1qKL3ilHmc4MQOA1R4OCxQm1Q883sKGKCt0I Mn9Z+OyqJc92XasJPd8GtuZw2Sur5iLu2b4tgNvSuW+F3yxDWEgdeY0d0ZK4eN1WILw6 ji12hQi+5KP4dbrCMj24dDC51r6fcArZEb3UBbWTSbu6d9kx79d4sKiEvT2IuRVxn53w dwB6AByL+H/2ahSG14rc/gMtabkGRfuhVT7yWT9UBnF///BUyxpS8Sx9GMoLudcttQi8 XNlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626723; x=1787231523; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=twJkNHd+AncbDm6mXlA6aGD5++EB4AgkIIRMWTAGPMM=; b=nKQr0R7TxrS+xl01rkTJ4CDtAF9fv0X8Eaf7W1LNv6S4os7XiNX6HvSwhvBmSG7bxh RYYR1xQ501TfKyAn6gCAEV3hwrZa/qGiNyd4Fnepe7tlTIofz6qxuvt9uQSKIm+XVuYc UJVdUGmk/7gsNAQ5u+GHy14dmoo2TaJuUQwBqRBYJsIQKiJhKGIPhEfpVf7GF+aGpawe bggRYk5REpVQBnKOEJGP5PNNKFPGzaDlKaKmUcPGKGgNbBe0jOSUg6oOKlZR0aBu9qJj e0+PNhzR+84ODMMdem386D01FGQ5CF7t5qzxkKkBky/kxpRDDm2BEYbmNeRFd1h/5XVq 0Y7g== X-Forwarded-Encrypted: i=1; AHgh+RoqrmVtz18VokfqooGBvGadrbKPlRKBqi0HlMvKN6SiTGKuqPqmVh4bfEEM8l91KLDVJJzQikaEDJ7ydEk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5mhBHTRSzb7AaO669a8g9ox2C6EuNnqvtIS6huTewnzaVBomG QjOwrADvYGU9b2y3c2ggPLEva+ctYeeJFrw7faHAJwwxVOuXZQ2ZyCcD9Q0ADPtAxLM9UTp/Aps U1JCcwTvUG3xGHF7kLIcjcQ== X-Received: from wmbgw9.prod.google.com ([2002:a05:600c:8509:b0:490:b1af:78f3]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4585:b0:499:5b04:6920 with SMTP id 5b1f17b1804b1-499821fe9ecmr54599945e9.16.1786626722527; Thu, 13 Aug 2026 06:12:02 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:48 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-7-vdonnefort@google.com> Subject: [PATCH v5 06/10] tracing: Fix subbuf resize races with trace_pipe_raw readers From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Concurrent subbuffer resizes may crash trace_pipe_raw readers or leak uninitialized memory to userspace due to stale size values. Modify ring_buffer_alloc_read_page() to let it handle the resizing of a previous buffer_data_read_page if necessary and add a new ring_buffer_read_page_size() which enable ring-buffer users to not use the racy ring_buffer_subbuf_size_get(). This makes the spare_size member of ftrace_buffer_info redundant. Use those functions in trace_pipe_raw readers and handle in both the case where the subbuf order is modified in the middle of the read. Fixes: bce761d75745 ("ring-buffer: Read and write to ring buffers with cust= om sub buffer size") Signed-off-by: Vincent Donnefort diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 0670742b2d60..fafbeb327037 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -219,13 +219,15 @@ size_t ring_buffer_nr_dirty_pages(struct trace_buffer= *buffer, int cpu); =20 struct buffer_data_read_page; struct buffer_data_read_page * -ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu); +ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu, + struct buffer_data_read_page *prev); void ring_buffer_free_read_page(struct trace_buffer *buffer, int cpu, struct buffer_data_read_page *page); int ring_buffer_read_page(struct trace_buffer *buffer, struct buffer_data_read_page *data_page, size_t len, int cpu, int full); void *ring_buffer_read_page_data(struct buffer_data_read_page *page); +unsigned int ring_buffer_read_page_size(struct buffer_data_read_page *page= ); =20 struct trace_seq; =20 diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index a00ab8a9cbd0..83292d90599e 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -6976,34 +6976,52 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); * ring_buffer_alloc_read_page - allocate a page to read from buffer * @buffer: the buffer to allocate for. * @cpu: the cpu buffer to allocate. + * @prev: The previous page to be repurposed (can be NULL). * - * This function is used in conjunction with ring_buffer_read_page. + * This function is used in conjunction with ring_buffer_read_page(). * When reading a full page from the ring buffer, these functions * can be used to speed up the process. The calling function should * allocate a few pages first with this function. Then when it * needs to get pages from the ring buffer, it passes the result - * of this function into ring_buffer_read_page, which will swap + * of this function into ring_buffer_read_page(), which will swap * the page that was allocated, with the read page of the buffer. * + * If @prev is provided, and it has a different order than the current + * subbuffer order, its payload will be freed and re-allocated. If it + * already matches the order, it is simply returned. + * * Returns: * The page allocated, or ERR_PTR */ -struct buffer_data_read_page * -ring_buffer_alloc_read_page(struct trace_buffer *buffer, int cpu) +struct buffer_data_read_page *ring_buffer_alloc_read_page(struct trace_buf= fer *buffer, int cpu, + struct buffer_data_read_page *prev) { struct ring_buffer_per_cpu *cpu_buffer; - struct buffer_data_read_page *bpage =3D NULL; + struct buffer_data_read_page *bpage; unsigned long flags; + unsigned int order; =20 if (!cpumask_test_cpu(cpu, buffer->cpumask)) return ERR_PTR(-ENODEV); =20 - bpage =3D kzalloc_obj(*bpage); - if (!bpage) - return ERR_PTR(-ENOMEM); + order =3D buffer->subbuf_order; =20 - bpage->order =3D buffer->subbuf_order; + if (prev && prev->order =3D=3D order) { + return prev; + } else if (prev) { + /* We can reuse prev, but we discard the payload */ + free_pages((unsigned long)prev->data, prev->order); + prev->data =3D NULL; + bpage =3D prev; + } else { + bpage =3D kzalloc_obj(*bpage); + if (!bpage) + return ERR_PTR(-ENOMEM); + } + + bpage->order =3D order; cpu_buffer =3D buffer->buffers[cpu]; + local_irq_save(flags); arch_spin_lock(&cpu_buffer->lock); =20 @@ -7020,7 +7038,9 @@ ring_buffer_alloc_read_page(struct trace_buffer *buff= er, int cpu) } else { bpage->data =3D alloc_cpu_data(cpu, bpage->order); if (!bpage->data) { - kfree(bpage); + if (!prev) + kfree(bpage); + return ERR_PTR(-ENOMEM); } } @@ -7041,13 +7061,22 @@ void ring_buffer_free_read_page(struct trace_buffer= *buffer, int cpu, struct buffer_data_read_page *data_page) { struct ring_buffer_per_cpu *cpu_buffer; - struct buffer_data_page *dpage =3D data_page->data; - struct page *page =3D virt_to_page(dpage); + struct buffer_data_page *dpage; unsigned long flags; + struct page *page; =20 if (!buffer || !buffer->buffers || !buffer->buffers[cpu]) return; =20 + if (!data_page) + return; + + dpage =3D data_page->data; + if (!dpage) + goto out; + + page =3D virt_to_page(dpage); + cpu_buffer =3D buffer->buffers[cpu]; =20 /* @@ -7312,6 +7341,18 @@ void *ring_buffer_read_page_data(struct buffer_data_= read_page *page) } EXPORT_SYMBOL_GPL(ring_buffer_read_page_data); =20 +/** + * ring_buffer_read_page_size - get size of the read page. + * @page: the page to get the size from + * + * Returns size of the page in bytes. + */ +unsigned int ring_buffer_read_page_size(struct buffer_data_read_page *page) +{ + return PAGE_SIZE << page->order; +} +EXPORT_SYMBOL_GPL(ring_buffer_read_page_size); + /** * ring_buffer_subbuf_size_get - get size of the sub buffer. * @buffer: the buffer to get the sub buffer size from diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffe= r_benchmark.c index 593e3b59e42e..39b7dee21ed3 100644 --- a/kernel/trace/ring_buffer_benchmark.c +++ b/kernel/trace/ring_buffer_benchmark.c @@ -114,7 +114,7 @@ static enum event_status read_page(int cpu) int inc; int i; =20 - bpage =3D ring_buffer_alloc_read_page(buffer, cpu); + bpage =3D ring_buffer_alloc_read_page(buffer, cpu, NULL); if (IS_ERR(bpage)) return EVENT_DROPPED; =20 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 395238b2b715..f9399f391ac6 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -7080,8 +7080,8 @@ ssize_t tracing_buffers_read(struct file *filp, char = __user *ubuf, { struct ftrace_buffer_info *info =3D filp->private_data; struct trace_iterator *iter =3D &info->iter; - void *trace_data; - int page_size; + void *trace_data, *prev_spare; + unsigned int spare_size; ssize_t ret =3D 0; ssize_t size; =20 @@ -7091,36 +7091,30 @@ ssize_t tracing_buffers_read(struct file *filp, cha= r __user *ubuf, if (iter->snapshot && tracer_uses_snapshot(iter->tr->current_trace)) return -EBUSY; =20 - page_size =3D ring_buffer_subbuf_size_get(iter->array_buffer->buffer); +again: + prev_spare =3D info->spare; + if (prev_spare) { + spare_size =3D ring_buffer_read_page_size(info->spare); =20 - /* Make sure the spare matches the current sub buffer size */ - if (info->spare) { - if (page_size !=3D info->spare_size) { - ring_buffer_free_read_page(iter->array_buffer->buffer, - info->spare_cpu, info->spare); - info->spare =3D NULL; - } + /* Do we have previous read data to read? */ + if (info->read < spare_size) + goto read; } =20 - if (!info->spare) { - info->spare =3D ring_buffer_alloc_read_page(iter->array_buffer->buffer, - iter->cpu_file); - if (IS_ERR(info->spare)) { - ret =3D PTR_ERR(info->spare); - info->spare =3D NULL; - } else { - info->spare_cpu =3D iter->cpu_file; - info->spare_size =3D page_size; - } - } - if (!info->spare) + /* Make sure the read page order is aligned with the current buffer subbu= f order */ + info->spare =3D ring_buffer_alloc_read_page(iter->array_buffer->buffer, i= ter->cpu_file, + prev_spare); + if (IS_ERR(info->spare)) { + ret =3D PTR_ERR(info->spare); + info->spare =3D NULL; + ring_buffer_free_read_page(iter->array_buffer->buffer, info->spare_cpu, = prev_spare); return ret; + } =20 - /* Do we have previous read data to read? */ - if (info->read < page_size) - goto read; + spare_size =3D ring_buffer_read_page_size(info->spare); + info->read =3D spare_size; + info->spare_cpu =3D iter->cpu_file; =20 - again: trace_access_lock(iter->cpu_file); ret =3D ring_buffer_read_page(iter->array_buffer->buffer, info->spare, @@ -7129,6 +7123,10 @@ ssize_t tracing_buffers_read(struct file *filp, char= __user *ubuf, trace_access_unlock(iter->cpu_file); =20 if (ret < 0) { + /* Did we race with ring_buffer_subbuf_order_set ? */ + if (spare_size !=3D ring_buffer_subbuf_size_get(iter->array_buffer->buff= er)) + goto again; + if (trace_empty(iter) && !iter->closed) { if (update_last_data_if_empty(iter->tr)) return 0; @@ -7142,12 +7140,14 @@ ssize_t tracing_buffers_read(struct file *filp, cha= r __user *ubuf, =20 goto again; } + return 0; } =20 info->read =3D 0; + read: - size =3D page_size - info->read; + size =3D spare_size - info->read; if (size > count) size =3D count; trace_data =3D ring_buffer_read_page_data(info->spare); @@ -7268,23 +7268,12 @@ ssize_t tracing_buffers_splice_read(struct file *fi= le, loff_t *ppos, }; struct buffer_ref *ref; bool woken =3D false; - int page_size; int entries, i; ssize_t ret =3D 0; =20 if (iter->snapshot && tracer_uses_snapshot(iter->tr->current_trace)) return -EBUSY; =20 - page_size =3D ring_buffer_subbuf_size_get(iter->array_buffer->buffer); - if (*ppos & (page_size - 1)) - return -EINVAL; - - if (len & (page_size - 1)) { - if (len < page_size) - return -EINVAL; - len &=3D (~(page_size - 1)); - } - if (splice_grow_spd(pipe, &spd)) return -ENOMEM; =20 @@ -7292,9 +7281,10 @@ ssize_t tracing_buffers_splice_read(struct file *fil= e, loff_t *ppos, trace_access_lock(iter->cpu_file); entries =3D ring_buffer_entries_cpu(iter->array_buffer->buffer, iter->cpu= _file); =20 - for (i =3D 0; i < spd.nr_pages_max && len && entries; i++, len -=3D page_= size) { + for (i =3D 0; i < spd.nr_pages_max && len && entries; i++) { + unsigned int page_size; struct page *page; - int r; + int r =3D -EINVAL; =20 ref =3D kzalloc_obj(*ref); if (!ref) { @@ -7304,7 +7294,7 @@ ssize_t tracing_buffers_splice_read(struct file *file= , loff_t *ppos, =20 refcount_set(&ref->refcount, 1); ref->buffer =3D iter->array_buffer->buffer; - ref->page =3D ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file); + ref->page =3D ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file, N= ULL); if (IS_ERR(ref->page)) { ret =3D PTR_ERR(ref->page); ref->page =3D NULL; @@ -7313,11 +7303,21 @@ ssize_t tracing_buffers_splice_read(struct file *fi= le, loff_t *ppos, } ref->cpu =3D iter->cpu_file; =20 - r =3D ring_buffer_read_page(ref->buffer, ref->page, - len, iter->cpu_file, 1); + page_size =3D ring_buffer_read_page_size(ref->page); + + if (IS_ALIGNED(*ppos, page_size) && len >=3D page_size) { + r =3D ring_buffer_read_page(ref->buffer, ref->page, len, iter->cpu_file= , 1); + } else if (!i) { + /* + * If the first iteration fails this is an invalid userspace input. + * Otherwise, this is because the subbuf order has been modified. Do not + * report an error and finish the read. + */ + ret =3D -EINVAL; + } + if (r < 0) { - ring_buffer_free_read_page(ref->buffer, ref->cpu, - ref->page); + ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); kfree(ref); break; } @@ -7330,6 +7330,7 @@ ssize_t tracing_buffers_splice_read(struct file *file= , loff_t *ppos, spd.partial[i].private =3D (unsigned long)ref; spd.nr_pages++; *ppos +=3D page_size; + len -=3D page_size; =20 entries =3D ring_buffer_entries_cpu(iter->array_buffer->buffer, iter->cp= u_file); } diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index bf77331f56a4..981e87b0f5a9 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -748,7 +748,6 @@ struct ftrace_buffer_info { struct trace_iterator iter; void *spare; unsigned int spare_cpu; - unsigned int spare_size; unsigned int read; }; =20 --=20 2.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D1BD547B436 for ; Thu, 13 Aug 2026 13:12:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626727; cv=none; b=q94AVJ9v5DuNz3aGI6gRPNCwmbO6pq3mKtDWF4qffCKlWN0+NdqapG1GwNuTdV01NfwfBzwSspRg32fFm3zDmjlChFlQkHD3H5FBvY0Vo76u6LWVkeQNnIPt+Fe+w+sDhpkPLnKhU332RuyhZ3MyKL0KhpBeExKxWVk65Kxti9Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626727; c=relaxed/simple; bh=kh+/+F7Yrso+LdumKNDYNclbFEAYJdZStq8JXTkEJVo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aMbi+UBBZFQ1YTCQpCSz3uku637gz+cpfmPCKMoamR1clOV1C87N5NZPjhTCh5/2kyiWK7bSEgQH6+faQg4JwbAUtpxPC9cY6n6XtYg+080xV+/rc+prxXKWML4sBpEXZHdan/8QQsJQqWfzlw8TOjDpYnNM+xSapaG5mQspA4Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=JvRJjPXN; arc=none smtp.client-ip=209.85.128.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="JvRJjPXN" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4954b1c6310so7135825e9.0 for ; Thu, 13 Aug 2026 06:12:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626724; x=1787231524; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=hFL43jjwG4Hy2J+x31lo72TgMA0D0unaTk/Ok+c8KgA=; b=JvRJjPXNlbSr1mL2vE00tnB8UnGXh/f0dnPg/jOdhB31UVQd7umfY4ENjGD/x0NZyP trj7tQEm0xt6paGJfTxe1iDj+MgCCHPDBY03Q4KMG/1hmMlHJS/j0mJj5cEaJPfp2fMq ZfOctTz8mfbISGTJ/Urh6qyn2Fmb4POnnSIq7YRcnmsMOeUHxu369P/6NCRGzpM2oZzr rKkT5o4OIhGm4AhkMr6Zpje67Ijh4xmkWBBiOppaXqiQj24YlAaP/9y4IuK4elavtbRy VFavB+YYglXEtobHGfLs8y/KpChcRoBfxIVmWPvct1VsYN0vODgLwats4WkMvmxFPFa4 lw3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626724; x=1787231524; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=hFL43jjwG4Hy2J+x31lo72TgMA0D0unaTk/Ok+c8KgA=; b=Ggc0MBuh7b5zvP0sdjTuEgjCEx4aOLOdU/1ssB7LhHYs3WARDUw4HKP6jwZtToZLXu AiSuKSEpMpgchzJiDacfC1sEhPLtMtak1xFqcgWuLJ+H8O5JdmbE3e3y3LSu+yTckd4G YTrkpIOvKZ08G1OxY13Vn+wFHAXb9fIYvLMWeqcyBFSyBq72u9bOVFc2Y2cw7yWghFfz MZVcoOCIvN82pzG8He2Y+gZIunB5iUAO5OWy+nAEEfAxAtgi5OmPvneXNu9X1rMKbVnN 3wm8n7DsvCEVijUtP5GEWDNtcmJva7a8Y4PRnMPYFBsOtiwQXts1W2RJaoEbb40LEUDH n/sQ== X-Forwarded-Encrypted: i=1; AHgh+RrRmwNJ68ovvFqsw0nR5YolqDQdVx8pTlyDWEJ10BIacDYnyLHkLRwrBDVEI4PLoqqVb1OdS+9CpMc7jQ0=@vger.kernel.org X-Gm-Message-State: AOJu0YxTAi01GpeNCS63l5zsBk0Zy1x7qU0ZsoW0MRx0JfH/h/c/LLNb LuKJ9oxVrTWNbWowYm40MR9UCUmnRbUMhWe8373mCNWta0PyFapv85205gDwVsfc8YhLeMgi/vr W/xgnx0rwRJB1x08PMaNK+Q== X-Received: from wmj9.prod.google.com ([2002:a05:600c:249:b0:495:43e1:542c]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:840f:b0:493:cc25:85cb with SMTP id 5b1f17b1804b1-4998215ed62mr64783775e9.8.1786626723660; Thu, 13 Aug 2026 06:12:03 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:49 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-8-vdonnefort@google.com> Subject: [PATCH v5 07/10] ring-buffer: Dynamically calculate max_data_size From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page= ") Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 83292d90599e..d7b3c56e4263 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 @@ -7982,7 +7996,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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E914847D93A for ; Thu, 13 Aug 2026 13:12:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626728; cv=none; b=GpgTTCWy/oU7o0SFcECn5RQ7tvWWV0k0rg8NlAJHIFlKS7DY/thldpHi0w8WvMO1Up7/n3B2iMF/zymNgseB6Vg3aL/2WBRI3vuU76xV1/gXJhFec6rUuaaS4il6zpEqig6qhfW5H5dAoo+KaIEbGci2EM9Z6UHY25GhZtFFk+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626728; c=relaxed/simple; bh=9Bysv873vAwyLyA6UGP4Oj7s+qZVTUQxM1pxMfTnQWU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LfeFARGQy0CuNI8MBPULg/rO4PpGYJLT72kGGak9LZSo/s207nEnTl7Y5CnJgz1nRoo8NADIZEtXNZITOXd6f+vg8TKVMrTNc4I/rmANo6CneZpAyK8T5Eu68M/QyX8+G/Tn/rC0qSWhDsru8ZyZ1k2WdiL/xrUFRw9KY6FzKng= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ZAAlhlfx; arc=none smtp.client-ip=209.85.221.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ZAAlhlfx" Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-47fecbb553bso1792197f8f.2 for ; Thu, 13 Aug 2026 06:12:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626725; x=1787231525; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=+i0aZeQq/1kOTYHHYrCCwFz33cStEuYr57NKxKQ74mE=; b=ZAAlhlfx+ytAWbRJm1rjBJrwjQu/XTBB0KWxlClBezwJfsVp95ytBeC+T74QYOaPEQ 3oWDTH51NwqfOwybjDe1G73S06lRgtJE+Z+OpRtPauOclpCRg1Vox0XJqh6pZoVRWouo NPsKMbGrMK0i6Ie47pV9OnsGVhVg5U/EsRqW+5KTyocbJba4zL6hy/TofYuP1dS1StKU llTt5o0bpgSXbdNOo5bf7qonX5Q3E+p1IFD/IJOw/vjzdXwaRXQSW3NwvC8rxhCc4C8b hxaeRZgPuA2+3DUXVj1ZELKpujljw+b2B5HRMLOcyDlp2oMWMYYaOlFjl1kKblc94D/E Okrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626725; x=1787231525; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+i0aZeQq/1kOTYHHYrCCwFz33cStEuYr57NKxKQ74mE=; b=R7wGGIpC1DIzYUkXa+EFUTdy8GW1PcbDw2pfIOfyc3C+B6cf2YwgGXM/+rpcd2sXcL 74U8w50Yge/HezHgDoZk8+DIUdWIozj0Cay9QUlTEfvhy0dzmW+2c2DfeRxh7wGiDHMN fPvUu9Zbfjy6+4OGM9/ZdA0nAuIZ+Oo2m5jn4OkTPP3+Ljq6WIko8QMDAFyEILnAkj+c 5pBArIjzLZMhRcEL6xK0qNVEq7qDvyCEOhvpoSNIsFjPHFZAoeABhZDdlFbQNxub17eT ppjTj2eRNAMVBRalfVy8S94nwTGaUmPPgRHhsrpimqP2FKtiMb7Zefbw8Fq2Z7UnMUWa nIIg== X-Forwarded-Encrypted: i=1; AHgh+RpfVkpIfnYbb27n2mDRJRr62hmzSKA2a5xcYiQNWhCmCevVzDj22+8by3IZGSWBLpNcCWYRdFg7d/YmW2s=@vger.kernel.org X-Gm-Message-State: AOJu0YwPZS0Lmvc5KyiciFvR5O8Y+nQWK7EWEPGhWETOZQhTrGy4D7sU Z/oc+kj7NszzJnI2hwF/DyW8UPLwq9rMkvOAvBJRwPC7rKldHsbs+RQG+qQfRfuu4uvD32bqVLZ cLS5h3AqfSMKuqz+Z8NzVVA== X-Received: from wrbfn12.prod.google.com ([2002:a05:6000:288c:b0:47f:5596:2c69]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:adf:e989:0:b0:47f:9254:d453 with SMTP id ffacd0b85a97d-48159ccc645mr6978361f8f.8.1786626724876; Thu, 13 Aug 2026 06:12:04 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:50 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-9-vdonnefort@google.com> Subject: [PATCH v5 08/10] ring-buffer: Remove trace_buffer::cpus From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing= their allocation order") Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index d7b3c56e4263..905b2e6df9ab 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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C76E47ECC5 for ; Thu, 13 Aug 2026 13:12:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626730; cv=none; b=qnKjLgMg9MQUPvxwhcu8kUndbpUf5paZwMwspVGFkmX1BlVTrg0YYVBmWjDV93G/T59HlkjECPvqFwOcnxllvbElgzC8O8P6r9majTRJFiVOAJ6fr1aDZWxp18RdNdsFZ4LFPeQqTwOCl5nS8pJTwZPa2uNed9D8p4wRC19gvLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626730; c=relaxed/simple; bh=GJIQzWniejHngWrrRZoVkvz5khkJfFg38oim/jvLcvI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VZ3ArY5nSvIWRS48mT2Jd0qRfQmCkJ9vd7nzCf5DDvd+8K2exAPk3XY5LZ23cklqxGD689Ae1orQF3Teixlbcs7SAKL37Llo120XFMbAZXnCEyAXjWtRl9wlwzqzxBJ3yk1kJDyQMxQJJlxDbd13qdCICP63ZsPndWuAJ7El7N4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pb3zUerM; arc=none smtp.client-ip=209.85.208.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pb3zUerM" Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-6a18f14a076so2509914a12.0 for ; Thu, 13 Aug 2026 06:12:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626726; x=1787231526; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=cdLXT6hO5jBH5ZtVjhTw/BzhwnKt/Y5GE8hlcIZdn2Y=; b=pb3zUerMFY6JMCuTW0Qpe9/seGzHhtPgWvc78PXrlH4thg+ldUtIXEsvSu4748p5u2 8qhgGD0S2+XhtyPqDJhGKzxf0GXrh/oEDB8YC7WN6X7diZG1Rojt/0Yq5XhztD1I0Fut f9XduvFUGL1cpGUHfXGQzYUBcEEHl185E8Ny59pKLSBNLiRuKqEKBRlSg1AGbTl142Gs ZfAf1Xl2ToqYw9oklpYctZkl2S88b5CHAzmYGQksbC1UosKWz9uwl9qObk+vL7DONZ7b yjTT2xCuJY4U15QPT8IiZC+arEoBY/ThmJq/fkmMIpmgTlXD7p+J/RPZEpJL+8slcpeQ q3rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626726; x=1787231526; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cdLXT6hO5jBH5ZtVjhTw/BzhwnKt/Y5GE8hlcIZdn2Y=; b=lGgwfHqcAZcGOb5aM7kkJHjW0DvRyNywRkloJo6af43mY7us5GXpdgEv2m+ri34aFo +MhZuK4v0GV4bpXb04A1pZy4UERW+OyXVk9VnW3su7MbDvTpSIWtp8eSTjmbLHAlQkEE e30wvBO9Ctcg1h0dA6cNbkNPqzDEGZbIX2c+1nLm2iicGdDQNeairTIxH9zHfLKHJ0Kt jcFKP9TTCQmhhkeYWSNEvhTGOkV7wQ9uwqZLPYrI6bPSiArz319Sr7JliHcFwW5cDTPi Kle6pfajLcuKhdTVj02OL93hZ7hbyqNZrf4YcKwJxSuCIr3NXUQKd2CDMJXmJWLmW0Ze Q71g== X-Forwarded-Encrypted: i=1; AHgh+Rr4ErmTUShpE/oxAXNWTNRMCe/85plwiaSuVzIV1173oNJ0hfO1SLqfH/MNqwvqQdC7BrveHbEW1+uZ92E=@vger.kernel.org X-Gm-Message-State: AOJu0YyHJj/iFV+JSXNQsxHDZW4gI4vqSMuMe7aa21PRl6DX5vtWCIz+ dtk/c4dkHAgqUqSL1HSM/JNSG0f2Y3pg4uSK4cs4JEQbyIYDtf9XaVXCGUa80CWwlZCGqB5Ms/R jepsCxzWtknQnEtEMHmPGOg== X-Received: from edpr18.prod.google.com ([2002:aa7:c152:0:b0:69c:458d:1598]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:28cd:b0:699:728e:48c3 with SMTP id 4fb4d7f45d1cf-6a3805b0362mr2958926a12.9.1786626725971; Thu, 13 Aug 2026 06:12:05 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:51 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-10-vdonnefort@google.com> Subject: [PATCH v5 09/10] ring-buffer: Remove ring_buffer_per_cpu::mapped From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 905b2e6df9ab..79459c99ce9a 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 */ @@ -7163,7 +7165,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; @@ -7202,8 +7203,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 @@ -7213,7 +7212,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; @@ -7674,11 +7673,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)) @@ -7687,13 +7682,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); @@ -7865,7 +7857,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 { @@ -7922,8 +7913,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.55.0.691.gc56d675ccc-goog From nobody Tue Sep 29 02:02:39 2026 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 048D747F2F3 for ; Thu, 13 Aug 2026 13:12:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626732; cv=none; b=HLvsonW3u9EmtESCMvIWxIRyKFyvLeVpwqevGlqoOkMUjKd1KG0gBdWtdrWr6NDazCZisF5Fsx5YlavglBvbX3PO4j9x4r3s3qEHtxSAtXdFNJlSUReVa9ELGCO8xLQ6TUagPOcWXagxQHfafYSDhzqz012UR8s5xOlvuBOGkRU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786626732; c=relaxed/simple; bh=nOJoLqrwTpDzBVqNbCTjH0DquY9mGdJ+fc0XSh/Fjjw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=bt42ZMsJEXJY0g5STIbFIbP/dEdD2/b7UO7w61KzzUngarWmslvzkRCATOYXx8oWgSMhzgPNgXvLrE6yMGjZnpdbCMWtzX0ARdeqiAB79pVnY5dzFi0cmTfGI1xhcxTNjvHbb+4ut1RGRwSzDzjoS/+eP8kEnRAlKajEkxbb9D4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=OUlJeYh+; arc=none smtp.client-ip=209.85.221.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--vdonnefort.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="OUlJeYh+" Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-47f8f8fde2dso1351809f8f.0 for ; Thu, 13 Aug 2026 06:12:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786626728; x=1787231528; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=P7yxw9NdSYhmxpBqTEBYSZkvDkPpkkrxkZ9pUY5Xfdc=; b=OUlJeYh+8npGIQZYfDv/25mUkxTbC1Gylx4keehOUUg/EaT5twTUcy2kS4jV3/cw+P pKl7wKwqHOw47dppJxGCFOcE5FvTWRgjg+NyRDih6AguyYmPfpN2K5uJkzcQMGbzoj/E XUc4A6u69cfPJC7fM4mJEwpPNfG1L/pi726ujzIsgXRmKkLjmEkWSdHadUnQ3PEMrphz eydzfE9nEohXZSrz+bPHoZfs3G2IbGnBMPZNz36/QknJnTq+xYhM0qmHhXE/n5pveY55 RIDufIPwDjcdHQwJWK1Te4OP1HoyqcfAmCEBn7ycexnSC5sdpPwxK1jBGsj4hyUkZPq9 UB1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786626728; x=1787231528; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=P7yxw9NdSYhmxpBqTEBYSZkvDkPpkkrxkZ9pUY5Xfdc=; b=rl7F05FhhDo9Co92uB5+RflN5zJjs3yBDrQkz72OvFFhBt+Mz/OxVzv11dsNZvdZAT tj+zgkHwmfjOpXqmxDeNi2Ij3Gkbv58aviBuiz9fmhM7hpXwlOGCKDVlTcv8bM2ZGLGY DKHoZCNU8CrRNFhnxttIC20T1F04YgnmOongJaHur25altGjVO/u394O1Fg8+cH9+XfO SpE5j3ntwIJJkRdyQFbxLxBBq9HSbauEQvJR9SPmGeGhvTwY11xedlU8QvVRPKj9j0Q4 9rYPp0sLuuCiOe6iPFcS2BPfjhjujwyX0PYHA/J9luLpWZykBCl4PuThPJj6upoaGF3z jNYg== X-Forwarded-Encrypted: i=1; AHgh+RoLRIvnasY8cpoki9h8raxP8Hk2A1mHMUo4Yl5GiF0zVb66koFBi6HxAaW2pEG/4xbWxDjiGjTwa79mYcs=@vger.kernel.org X-Gm-Message-State: AOJu0Yy4urw5EGnM7fekmsCnPE6Mb6sBdwUS+WfzNm08OWWGlDjCSBB+ dwM/9YvTFFN0l+X4FMKSdgpwQO6Tdw23XwE+Yk7rH5wydwIH7IV8x+3xbonlCEn6bk9ag4Wz8SI Gj0BrPKSvFq7eYPD5N/OZtg== X-Received: from wrsz9.prod.google.com ([2002:a5d:4c89:0:b0:481:511c:80e6]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:adf:fa0a:0:b0:47f:9662:85fe with SMTP id ffacd0b85a97d-4815a0223cdmr6410816f8f.16.1786626727470; Thu, 13 Aug 2026 06:12:07 -0700 (PDT) Date: Thu, 13 Aug 2026 14:11:52 +0100 In-Reply-To: <20260813131152.3589632-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260813131152.3589632-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260813131152.3589632-11-vdonnefort@google.com> Subject: [PATCH v5 10/10] ring-buffer: Make nr_pages unsigned int From: Vincent Donnefort To: rostedt@goodmis.org, mhiramat@kernel.org, linux-trace-kernel@vger.kernel.org Cc: mathieu.desnoyers@efficios.com, kernel-team@android.com, linux-kernel@vger.kernel.org, Vincent Donnefort Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" nr_pages is an int or unsigned int almost everywhere already. Also, all the meta-data ring_buffer_desc, ring_buffer_cpu_meta and trace_buffer_meta allowing to share information about the ring buffer are already capping this value to 32-bits. Make ring_buffer_per_cpu::nr_pages unsigned and align all the users to it. As a side effect, this makes ring_buffer_per_cpu slightly smaller. Where necessary, use unsigned long for the size to ensure multiplications are not truncated to 32-bits. Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 79459c99ce9a..d9dcd6d4e7cc 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -519,7 +519,7 @@ struct ring_buffer_per_cpu { arch_spinlock_t lock; struct lock_class_key lock_key; struct buffer_data_read_page free_page; - unsigned long nr_pages; + unsigned int nr_pages; unsigned int current_context; struct list_head *pages; /* pages generation counter, incremented when the list changes */ @@ -561,7 +561,7 @@ struct ring_buffer_per_cpu { struct ring_buffer_remote *remote; =20 /* ring buffer pages to update, > 0 to add, < 0 to remove */ - long nr_pages_to_update; + int nr_pages_to_update; struct list_head new_pages; /* new pages to add */ struct work_struct update_pages_work; struct completion update_done; @@ -1669,7 +1669,7 @@ static void rb_check_pages(struct ring_buffer_per_cpu= *cpu_buffer) * This is used to help find the next per cpu subbuffer within a mapped ra= nge. */ static unsigned long -rb_range_align_subbuf(unsigned long addr, int subbuf_size, int nr_subbufs) +rb_range_align_subbuf(unsigned long addr, unsigned long subbuf_size, unsig= ned int nr_subbufs) { addr +=3D sizeof(struct ring_buffer_cpu_meta) + sizeof(int) * nr_subbufs; @@ -1679,13 +1679,13 @@ rb_range_align_subbuf(unsigned long addr, int subbu= f_size, int nr_subbufs) /* * Return the ring_buffer_meta for a given @cpu. */ -static void *rb_range_meta(struct trace_buffer *buffer, int nr_pages, int = cpu) +static void *rb_range_meta(struct trace_buffer *buffer, unsigned int nr_pa= ges, int cpu) { - int subbuf_size =3D rb_subbuf_size(buffer); + unsigned long subbuf_size =3D rb_subbuf_size(buffer); struct ring_buffer_cpu_meta *meta; struct ring_buffer_meta *bmeta; + unsigned int nr_subbufs; unsigned long ptr; - int nr_subbufs; =20 bmeta =3D buffer->meta; if (!bmeta) @@ -1731,7 +1731,7 @@ static void *rb_range_meta(struct trace_buffer *buffe= r, int nr_pages, int cpu) /* Return the start of subbufs given the meta pointer */ static void *rb_subbufs_from_meta(struct ring_buffer_cpu_meta *meta) { - int subbuf_size =3D meta->subbuf_size; + unsigned long subbuf_size =3D meta->subbuf_size; unsigned long ptr; =20 ptr =3D (unsigned long)meta; @@ -1746,8 +1746,7 @@ static void *rb_subbufs_from_meta(struct ring_buffer_= cpu_meta *meta) static void *rb_range_buffer(struct ring_buffer_per_cpu *cpu_buffer, int i= dx) { struct ring_buffer_cpu_meta *meta; - unsigned long ptr; - int subbuf_size; + unsigned long subbuf_size, ptr; =20 meta =3D rb_range_meta(cpu_buffer->buffer, 0, cpu_buffer->cpu); if (!meta) @@ -1840,10 +1839,10 @@ static bool rb_meta_init(struct trace_buffer *buffe= r, int scratch_size) * must be the same. */ static bool rb_cpu_meta_valid(struct ring_buffer_cpu_meta *meta, int cpu, - struct trace_buffer *buffer, int nr_pages, + struct trace_buffer *buffer, unsigned int nr_pages, unsigned long *subbuf_mask) { - int subbuf_size =3D PAGE_SIZE; + unsigned long subbuf_size =3D PAGE_SIZE; unsigned long buffers_start; unsigned long buffers_end; int i; @@ -2231,7 +2230,7 @@ static void rb_meta_validate_events(struct ring_buffe= r_per_cpu *cpu_buffer) } } =20 -static void rb_range_meta_init(struct trace_buffer *buffer, int nr_pages, = int scratch_size) +static void rb_range_meta_init(struct trace_buffer *buffer, unsigned int n= r_pages, int scratch_size) { struct ring_buffer_cpu_meta *meta; unsigned long *subbuf_mask; @@ -2331,8 +2330,8 @@ static int rbm_show(struct seq_file *m, void *v) rb_meta_subbuf_idx(meta, (void *)meta->head_buffer)); seq_printf(m, "commit_buffer: %d\n", rb_meta_subbuf_idx(meta, (void *)meta->commit_buffer)); - seq_printf(m, "subbuf_size: %d\n", meta->subbuf_size); - seq_printf(m, "nr_subbufs: %d\n", meta->nr_subbufs); + seq_printf(m, "subbuf_size: %u\n", meta->subbuf_size); + seq_printf(m, "nr_subbufs: %u\n", meta->nr_subbufs); return 0; } =20 @@ -2417,7 +2416,7 @@ static void *ring_buffer_desc_page(struct ring_buffer= _desc *desc, unsigned int p } =20 static int __rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer, - long nr_pages, struct list_head *pages) + unsigned int nr_pages, struct list_head *pages) { struct trace_buffer *buffer =3D cpu_buffer->buffer; struct ring_buffer_cpu_meta *meta =3D NULL; @@ -2520,7 +2519,7 @@ static int __rb_allocate_pages(struct ring_buffer_per= _cpu *cpu_buffer, } =20 static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer, - unsigned long nr_pages) + unsigned int nr_pages) { LIST_HEAD(pages); =20 @@ -2545,7 +2544,7 @@ static int rb_allocate_pages(struct ring_buffer_per_c= pu *cpu_buffer, } =20 static struct ring_buffer_per_cpu * -rb_allocate_cpu_buffer(struct trace_buffer *buffer, long nr_pages, int cpu) +rb_allocate_cpu_buffer(struct trace_buffer *buffer, unsigned int nr_pages,= int cpu) { struct ring_buffer_per_cpu *cpu_buffer __free(kfree) =3D alloc_cpu_buffer(cpu); @@ -2703,7 +2702,7 @@ static void rb_test_inject_invalid_pages(struct trace= _buffer *buffer) struct buffer_data_page *dpage; unsigned long entry_bytes =3D 0; unsigned long ptr; - int subbuf_size; + unsigned long subbuf_size; int invalid =3D 0; int cpu; int i; @@ -2773,8 +2772,8 @@ static struct trace_buffer *alloc_buffer(unsigned lon= g size, unsigned flags, struct ring_buffer_remote *remote) { struct trace_buffer *buffer __free(kfree) =3D NULL; - long nr_pages; - int subbuf_size; + unsigned long subbuf_size; + unsigned int nr_pages; int bsize; int cpu; int ret; @@ -3037,12 +3036,12 @@ static inline unsigned long rb_page_write(struct bu= ffer_page *bpage) } =20 static bool -rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_p= ages) +rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned int nr_pa= ges) { struct list_head *tail_page, *to_remove, *next_page; struct buffer_page *to_remove_page, *tmp_iter_page; struct buffer_page *last_page, *first_page; - unsigned long nr_removed; + unsigned int nr_removed; unsigned long head_bit; int page_entries; =20 @@ -3264,7 +3263,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, u= nsigned long size, int cpu_id) { struct ring_buffer_per_cpu *cpu_buffer; - unsigned long nr_pages; + unsigned int nr_pages; int cpu, err; =20 /* @@ -4229,7 +4228,7 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cp= u_buffer) * assign the commit to the tail. */ again: - max_count =3D cpu_buffer->nr_pages * 100; + max_count =3D cpu_buffer->nr_pages * 100UL; =20 while (cpu_buffer->commit_page !=3D READ_ONCE(cpu_buffer->tail_page)) { if (RB_WARN_ON(cpu_buffer, !(--max_count))) @@ -6522,7 +6521,7 @@ unsigned long ring_buffer_size(struct trace_buffer *b= uffer, int cpu) if (!cpumask_test_cpu(cpu, buffer->cpumask)) return 0; =20 - return rb_subbuf_capacity(buffer) * buffer->buffers[cpu]->nr_pages; + return (unsigned long)rb_subbuf_capacity(buffer) * buffer->buffers[cpu]->= nr_pages; } EXPORT_SYMBOL_GPL(ring_buffer_size); =20 @@ -7418,8 +7417,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; unsigned int old_capacity; + unsigned int nr_pages; int old_order; - int nr_pages; int psize; int err; int cpu; @@ -7465,8 +7464,9 @@ 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_capacity * buffer->buffers[cpu]->nr_pages; - nr_pages =3D DIV_ROUND_UP(nr_pages, rb_subbuf_capacity(buffer)); + nr_pages =3D DIV_ROUND_UP( + (unsigned long)old_capacity * buffer->buffers[cpu]->nr_pages, + rb_subbuf_capacity(buffer)); =20 /* we need a minimum of two pages */ if (nr_pages < 2) @@ -7708,8 +7708,8 @@ static int __rb_inc_dec_mapped(struct ring_buffer_per= _cpu *cpu_buffer, static int __rb_map_vma(struct ring_buffer_per_cpu *cpu_buffer, struct vm_area_struct *vma) { - unsigned long nr_subbufs, nr_pages, nr_vma_pages, pgoff =3D vma->vm_pgoff; - unsigned int subbuf_pages, subbuf_order; + unsigned long nr_pages, nr_vma_pages, pgoff =3D vma->vm_pgoff; + unsigned int nr_subbufs, subbuf_pages, subbuf_order; struct page **pages __free(kfree) =3D NULL; int p =3D 0, s =3D 0; int err; @@ -8039,9 +8039,9 @@ static void rb_cpu_sync(void *data) int trace_rb_cpu_prepare(unsigned int cpu, struct hlist_node *node) { struct trace_buffer *buffer; - long nr_pages_same; + unsigned int nr_pages; + int nr_pages_same; int cpu_i; - unsigned long nr_pages; =20 buffer =3D container_of(node, struct trace_buffer, node); if (cpumask_test_cpu(cpu, buffer->cpumask)) --=20 2.55.0.691.gc56d675ccc-goog