From nobody Tue Sep 29 04:13:04 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 17DE647141D for ; Wed, 12 Aug 2026 15:33:30 +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=1786548820; cv=none; b=XbVtrgPgBU0LFqrveKwF2oYaKiEevFzXpXPD6z3cuWCN86HtAOV3SwH8FXHal9wqa9Z/yft9K50RcnDIdCjnsU2tcP4IEKdhfSiPJOG+lnh9bs9vwn7afGpDFpQ8q7gC6dMLQyY69tuy690YO08/St5gayx7VihsYjgrAFIRijc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548820; 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=QIZPlzrAu3SL2FSE+YDVL9y78WYt6ejkd3CiqaY56qkLZ5s3+5vqXP9dPdofr/9oawFKMfnv2gDQr4DdXFno/GequbM1bjz6alvpsM+RqBDuLKhlm/hiNHTeypnG3SGhUJdqzrmJW9J/NEaXg/5xcnytvAoIg2zZUK7Kpxhcj40= 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=fSEVNOCw; 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="fSEVNOCw" Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-47fecbb553bso870774f8f.2 for ; Wed, 12 Aug 2026 08:33:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548808; x=1787153608; 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=fSEVNOCwALQXTxgKUxiKYdnSAiBEzYPzLmS8z90WjTf5zJUwHOfFEnMAOo38KBwRzX KyiqX/DZ5/MArOvDwPVxvsGDvgUJsDoYQmNj1+baQJO1zUckDsHym1G1SCUD+IdRopHd 8E+11kmkxKQQ+fwsNyasagrzvsI1WHyzGOeiu1adkhzxX2aD2exxe2bYnwhGKUwllgs6 3al/kcDSOyKvJUe+Dlzel2ZMtjJ182m6zOfM0+00iJUbmk2wxl92Zq9Uzx4CJJwRmZ1+ GFvDA4vbHiCaGYYfHbHbG6H0iYsq40j+KPCGoHLgOwJHN6AoF7/CighkM2lDCsZEW+54 WaGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548808; x=1787153608; 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=NvFG+nCr7w/Gr1IGyR2Jxu9T1QAVClnaYlGALCQ2TKI6Tz7MAsuZFWU9AVPOgEYdeN c787wgAyr2uTBJ+jg+xzbHSnbvEougYpNfb2CdmCO4FeBHDUXXr7ZdluSQjHE9y1BvQC C3CKeUoHVYhkFBdvxRCKdf0qZNvKXPV0d01qy2Ccm7lT/sAgoLc7Zka5g1cyP8UjPGCG J64eq5FuAiO4jAut8uDclAaQRHfR9fz6MosEFwIayoP89I/XPYUjmAE+hZeGwCT5wjYL UbJHB5cmxBkOzmPecSkdXvOamU2gEKXXQZpqduJ1DbfY2MH4n3nF9E/q+h70GYXzyPlC /f1A== X-Forwarded-Encrypted: i=1; AHgh+RpKOneqPN3IXGjIXGgtvxGlxyPOKZl4vlyPpq0Y7OR/l+XmmOXeCwIfliCHQFPeLglMCDmFcdTP4zzt56U=@vger.kernel.org X-Gm-Message-State: AOJu0YyyAmsR8XdIZMAJC9RQBw3WwrUmbRns6+/0VqFk3hXEsIZTKqQW rctHJI5F+WpVIhIuxuGIDIpxdHoDsVjUbhnwzS/9RozKPHtwnAIEm2xrZ6vSUwjEqo3IO450rHj ty7Dw7j7SpNa2WX8EgGD1LA== X-Received: from wrms2.prod.google.com ([2002:adf:ea82:0:b0:47f:ffcf:7045]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:188e:b0:47e:81aa:3832 with SMTP id ffacd0b85a97d-481528f7238mr7770005f8f.16.1786548807933; Wed, 12 Aug 2026 08:33:27 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:02 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-2-vdonnefort@google.com> Subject: [PATCH v4 1/9] 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 --- 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 04:13:04 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 574862045AD for ; Wed, 12 Aug 2026 15:33:33 +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=1786548821; cv=none; b=Wn9AyQgU9GItPV9WFrCBduGyJC3+wZ+Hw6/Hq4BLz+FVO4e7Pr8KkTpaquw2RemR+DZ4in0aLtUJZivapxA4tQN0tEGQtegmErDCvQ/22AZDQKOHouRSCMrmSWCmyu5kng6Ce7XtISST/bWWRTAdyJv213ZrUyg5w1OZnG26N74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548821; c=relaxed/simple; bh=tujv8RbwhrzNmaNzcMSZ3HxX1V8/EjqjdRXAbYVULcE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I56ikA2F505USCHn+k8W0WJAkpyNwFfJ87Sq244BLtbADB8HMA44/bnZlHCIVV/rRX9P5k633FduDagHDai6TQV0M3Bt2EqVhPPGh8808V28DV5Z8vty1fyc6q32cdwB4ub3jqn9+0kubEZ7K2g//7cjVOAiotEFKL8DnW7ufTQ= 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=sW2+6hj9; 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="sW2+6hj9" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-495569acf8dso7814895e9.1 for ; Wed, 12 Aug 2026 08:33:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548809; x=1787153609; 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=sW2+6hj9hcmu2PLSe+pHFde6nTN6EY9RPfBT+O+BghTz6t4m41ecCo7nZvnRp0+IbW /uti/s+aZCOXhJMcCmkZ8K55j21ML5lmO2nVmTWa5ehHi4kqB44PymMWU+8imBUbJniy 6ITyEFkyrAB+FwuHjdz0rtb1sOAz7Wic3BuVfXe0BzFTJMjiWWDdxoa9D1YDFtzPzltH 8GmjWgkIY3QOG4NEx3SOS4mmTu6f/HyfUy52LXZHf85fApYOBgU3ElDKOTYdZnhAjrb4 CoqOq8lIy023km4VIiRZGghU5OAAPOV853CYR/95NJ+XVmNb9pF127TevGgWW+XylasH SUjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548809; x=1787153609; 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=A0c6P+dmMxgT0hyjjUClaMQ0LbPK0/XRNlvYYbEa+XZvzTPG4p4fN3TfzEePc6/cOU c5FrTwijTTraavMnK29xSSCpHU/smRA4nxpJig9z4nOwYHgLqe6WYNySgq24NAunwpWb VXiYTQXrksPUZGYbyHiXZ1nuf7orz0xpF/Gi6NSI5DN5cTrTcWxoAGqVMXyJ8Vo1x19G g2IECOJq27Emazb/kC5E2UlCqxI9d2Kc6ZN3ElhKdNc1a3XOMQjrpLdYRvWazlmRGjAj 2vHxcxLKRq00XOyMGhx5IYaLsejZZsqA8BXK5Kxgmy93gM6MmdkA1kjmr4ySpRQTdyv6 n8mw== X-Forwarded-Encrypted: i=1; AHgh+RpqfNtOHsL/Da+FkcZ1bkwGmaqcs5bBWFu9v0Fm1q3HnUfiuFmpOjRbDDqZYuvjbWm4oHDxnUv9b3yahHk=@vger.kernel.org X-Gm-Message-State: AOJu0YxhVniVb+y0zASO+2IeR4K+QE/4dgsQjPPLxYjd71uY/xHeDIGi qd0qH9G0IxSMtpXhU2k+qwRzfESXbQBssw+d08ieLrkmrNnmWSWtCT3MQO4hCJkqGuhplk5vStp 1E7Wxx3PfjT65pNVWRqsB1Q== X-Received: from wmcm14.prod.google.com ([2002:a7b:ce0e:0:b0:493:ed72:8dad]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600d:6454:10b0:499:79ba:a754 with SMTP id 5b1f17b1804b1-4997c138bfamr64105245e9.11.1786548809168; Wed, 12 Aug 2026 08:33:29 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:03 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-3-vdonnefort@google.com> Subject: [PATCH v4 2/9] 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 04:13:04 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 776C5432E6F for ; Wed, 12 Aug 2026 15:33:34 +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=1786548824; cv=none; b=fsvdszusEt0uxmE0cjPUyl0viXBGNMQrI9XGrkx8ZmhVKxW830LVqxSRiL7KsM/FZgdQ84BDy2XauR4W5ncIZk0qiAliwLh4NozqIWm0ByH0EHDGpqobPIHoubNV0/sxloOHt8fLj65BP0G0ZAfbLIrbybKZBldM8Gr9wHZM380= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548824; c=relaxed/simple; bh=cQprqG9VSbyeUXbeIEHObyXjIXte74q4Vo5XeuUAB+Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=W3i541ck2FjFnV7wEFIUDCiQKg48xh/YFD4f6pyOh40EfcPuKsHD0csF4MrDf2OwaqlSFdtaeB9vtZeMZS+lZKjBHbnX2WX9b8wvtItHsmMVweCjGcZcLSsv74lDg8IhxlKYxSYC25spv2ZH1OoUsCrrctYfjDHD/WxQO19CBHA= 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=Ut83Q0Nq; 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="Ut83Q0Nq" Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-49808ea1b64so13949505e9.1 for ; Wed, 12 Aug 2026 08:33:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548810; x=1787153610; 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=+FOLS5gCoUrKqFYt2BuM/B+wLbX9zmS0L8hAVqDa1ZY=; b=Ut83Q0NqUZL8ran9UGg3c54LzfWUkIDZHngzIdIh76++1jNH5P6m/xylXXuXvrZzj1 cAdoYGhKnE/yRpPWIgBEJK4tm7Zx4cpPYwAT7PknS/ck/zY8tTiREj99V8ERcAOpKT/x X3nNO2MXeaaezkD1KmyIPHxzzwccJz85H4HgvDjtUwS7xqqmECsM3tge21hbWXust5ZO Z4xgSakqQnPs60JnlXMDR1g2ONcOKjAHjlQ8+aQ2mQU2jvzF+PCzAvq36gS1y64PKiRP AgIqimPtxUmE+/s1vGlZiNkF927lOcMXWyzk66qPYDKaBkpOgbEKN5G/OaZo/dE+m2a/ vwpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548810; x=1787153610; 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=+FOLS5gCoUrKqFYt2BuM/B+wLbX9zmS0L8hAVqDa1ZY=; b=l/SDgasawxa+qP/fCgBYHIojM2qjQGGRTVftuAP3pM0Wfw24ZUgokFMMGBoVm0AYjP pn2XcLSoskPVhRfHMU5K9Srua5oVufwTLNF0p3gjkeX4i8jZQDPQz8YW1+G+eeunqGX2 rr4C1hXYN89vWE06yZqOlH/eI/fEdc27jZ5CTATq5UonvxZGH/PcUJmVZzYlxGU7Y4p7 XPHGqQkG8J6nXQeNqBEWIc1FZqmKNQ6cAocDEks59lPU1wo6JYG6DZPBEsKK1o5MOM1H u3rLusHQxHL5MllmzAka7f7O1Ss+efGhA+px79aQxEg+3RBrjo6LNxBLGKbwkGyqo7B7 SqqQ== X-Forwarded-Encrypted: i=1; AHgh+Rr/8Q/jNFto6KTnd4RKCA9WHoFyU/ERP6XJC4lhXX8zBhZNmcBXDVTMGUheFcqtrrg9s5HzDIRmlvw1hYA=@vger.kernel.org X-Gm-Message-State: AOJu0YwoVi4xYVWqw6oNC5fUXu0sHT2R7lfav2vKsVQlFcRaRGiT3jL/ JpbwK/qlGdmg3Qmvq9bEc8Zp8mNViCoD0GJbDmbuSmfEpbVUg3yY/G89fhjvP3v7y6KslpgfrL2 vrxxT2BRFOXYWXEAZ/ku+mg== X-Received: from wmdp9.prod.google.com ([2002:a05:600c:5c9:b0:489:1b01:386f]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4f8b:b0:499:596b:2e91 with SMTP id 5b1f17b1804b1-499819bd4cfmr271165e9.3.1786548810355; Wed, 12 Aug 2026 08:33:30 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:04 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-4-vdonnefort@google.com> Subject: [PATCH v4 3/9] 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 ec4f5a0c93e8..97449423d3a6 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -391,6 +391,17 @@ static __always_inline unsigned int rb_page_size(struc= t buffer_page *bpage) return rb_data_page_size(bpage->page); } =20 +/** + * rb_page_capacity - Get the capacity of a buffer page + * @bpage: The buffer page + * + * Return: The maximum size available for events in the given buffer page. + */ +static __always_inline unsigned int rb_page_capacity(struct buffer_page *b= page) +{ + return (PAGE_SIZE << bpage->order) - BUF_PAGE_HDR_SIZE; +} + static void free_buffer_page(struct buffer_page *bpage) { /* Range pages are not to be freed */ @@ -586,11 +597,42 @@ struct trace_buffer { =20 struct ring_buffer_meta *meta; =20 - unsigned int subbuf_size; unsigned int subbuf_order; unsigned int max_data_size; }; =20 +static __always_inline unsigned int rb_subbuf_size(struct trace_buffer *bu= ffer) +{ + return PAGE_SIZE << buffer->subbuf_order; +} + +/** + * rb_subbuf_capacity - Get the capacity of a subbuffer + * @buffer: A trace buffer + * + * Unsafe to use without holding trace_buffer::mutex or with resizing enab= led. + * Consider rb_page_capacity() instead. + * + * Return: The maximum size available for events in a trace buffer subbuff= er. + */ +static __always_inline unsigned int rb_subbuf_capacity(struct trace_buffer= *buffer) +{ + return rb_subbuf_size(buffer) - BUF_PAGE_HDR_SIZE; +} + +/** + * rb_subbuf_start - Get the start address of a subbuffer + * @buffer: A trace buffer + * @addr: An address of an event on a subbuffer + * + * Return: The start of the subbuffer for where @addr sits + */ +static __always_inline +unsigned long rb_subbuf_start(struct trace_buffer *buffer, unsigned long a= ddr) +{ + return addr & ~((unsigned long)(rb_subbuf_size(buffer) - 1)); +} + struct ring_buffer_iter { struct ring_buffer_per_cpu *cpu_buffer; unsigned long head; @@ -630,7 +672,7 @@ int ring_buffer_print_page_header(struct trace_buffer *= buffer, struct trace_seq trace_seq_printf(s, "\tfield: char data;\t" "offset:%u;\tsize:%u;\tsigned:%u;\n", (unsigned int)offsetof(typeof(field), data), - (unsigned int)(buffer ? buffer->subbuf_size : + (unsigned int)(buffer ? rb_subbuf_capacity(buffer) : PAGE_SIZE - BUF_PAGE_HDR_SIZE), (unsigned int)is_signed_type(char)); =20 @@ -1620,7 +1662,7 @@ rb_range_align_subbuf(unsigned long addr, int subbuf_= size, int nr_subbufs) */ static void *rb_range_meta(struct trace_buffer *buffer, int nr_pages, int = cpu) { - int subbuf_size =3D buffer->subbuf_size + BUF_PAGE_HDR_SIZE; + int subbuf_size =3D rb_subbuf_size(buffer); struct ring_buffer_cpu_meta *meta; struct ring_buffer_meta *bmeta; unsigned long ptr; @@ -2432,8 +2474,8 @@ static int __rb_allocate_pages(struct ring_buffer_per= _cpu *cpu_buffer, bpage->id =3D i + 1; cpu_buffer->subbuf_ids[i + 1] =3D bpage; } else { - int order =3D cpu_buffer->buffer->subbuf_order; - bpage->page =3D alloc_cpu_data(cpu_buffer->cpu, order); + bpage->page =3D alloc_cpu_data(cpu_buffer->cpu, + cpu_buffer->buffer->subbuf_order); if (!bpage->page) goto free_pages; } @@ -2556,8 +2598,7 @@ rb_allocate_cpu_buffer(struct trace_buffer *buffer, l= ong nr_pages, int cpu) bpage->range =3D 1; cpu_buffer->subbuf_ids[0] =3D bpage; } else { - int order =3D cpu_buffer->buffer->subbuf_order; - bpage->page =3D alloc_cpu_data(cpu, order); + bpage->page =3D alloc_cpu_data(cpu, bpage->order); if (!bpage->page) goto fail_free_reader; } @@ -2731,10 +2772,9 @@ static struct trace_buffer *alloc_buffer(unsigned lo= ng size, unsigned flags, =20 buffer->subbuf_order =3D order; subbuf_size =3D (PAGE_SIZE << order); - buffer->subbuf_size =3D subbuf_size - BUF_PAGE_HDR_SIZE; =20 /* Max payload is buffer page size - header (8bytes) */ - buffer->max_data_size =3D buffer->subbuf_size - (sizeof(u32) * 2); + buffer->max_data_size =3D rb_subbuf_capacity(buffer) - (sizeof(u32) * 2); =20 buffer->flags =3D flags; buffer->clock =3D trace_clock_local; @@ -2818,9 +2858,8 @@ static struct trace_buffer *alloc_buffer(unsigned lon= g size, unsigned flags, if (nr_pages < 2) goto fail_free_buffers; } else { - /* need at least two pages */ - nr_pages =3D DIV_ROUND_UP(size, buffer->subbuf_size); + nr_pages =3D DIV_ROUND_UP(size, rb_subbuf_capacity(buffer)); if (nr_pages < 2) nr_pages =3D 2; } @@ -3203,7 +3242,7 @@ static void update_pages_handler(struct work_struct *= work) * @size: the new size. * @cpu_id: the cpu buffer to resize * - * Minimum size is 2 * buffer->subbuf_size. + * Minimum size is 2 * rb_subbuf_capacity(buffer). * * Returns 0 on success and < 0 on failure. */ @@ -3225,12 +3264,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, = unsigned long size, !cpumask_test_cpu(cpu_id, buffer->cpumask)) return 0; =20 - nr_pages =3D DIV_ROUND_UP(size, buffer->subbuf_size); - - /* we need a minimum of two pages */ - if (nr_pages < 2) - nr_pages =3D 2; - /* * Keep CPUs from coming online while resizing to synchronize * with new per CPU buffers being created. @@ -3241,6 +3274,12 @@ int ring_buffer_resize(struct trace_buffer *buffer, = unsigned long size, mutex_lock(&buffer->mutex); atomic_inc(&buffer->resizing); =20 + nr_pages =3D DIV_ROUND_UP(size, rb_subbuf_capacity(buffer)); + + /* we need a minimum of two pages */ + if (nr_pages < 2) + nr_pages =3D 2; + if (cpu_id =3D=3D RING_BUFFER_ALL_CPUS) { /* * Don't succeed if resizing is disabled, as a reader might be @@ -3513,7 +3552,7 @@ rb_event_index(struct ring_buffer_per_cpu *cpu_buffer= , struct ring_buffer_event { unsigned long addr =3D (unsigned long)event; =20 - addr &=3D (PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1; + addr &=3D (unsigned long)rb_subbuf_size(cpu_buffer->buffer) - 1; =20 return addr - BUF_PAGE_HDR_SIZE; } @@ -3755,8 +3794,8 @@ static inline void rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, unsigned long tail, struct rb_event_info *info) { - unsigned long bsize =3D READ_ONCE(cpu_buffer->buffer->subbuf_size); struct buffer_page *tail_page =3D info->tail_page; + unsigned long bsize =3D rb_page_capacity(tail_page); struct ring_buffer_event *event; unsigned long length =3D info->length; =20 @@ -4101,8 +4140,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buf= fer, =20 new_index =3D rb_event_index(cpu_buffer, event); old_index =3D new_index + rb_event_ts_length(event); - addr =3D (unsigned long)event; - addr &=3D ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); + addr =3D rb_subbuf_start(cpu_buffer->buffer, (unsigned long)event); =20 bpage =3D READ_ONCE(cpu_buffer->tail_page); =20 @@ -4767,7 +4805,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buf= fer, tail =3D write - info->length; =20 /* See if we shot pass the end of this buffer page */ - if (unlikely(write > cpu_buffer->buffer->subbuf_size)) { + if (unlikely(write > rb_page_capacity(tail_page))) { check_buffer(cpu_buffer, info, CHECK_FULL_PAGE); return rb_move_tail(cpu_buffer, tail, info); } @@ -5012,7 +5050,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_bu= ffer, struct buffer_page *bpage =3D cpu_buffer->commit_page; struct buffer_page *start; =20 - addr &=3D ~((PAGE_SIZE << cpu_buffer->buffer->subbuf_order) - 1); + addr =3D rb_subbuf_start(cpu_buffer->buffer, addr); =20 /* Do the likely case first */ if (likely(bpage->page =3D=3D (void *)addr)) { @@ -5799,7 +5837,6 @@ static struct buffer_page * __rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) { int max_loops =3D cpu_buffer->ring_meta ? cpu_buffer->nr_pages : 3; - unsigned long bsize =3D READ_ONCE(cpu_buffer->buffer->subbuf_size); struct buffer_page *reader =3D NULL; unsigned long overwrite; unsigned long flags; @@ -5947,7 +5984,7 @@ __rb_get_reader_page(struct ring_buffer_per_cpu *cpu_= buffer) #define USECS_WAIT 1000000 for (nr_loops =3D 0; nr_loops < USECS_WAIT; nr_loops++) { /* If the write is past the end of page, a writer is still updating it */ - if (likely(!reader || rb_page_write(reader) <=3D bsize)) + if (likely(!reader || rb_page_write(reader) <=3D rb_page_capacity(reader= ))) break; =20 udelay(1); @@ -6380,36 +6417,44 @@ EXPORT_SYMBOL_GPL(ring_buffer_consume); struct ring_buffer_iter * ring_buffer_read_start(struct trace_buffer *buffer, int cpu, gfp_t flags) { + struct ring_buffer_iter *iter __free(kfree) =3D kzalloc_obj(*iter, flags); struct ring_buffer_per_cpu *cpu_buffer; - struct ring_buffer_iter *iter; + + if (!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 04:13:04 2026 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.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 2C5B437E2F3 for ; Wed, 12 Aug 2026 15:33:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548822; cv=none; b=uqj6siycWvM/6PjA7FMyObjgMt7AhxstLSmExfFUZZORx6Ijrv/z5OeEWZw2Rk8t9dAQlqd3haX+zFRZj+Tm45KMqewJmiviNznaAX70BkN9/gRgarE6yC9EearFhhuuDk/4hYsb22sYd5oWdwtFgWzWySn5mC+0G8hLhd/yoWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548822; c=relaxed/simple; bh=MshSAdzlkn4ap22AVygvjx0jv1ySj3uhv1qD48JSN/A=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=u3/J0YXce5ghqOdoyDn/7J70SiDgWBdv2Jz7gGM74cg2OqggAYxOALwKX0qe4/t/0FcLjVKg0Hh44IXvd/JQaAScPAg5r1hTFyodVhLNlXntz6QBbLFM7TkWJGPbG8VPLMHJkUypp9BxZRmpw0jNbvOj36DauZzWuFG2P+ZAHzQ= 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=YBrJLiS+; arc=none smtp.client-ip=209.85.221.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="YBrJLiS+" Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-47fd4ee0ac0so996702f8f.2 for ; Wed, 12 Aug 2026 08:33:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548811; x=1787153611; 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=eZ+oGpfrYdP0u5dy7mXQ7HlJ9v4mKCq4nCtAk0vOwG8=; b=YBrJLiS+kfOvqfHFrg3TsduISAs+eLb0foc2K/bZrZbX/00k/aFcNppx6C8djtLVen chJTP09C4omu4/+xYCTXGQGtwlmdL2ixL7ESlfo5dtzpUFUJEBWNyDF3+eeiDA0YVfIu kIIZKlE3lFTDA0RcXX9Cy3lbNFhgQkse9tu1PfhpA2FZ+nv5Lv3nXE/cxxjew3XdGqH9 8Hb0SIjHvGEHZ2h1+iziXVLf9EjZUrLYLotiZ+HIzTFtzijK/GWjt3ue+lL+llhTAsfc xQhRSAJZoLkziy1C2M4PHr9+wUQS0j5bkFJSZLI73cUBivpXoUpLOrsTPOan2xPY2Kd4 NP7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548811; x=1787153611; 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=eZ+oGpfrYdP0u5dy7mXQ7HlJ9v4mKCq4nCtAk0vOwG8=; b=saTkCjAM+9rjJdbhPLVT3kX7/EEN+wTd9JQ0Y7e/g+O2ZAm+nrxohyEXReIu6jv53v gANWYvL5CKeISf/u6CrV4Eun6Y+5qA1cd3qvn32nBWslo3ilvlFjkU+tJk9yJFakzjOl k3yA5n7fWImTXginIJzh4do5cgu7aHNFLW5ltFDQEvVUCsvZ+xUacAowjB+bFQrNO9Pb YD45f9btYqrfokSyhxL2ub4QHeam+c1cBXDJqtSDZ0EH3IhKYQ22h7HOBzTs6No3YEQf BpuhfZkSixU4dcFVMULHpfYa7Gdb2zEwBm5aFEseIGDDofOySNqQzv4zDLk0fNoLMiVg 3XQw== X-Forwarded-Encrypted: i=1; AHgh+RpcAynXCvpvDRFhn++tq37RxgYNUu/azy03ckb1ba1du8NJ01q8avjr9z3Jdt0HHAZh3/5InEkhvbj1a08=@vger.kernel.org X-Gm-Message-State: AOJu0Yy58VNeMRHdS0k8IBRAipbNoPHgyhlkai/YlRwFd7FyY7S7pkUl TX0p7DaLun8wUiqm8/pnL2hPPHF+8Pwq6nieEudSb7mkbJ7w15Pyqni0WZeRGHuagFxEYkyHVeI +a2QVIviSjkW5ji+DCwfVdQ== X-Received: from wmi18.prod.google.com ([2002:a05:600c:212:b0:495:6708:efe5]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3b17:b0:497:ff73:68d5 with SMTP id 5b1f17b1804b1-4997bf7d7ffmr73532505e9.0.1786548811300; Wed, 12 Aug 2026 08:33:31 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:05 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-5-vdonnefort@google.com> Subject: [PATCH v4 4/9] ring-buffer: Fix subbuf resize race in 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 97449423d3a6..94552a433228 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 04:13:04 2026 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.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 8AA54468C28 for ; Wed, 12 Aug 2026 15:33:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548824; cv=none; b=hXSC7BGpRlYN5RRtNuDn1ZKxa/6XuZOTL+u7iFmPNwLLZV2U4T/Ec5LLmvpvOuImqHM4hbZwRdAG5TYEooMlQRGurpRqTkVl6nagsQX9CLrcOU/DOB5038uUAKgMGwpFBPm48+/BJw5ZxeFI/O5ZtnPMtIzdYcQoOMo47AzGdMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548824; c=relaxed/simple; bh=6FtLsQYKVQkq8eKe4kxIxaeChk70Ii2CX2Fxd1Baa0s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jKyhbQ+Jl9gQ4/lpgFneR8Zu1sdKoHSQ2Sg/HnGXpdyYX8YOwcwoM5bC/3swtrGlJvQpY94kp7YZ5UyTNg/Yk/VnfyxZjYu7v2Mg+kYBnskcIG3Ie3mMXH/dulwdfXYUBBaZPszHH8ZkL9R3WRPFAT9T9oZIHDEgFMfxDS/S6Zw= 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=m/yaHrHx; arc=none smtp.client-ip=209.85.221.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="m/yaHrHx" Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-47f810c8aebso650300f8f.2 for ; Wed, 12 Aug 2026 08:33:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548813; x=1787153613; 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=DKE00euLggKlVbFxAuzkgaPfYF8e4gj5N76eLvD7Pfg=; b=m/yaHrHxqp0qSSF9G+YNMJu69Jg5+WYs9mFVcFabMkwkERlzDP4BpRYh/INXJmmZzh lnS4cTl0LCwBg3s9qg/aSHyFi59mNFrDO/3LzKW1DEj3Bx/+cvhvfk61tMApY4NYrtqY UQcf2iYomqwlFJI1oapPo9gGuXiHrBVl66rgeuL18tvqIcT5ZZchnnP78/MWmunteh2j 6sdJjCikvy8b+p4du2nMNPVPZj5sEXD2GA6mZ+RdxQEs7vv+MfKbYuJIW1pcrEGkMfNp LBefrt7Cdx+ejXv4DaNOdAzWlYQNbPhcRuV6s3cwfBdgrpCc8ninZz4m+NMUXYSTjE8W sNVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548813; x=1787153613; 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=DKE00euLggKlVbFxAuzkgaPfYF8e4gj5N76eLvD7Pfg=; b=EYK204tlGI34I/50vxpwg1Psf2UQu7q1kh37D23xrnZdPrylFC/UI5nKiVZSXUvagz U/o7jH6NtNb1qS/Tr0cGtSWIHYFdqY0cEAbTeaeqhvxr8ZJY5abcG5X7/BGhNKVUsfQz l5QZTsHytR064TlFQpTWCcXtkIMCgGVYO/8G8XBvOYi64HRfUSMlVFMqsnOG+S1gcjhX vKcwhF70B6Qn8qDKADQCi413Z4bcnJaWmDCFT/1j/wkS/unyf9IgM/XB1hmsALK4iJqS 47jF8CJGXshajzfeTEReK/mfzQ3MnxT+PdoFoHBJ79AQYYvpWhQHjby9ihbM9WRkTQJ6 WH0w== X-Forwarded-Encrypted: i=1; AHgh+RragRquEALJdZ4QDLdb/JnIUAA4NjQW+wR7EQHKOmuehnqmqoktY5VpMWFkEfJDWlL6KCUIy7u23u2xZy0=@vger.kernel.org X-Gm-Message-State: AOJu0YwkajYvzHSMO8ofIbZuXLfNrHcMkiyXLLE2ZX4mRtu4uUGDKFcx NJU8ZEM8yLmrQvt0yp5yVpP9VQ64VU6Fibxvt+opEszqBeqe7cxp2yEEM9CfmDeq/A7rzPX2yIZ pCyqUrX+8RxYBtnysUDTJoA== X-Received: from wrwk14.prod.google.com ([2002:a5d:66ce:0:b0:45e:6a78:7fad]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:5d89:0:b0:47f:fb57:8c7f with SMTP id ffacd0b85a97d-481528fb898mr7955494f8f.29.1786548812612; Wed, 12 Aug 2026 08:33:32 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:06 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-6-vdonnefort@google.com> Subject: [PATCH v4 5/9] tracing: Fix subbuf resize races in 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 94552a433228..f62d6853ee5c 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -6988,22 +6988,34 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); * 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 buffer_data_read_page *bpage =3D prev; struct ring_buffer_per_cpu *cpu_buffer; - struct buffer_data_read_page *bpage =3D NULL; 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); - - bpage->order =3D buffer->subbuf_order; + order =3D buffer->subbuf_order; cpu_buffer =3D buffer->buffers[cpu]; + + if (!bpage) { + bpage =3D kzalloc_obj(*bpage); + if (!bpage) + return ERR_PTR(-ENOMEM); + } else { + if (bpage->order =3D=3D order) + return bpage; + + free_pages((unsigned long)bpage->data, bpage->order); + bpage->data =3D NULL; + } + + bpage->order =3D order; + local_irq_save(flags); arch_spin_lock(&cpu_buffer->lock); =20 @@ -7020,7 +7032,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 +7055,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 +7335,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..0409d20a168b 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,31 @@ 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) + info->read =3D 0; + + /* 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->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 +7124,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 +7141,12 @@ 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 +7267,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 +7280,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 +7293,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 +7302,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 +7329,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 04:13:04 2026 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.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 46CA74746C0 for ; Wed, 12 Aug 2026 15:33:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548821; cv=none; b=raPisCYx1MPDPdJVfwq0imdeueJi/rw7hxjGlqgwnj4mbMxA9GpXGgIeEyfckm3cCu2ksIRdRT6ZtvgxohQGurppkxT1sl2PbCZwhe63kP8qgAsJU0zpcV+zaCgUqKbmAM7Ly3AX6akoLnmixzkXtdOF65k+dvR3qvf11Bygs70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548821; c=relaxed/simple; bh=/1BEHT5uq1pyqX/1MtifH9+r16Vbs7owcMJT5u84RA4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rcqkZ+EMu3sobkHCPwI86oTPfH8uNK6zENq9YceFK91Z94SJ6/cMbcU2kJp/T7PvmcA0ibsVvATVySk6DDqFXrdttsheZCpyJqPbSjgE5xCjYGZbRNzOV09GUBV3Y0EF+s+qgsnnL+VyYZUxaekR6pqqk7h6RzgXL8+sSK7j0ho= 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=uaKIPR0U; arc=none smtp.client-ip=209.85.221.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="uaKIPR0U" Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-481558a96e2so467331f8f.3 for ; Wed, 12 Aug 2026 08:33:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548814; x=1787153614; 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=wvWrlX1DNJnVnzYlaWcWtcytq+ZX0Z/C9DkS8y8QXl8=; b=uaKIPR0U8qGg/kvydngDQGXl8dQOWaiocQIuwhn3uSBrxYI2l+kKeLRle5jcxh9+xe nAaE/OBBkdsiQCCqI6oGsRSDi6924RPEJb6l7O+BnG4OrMWuiBBgrPi/AN65OWllQDmU P4UaGLoAJU3B2JFkjrMGu9iLM8Fce1JFUW0FgArNdpl2jSw6qro6Te1CVvjogHaB+MqJ vozWh1ZFK1rLQ5qzFX5mT6dbGUS7cW12t4q5njxypEHJRAPs8RwIXNo7GIQbuLe3h8wA VZIMsDqI/ari+4lMiK3LY98CP/Tal4u2abqtjIvF5MLfCnLzkoKn5n+00WggMVYD5s9U Pajw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548814; x=1787153614; 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=wvWrlX1DNJnVnzYlaWcWtcytq+ZX0Z/C9DkS8y8QXl8=; b=WmNXWM6hUzx7AZKXfubNsRcx4cxTSVi8z4IO1kKq1nz9RfvxlfuiC5A1Pw3/rfhSO0 2jlk1fyISXQid9oPSVFNw4pbE8JhXyKT77QJCsB3oLDkIRm2iqY9EsDt5JHG+g7wLD/H PrtEBDYbAQANCkB+KZkhUtFcLTONAHJPLK5JA6cFE8xaUFJoplzOy/+bulL1gs70Gpwk 7AL1qYFp5UmanohrPuCmXPSLxLJMvD+M5ByU9Zbf768bQ/lZa4IfpGHUVcY3QzZiVKux StVSxc2sptsSbxgz2WA7H6i4QLmt7dlEsfPGh59loGoLIf7ws9S1OGUC0guWfp0vuI5F aN0g== X-Forwarded-Encrypted: i=1; AHgh+Rqa9dwBl7BMiUOcLhPe2B9Dx/MzdbzxpMUxHmehbjCAMIsUIb9yQCMawc3rBGdfHtroBUhhkXRV/PUNcSA=@vger.kernel.org X-Gm-Message-State: AOJu0YzblkkMPSUhBUtGqXLaG6HR929gY57yVlbFiDS9wnGWE5sR8rRu QbH35zfcx2OgDm5epPomnQAMo3Bkc/fPFQZTVZmTKZnwqKzdkOEjQxsOrtPWYJzweDCg3nw51Yi QnaH9YThcE3dkyCVZluia+w== X-Received: from wrux12.prod.google.com ([2002:a5d:650c:0:b0:47a:db72:56a]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:2612:b0:47f:7b75:9dfe with SMTP id ffacd0b85a97d-481527aa517mr8598688f8f.8.1786548813673; Wed, 12 Aug 2026 08:33:33 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:07 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-7-vdonnefort@google.com> Subject: [PATCH v4 6/9] 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 f62d6853ee5c..64bf4ac853f5 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 @@ -7976,7 +7990,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 04:13:04 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 4C55E25F7A9 for ; Wed, 12 Aug 2026 15:33:37 +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=1786548829; cv=none; b=QuAmmXOdehLQm/VDVJytkXtkHBf1SBtLbCjEn0+aFyXGN1FdgZZ45iNudpstQmX1DTUXfQAvoWGIiQU0wzLSNf10br6i//agatL3S1Xqhxz4MKl9HKaWppIWELI+utK6I9KJHvOPbo7Ec67A9flI6kiGgnECGjYKk2oDG9wAFUg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548829; c=relaxed/simple; bh=s1m9DAmSLCrK4/8z9sVzr3RER4/TQ+xkHgkY6e97XCo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=s12wSjehjtTEOkdmsTUemh3u4dDL5S8Z9r4RcWZkMzEIkxXvg7BGpgJqnu11LdnRe2tU8hHzzsp+4LI+T9yHc/IyzRGZ9Ruj5fv+V5H+xcslkaAnCdc0XSOR9LRJlHavfmhx4rsdLG1YyCDKtDxx32oArn2M9wpRmooo8rev0cQ= 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=WQbcFuAk; 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="WQbcFuAk" Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-496bbcf7d1eso8736885e9.0 for ; Wed, 12 Aug 2026 08:33:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548815; x=1787153615; 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=QI3UvYLuPuA+hRm1RW90Kgyz8hvQU/zqrTzCV3AJA6U=; b=WQbcFuAkZ2tEljF+FTSX89F7+qeXeJQvTNUETsLThyajdnNFLEN/fxS4qeN7zJctIM cONFApkc2GjrFqGrmvg5cVbJDsgbeCg651VNKjIKbQicNKJtj1s70MoV3W1aYne8LAr1 Yz3+ZQ2TBPBdAs1xWZetBRpT0iM7IvLLEf0FgMdJ4AcSKU0WrgemcXq2fn64FCAJzSr/ OhahhtDU0jPo/vXXsSVSg/qNwqTkO3mhn6FYcAjd1xPbCQ9IjcgniO67plR+KYTVOOcF sIFQeuRvDnl0AFjWlsHn8ew3x7X4R+7xn0Dg0bflNs0tjlKtqNpg0fazJCLCykB0tmkV e5oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548815; x=1787153615; 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=QI3UvYLuPuA+hRm1RW90Kgyz8hvQU/zqrTzCV3AJA6U=; b=fT27D7XTxXD67v+b0QIG1mIN402H1QN7oYSafIB9MPMnc+Bu66NkjX9s2tbxvsW+tG GZH79tzHD01cLpp9TzGpaN2riT8ZrH5BjwULhxSm20xSzRxfCPHd7KTk/DUC/NB03eJP YXTxhedkACkabbeXxQbg9oi1SaN5whdYV1pAt2k8plK3rG6nvM8sEjScmKQ1bsHDuzgN LhoZyZErfKB6Fc9IY1BMba2P7ri8F+eMkIq/0rA5OApDDshqVJKoJiYzvwIP4VIGujrH rtaxyy8SdRtuv0Wo8BwVJRy23LVQhHPfhtzBZKSd9KKxkifjpqWDLOOydx7AvrQSeHvf Dmkw== X-Forwarded-Encrypted: i=1; AHgh+RpY73kwU2GjpzXNp+VvOeJbc3e8f66OS2N1BIIZCGh9BNrtwiwEZbw2oKEwEMFF2tsE8Ly0rKR3Zp7b9jA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3++iQINm+kYziIwDg00KCKxIiQndxmeLJlcWaVxFjdIUIyFnc u6FZZEvVA04tVr2T+E2nIVOYSiQ9E8b6RgDZuYSPuybRVHHdFMCCIOKzsEDFumpkxq80Oi4bcjD nTx7u5ebzOzFxhZV0ukSs+w== X-Received: from wmga21.prod.google.com ([2002:a05:600c:2d55:b0:499:7e24:a8c2]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:628d:b0:499:726c:d658 with SMTP id 5b1f17b1804b1-4997c170c80mr92302515e9.19.1786548814925; Wed, 12 Aug 2026 08:33:34 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:08 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-8-vdonnefort@google.com> Subject: [PATCH v4 7/9] 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 64bf4ac853f5..45aa10f0b17e 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 04:13:04 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 E0E7D463B9B for ; Wed, 12 Aug 2026 15:33:39 +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=1786548827; cv=none; b=fWfPuQs7dKZFYgxLDNfkav0luoaFb4cvBEgz6e8+JtCezqSHYA7FYg5Z484gwOzwUb+cki53ztCrycN8YQuQ6W/ymQ42LY9yqw9fJNJrdmfnSmspkMfHhFWGDjea3DGS+EceZA0mYKoG0cYXECwGAqYUyyXmDq2Tgs9d4aVnq2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548827; c=relaxed/simple; bh=mXZOFdsJW8G6Lb5PUuw6s4qnNp0ezQNkWvaerQ2qRqA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=czJ8MAnWUClQ1SFws/8tmniKEWd1YNEqCvus5xaPtFUPx1nYfJP/Q4jEiyEAz7AdcMGn3mtuPWYSFGeY4PEScF/1TKh/eW425+GPax+CbxQdP1BUhOmFnh9ZJbQHSbyVt5STwYII4Zct5tq2qCsevSSCPwhQBrrYJllorpbN7O0= 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=WA99MOzJ; 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="WA99MOzJ" Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-495474a5fbcso10321945e9.1 for ; Wed, 12 Aug 2026 08:33:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548816; x=1787153616; 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=pz5loxNScpg5U4ANTwZht/BDh0bp7SxZ2CSKSmSMePM=; b=WA99MOzJ3WZGy2GKGZBbLvS7mxX7zq+pSDfBoQHPxXiWH4UYlvEr+lhcwo7mYnr6c+ HVxUwyORxMmkqbvyhAz9vk85Vz0V8VgZUnqPXKEgrDMfXu/G6ti8MW0/iiL7h85BRXra 55ZDBBuQlkM17Swg0ZzvkmJbgQL3183FAfYIS75T6E+t6yJmIjWxEERlznsfc+GxL/io W7Usp5DpoTKk2Bf7N+RMNk6Z4UFgmBbTqERKfA0ApQR3trIA8ULO1pdWASI25EHi88GW XafTlliD6UzKYUOPEWDjFGKOnHBv7P1ukaqODUk0LQxnXzQa5j4H73HqR43FVTO9qDvl SKng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548816; x=1787153616; 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=pz5loxNScpg5U4ANTwZht/BDh0bp7SxZ2CSKSmSMePM=; b=bBS0zgw/4z7EePyRa4H//RWdV+XLsptzGxxgkG1I7PY5eTd31iuiXhSCD3DPQuDKoO gdGC69XMfhu29oi5tsPJddeYV7AAP4Bcb0wW5K9h19CeImAg77fUnFxckjsYSOScq3Mp cJQHzVx59YO0FhgA22gA8TNZUVVhi/s0GOuKBqgCvWa73KvHz4Kp5jCMm3nFAivhCJWr noUXsUE+QuKwzTJpsULWxWzNnMZMwMocIs6+tlcJLY/uEkpNBYgM4MG4Odmt4539lQAD 1jIlujY4RzmlnDHlw9YK5wKYEn27rHyjJdIeN7jQmT6aBw2j57jWz1YGBU912P5Lb6cp 3ZPg== X-Forwarded-Encrypted: i=1; AHgh+RoqsTw3f//F3PRy5AFqwhwqFikTDfAGTGdEJx4D6e5D3lB47OvqalHsvgnnWW7V8xdN/mdwU7JWLB5qBio=@vger.kernel.org X-Gm-Message-State: AOJu0Yxjg9G6qQ9NYkQes+rk9JE/DxgWdjUzez9g07arIA0NcTLrU7SC 8vPAsFHWKc6XHusrotq8QJMvrAREqztd+uHDZI/JXEWP7BjchusPfjxeWYubS59KrDsI7XGUpKQ uesEG8PEz6Zb8yf3lcDRBvg== X-Received: from wmmp22.prod.google.com ([2002:a05:600c:656:b0:493:c2c8:a251]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:16ca:b0:493:cefc:d113 with SMTP id 5b1f17b1804b1-4997c0f207emr55994315e9.5.1786548816339; Wed, 12 Aug 2026 08:33:36 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:09 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-9-vdonnefort@google.com> Subject: [PATCH v4 8/9] 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 45aa10f0b17e..990a904cefe8 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 */ @@ -7157,7 +7159,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; @@ -7196,8 +7197,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 @@ -7207,7 +7206,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; @@ -7668,11 +7667,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)) @@ -7681,13 +7676,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); @@ -7859,7 +7851,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 { @@ -7916,8 +7907,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 04:13:04 2026 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.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 6CDB2470135 for ; Wed, 12 Aug 2026 15:33:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548831; cv=none; b=Y9vxKbsaTTqRrFCuPvhnThLWfIXcbzfOy63/otfm50jnSPOFGyToxEhNj0rkkdHhHvkl96FOFLmK4e/8gJeoCfu3FA18GF/Qt4RNQnCp96lQxLZ8vPwAD2p4e0unJpFn7Q7/ln1uXYNMISVD82YHyxS6OXEq7IPeoeIj6r/nTkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786548831; c=relaxed/simple; bh=+u6ruKpjI/mWvcOQC900P9kpILcTPVL6PLWAoMyJvcw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=t7rnd8ybHl1aBTsOl/dweocYF4vG2u6i0Q7vCVqaQ/aOnr6rv5rdRR5edsa67/z0us6qVZJJQZqavaLRzQTIsgckvVrkZ66ZNGm/SB7tyOkoJ097p7kMuXlt3txNpjcu1OMUUXe5S6wYKOvBwfT/EILtgmhJ96ZbjMB3jAv6/Wc= 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=SYxnZkU4; arc=none smtp.client-ip=209.85.221.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="SYxnZkU4" Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-47f6e658363so701830f8f.3 for ; Wed, 12 Aug 2026 08:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1786548818; x=1787153618; 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=Al1AI1+q4Ne9/j+b+G1Wtjun9dFKpJAeJ0Aj+hRFSRI=; b=SYxnZkU4UukSVBTCDUEzBA2LvfL8HvOgSwzLoZzXepFGsTEIPEpCXEKpV46o8EfJtL VtGeK8s3MlbuvgOKBlZrJRenb5MfVKg/y+2L9PdQBBoe+2mUEkrzmzBeIZxxrZBZK9OL q7rwUslLLyh4Dh/hprbH8T0YhQUfoABGy6HVqwm2AvZoODVjuoxKwBh43+/EetqQ2uJD DLHZ+iU8ufdfP6+bIGBLku9qZFew6Mg+2xVowKR3Ay0naaM9mcHbz7+poNIwAffW31IN nB3NEAXmyc6blIwZq7W+PNvgGkrIn8iD2MBjAKRGYvjYseO/jDv2Mmmv8ZTEccFJv8jd qdmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786548818; x=1787153618; 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=Al1AI1+q4Ne9/j+b+G1Wtjun9dFKpJAeJ0Aj+hRFSRI=; b=swp2mSaWiDNrkyUk9KTIRxAlcS633bkeq/VzcE27l6ykefbHN63wzPT7xhn+eqD7Ex 3hloUJhzbUen98ADIuS0mmwzesYl8+sOgcYNxIQg6B4JP/sX4aaTqrjb/xM6g0rhDM3V 095jTJAMY+TRwpKJmr5SOcI48jP+ErU7TemA3vq2Oeehr+AoDW7QoUUHmehTyoNePIuX 57LoI9SCwvdxSRaMtR6zqNpOSkf7x8xMz66vSa4er90EZsf9fRQG2Hk9/MT8qHaBt+uh iXsU1/a5iNGJbirkLH+0LdRXuBZ50G6w+cs/DAz1hb3IKiK9Sob+6EhRYE5IpmveCmS7 JGNw== X-Forwarded-Encrypted: i=1; AHgh+RoLOK5h8krHLzqCd42Iehl6bdpDzynAp0Cd/jNcMVD417G0tQlXZ1a9wTqsRTPjb/B+73oDBjoHTtNIkFk=@vger.kernel.org X-Gm-Message-State: AOJu0YxjplKXCLVJ66j4Jo+jF4oSa7EdlDhhbZuOr0lYC+ssZ87Ew5go rjY5bqH66qIXfPuesf3Tl+xTX4RdIuGbKHT5A7rpO7kauhD7aFz3MCdxvAF91+HxUw3kiZ3ZDC/ oZBD37uawrlH7V4dsWHQXtw== X-Received: from wmj11.prod.google.com ([2002:a05:600c:24b:b0:493:d1ba:af39]) (user=vdonnefort job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:8b2b:b0:499:4b5e:4077 with SMTP id 5b1f17b1804b1-4997c1306e9mr93335985e9.19.1786548817630; Wed, 12 Aug 2026 08:33:37 -0700 (PDT) Date: Wed, 12 Aug 2026 16:33:10 +0100 In-Reply-To: <20260812153311.2328812-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: <20260812153311.2328812-1-vdonnefort@google.com> X-Mailer: git-send-email 2.55.0.691.gc56d675ccc-goog Message-ID: <20260812153311.2328812-10-vdonnefort@google.com> Subject: [PATCH v4 9/9] 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. Signed-off-by: Vincent Donnefort diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 990a904cefe8..2fccb950e593 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_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, int subbuf_size, unsigned 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); 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) @@ -1840,7 +1840,7 @@ static bool rb_meta_init(struct trace_buffer *buffer,= 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; @@ -2231,7 +2231,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 +2331,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 +2417,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 +2520,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 +2545,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); @@ -2773,7 +2773,7 @@ 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; + unsigned int nr_pages; int subbuf_size; int bsize; int cpu; @@ -3037,12 +3037,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 +3264,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 /* @@ -6522,7 +6522,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 @@ -7412,8 +7412,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; @@ -7459,8 +7459,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) @@ -7702,8 +7703,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; @@ -8033,9 +8034,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