From nobody Fri Apr 3 07:15:58 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15BD6327C07; Wed, 18 Feb 2026 10:14:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409663; cv=none; b=Dv81K0IXrdKqZ6xye+0Xx2apagR1Dp6wr6uoM64V37vHwlMPwTbMC4RI/zAfQj86v2m9Zpe91n9JW1//ymE2kJV5++18Hy8vaMPlS2Tna7z1hgY3F99oukigIabwzfT96gY2sl+EKLH0i1J5lMFeafBLYV53KdG2CRBexcA/ZHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409663; c=relaxed/simple; bh=NSL8LXlakBuOU2+iw8RIEkJEzD0nTYZ79OcqylTu4Os=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Qxp7izRmQKhhJSu13gClJardepCKCAULNw5pryCLCHQlyBl3OXiNTtmzAmE0Xs78BVqIoJitfHNFXYbABYrHYv3R+WuLg/uAUDZlvKuEU74RxXXqnXmJdfy7JZTHYj3Y3dM2vgN/ixWk2tCKssVwXt/KImoP79DJ53d3AN1TJeg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y8qr5pAW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y8qr5pAW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0BFAAC19421; Wed, 18 Feb 2026 10:14:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771409662; bh=NSL8LXlakBuOU2+iw8RIEkJEzD0nTYZ79OcqylTu4Os=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y8qr5pAWP24BGVzg7TLAL49mzjXojiCEIHA/AwcUoYUHt0K95993aluTyLKLNRAXz 2ZPpTko5b17LNEsD1CyPh1tG8Pb4n83ZLAIvvHibxW4qx09UGk0hEo6+e3GxMDC+qO hJkDg9xHsJPwaBjxLuLnsTZYSoFRkRoG6eWh6OSBE0ZTQ138+dffFxtFAhn2NKDQ23 3Ua/juQ8XtRyxGXSZpqVji5biMvUXBdTDKfrj6Qq0rwA2KVyOmsupH4kEGecvo/tB0 5OYm37tKF9PUYoFGcz1RsRk915N7HBX7sCi8jusvZq5LAksVB2keKIBZHsgmbVEL6u Cq4/TrRAPeo5w== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 1/4] ring-buffer: Fix to check event length before using Date: Wed, 18 Feb 2026 19:14:20 +0900 Message-ID: <177140966034.1537493.2009658315480887232.stgit@mhiramat.tok.corp.google.com> X-Mailer: git-send-email 2.53.0.310.g728cabbaf7-goog In-Reply-To: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> References: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Check the event length before adding it for accessing next index in rb_read_data_buffer(). Since this function is used for validating possibly broken ring buffers, the length of the event could be broken. In that case, the new event (e + len) can point a wrong address. To avoid invalid memory access at boot, check whether the length of each event is in the possible range before using it. Fixes: 5f3b6e839f3c ("ring-buffer: Validate boot range memory events") Cc: stable@vger.kernel.org Signed-off-by: Masami Hiramatsu (Google) --- kernel/trace/ring_buffer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index d33103408955..f7fd4bdf6560 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1849,6 +1849,7 @@ static int rb_read_data_buffer(struct buffer_data_pag= e *dpage, int tail, int cpu struct ring_buffer_event *event; u64 ts, delta; int events =3D 0; + int len; int e; =20 *delta_ptr =3D 0; @@ -1856,9 +1857,12 @@ static int rb_read_data_buffer(struct buffer_data_pa= ge *dpage, int tail, int cpu =20 ts =3D dpage->time_stamp; =20 - for (e =3D 0; e < tail; e +=3D rb_event_length(event)) { + for (e =3D 0; e < tail; e +=3D len) { =20 event =3D (struct ring_buffer_event *)(dpage->data + e); + len =3D rb_event_length(event); + if (len <=3D 0 || len > tail - e) + return -1; =20 switch (event->type_len) { From nobody Fri Apr 3 07:15:58 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D31EC327C07; Wed, 18 Feb 2026 10:14:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409670; cv=none; b=glO6OddPUW9kqhyDmnf2Vj0ZwFoHMH8QOf1UQdJBucuJeHj1Wnnk3dtP8PvChjOaa0L9nCIu+/kHrEttC3IiXaCxgSEMuroKgFD+czkxP+hh4adh6FR4iyylw+a2Kulr+gGcKqY7jxn7HLu8MLnrPDLiUdOZHDDxsaqDoQtFTg8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409670; c=relaxed/simple; bh=R7GzyDgg902KswZrSYt8lGNc9Yf1SqV4/2OamG2lcZ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=liL9Dd8uLcMPEyRUpxBz0vvpAp3eOKoXnsyIcgd/cEirrD3bKQkshDEhVgLvjXi1nwvWFwzD+a6LPxhJZAs5z1sd6OULP9g+XOj9BgO/hNsed/ewZ4fEdPITDk+r5unhq//a2UpuA0iOW030UOcXBqchNmXZAFu7TcvKzPC4dsE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aWqp6zzF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aWqp6zzF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB27CC19421; Wed, 18 Feb 2026 10:14:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771409670; bh=R7GzyDgg902KswZrSYt8lGNc9Yf1SqV4/2OamG2lcZ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aWqp6zzF/5NifdSv21paqkctSbf2BhGtP8L+G5t0gyAxz1HS/KclLGJ2+pYyhxRLK PQKVPt6Ykj9aW5prSVWwmzbFOIovvKTMDQyyRXB9ow4idKin29MvykUtSTfGn+eZR9 OU7k8WW88JZYyJIlnuNbkpIJGoJIJyttcFhi+nBV6z4FL3IvtE2AO3zZ2nYwu9OkES K1VUFoj86SYXHWcopAE86UohStg9GcoS1mZ14KDH1RtVPx0ul+GU4CPKEVy9qQ2jFe kwWXhTfL343hkZjTzJOf9EXzJBJAwKGrqRcBOsqcBNHkIOGI4fdBQsER6XYj2I4jPT ALgLXj1b6D/Eg== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 2/4] ring-buffer: Flush and stop persistent ring buffer on panic Date: Wed, 18 Feb 2026 19:14:28 +0900 Message-ID: <177140966801.1537493.7352910810257662003.stgit@mhiramat.tok.corp.google.com> X-Mailer: git-send-email 2.53.0.310.g728cabbaf7-goog In-Reply-To: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> References: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) On a real hardware, since panic and reboot the machine will not flush hardware cache to the persistent ring buffer, the events written right before the panic can be lost. Moreover, since there will be an inconsistency between the commit counter (which is written atomically via local_set()) and the data, validation will fail and all data in the persistent ring buffer will be lost. To avoid this issue, this will stop recording on the ring buffer and flush cache at the reserved memory on panic. Fixes: e645535a954a ("tracing: Add option to use memmapped memory for trace= boot instance") Cc: stable@vger.kernel.org Signed-off-by: Masami Hiramatsu (Google) --- kernel/trace/ring_buffer.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index f7fd4bdf6560..d2b69221a94c 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -6,6 +6,7 @@ */ #include #include +#include #include #include #include @@ -589,6 +590,7 @@ struct trace_buffer { =20 unsigned long range_addr_start; unsigned long range_addr_end; + struct notifier_block flush_nb; =20 struct ring_buffer_meta *meta; =20 @@ -2470,6 +2472,16 @@ static void rb_free_cpu_buffer(struct ring_buffer_pe= r_cpu *cpu_buffer) kfree(cpu_buffer); } =20 +static int rb_flush_buffer_cb(struct notifier_block *nb, unsigned long eve= nt, void *data) +{ + struct trace_buffer *buffer =3D container_of(nb, struct trace_buffer, flu= sh_nb); + + ring_buffer_record_disable(buffer); + flush_kernel_vmap_range((void *)buffer->range_addr_start, + buffer->range_addr_end - buffer->range_addr_start); + return NOTIFY_DONE; +} + static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flag= s, int order, unsigned long start, unsigned long end, @@ -2589,6 +2601,12 @@ static struct trace_buffer *alloc_buffer(unsigned lo= ng size, unsigned flags, =20 mutex_init(&buffer->mutex); =20 + /* Persistent ring buffer needs to flush cache before reboot. */ + if (start & end) { + buffer->flush_nb.notifier_call =3D rb_flush_buffer_cb; + atomic_notifier_chain_register(&panic_notifier_list, &buffer->flush_nb); + } + return_ptr(buffer); =20 fail_free_buffers: @@ -2676,6 +2694,9 @@ ring_buffer_free(struct trace_buffer *buffer) { int cpu; =20 + if (buffer->range_addr_start && buffer->range_addr_end) + atomic_notifier_chain_unregister(&panic_notifier_list, &buffer->flush_nb= ); + cpuhp_state_remove_instance(CPUHP_TRACE_RB_PREPARE, &buffer->node); =20 irq_work_sync(&buffer->irq_work.work); From nobody Fri Apr 3 07:15:58 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8638633E357; Wed, 18 Feb 2026 10:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409678; cv=none; b=uMpcqJSjFp4ZRl9022IIWZqpteTU//1MuRVVJzA1W0d/34+hG5d341XpbBrRQUIM7zRWsEHw/iMeUsNIGV4vbG4dM29LWBPPVuJPcTe2HklUmW4Xf8u0aUoydW7BxY/PqLCXpaTjMIJcO0rfShqNGzK5j9Gy1pnYudhN4t0Ld/U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409678; c=relaxed/simple; bh=eIWLO1dJaLUjIfZPhLAdmQRaOb4jn6+I7ly1t3RxCn8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tWEbF04QlI61PbiMxMGsEcq5C9wpjSn/okYUqaJkBg5c6BeA+wZULY/S3HUXBkgVzLtwXYc71VI1rrXil31XyPDkad34HU0kcEcWAvUP6awhne6Qr9XKXblLuiheYXa2tp4KF7LC9kDRzf5kgq4dTKcIBPUo7MEAciTOB8AwwpI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hHKecuBY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hHKecuBY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61717C19421; Wed, 18 Feb 2026 10:14:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771409678; bh=eIWLO1dJaLUjIfZPhLAdmQRaOb4jn6+I7ly1t3RxCn8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hHKecuBYxm0EV2jQwZi1K3xYVYBjFz2mOXnI52LOgMjYqw7v+r9sLEzNPHgVp9ivD 9yzcK5OF8RiEkmDO1jot+s91DUx4CDt25UfQGVfjuhif8882rToc2adLJBsl9dWgCI HL9CegwW+1C84i5rgsA2Lr67fLiEz3MIsqqmpt5gL22gIp3yNNa7c1LIg01DM+2c4r U2whfkbDBUQl2KzsZbKmDIYzdS/qG4acLPsdLBZH2q6SN6msu2qhG71Ju/RMN302f8 O4ubfky9SrDYPlacYqYwphZy6nclqsPu/Z/60Yf/5E6fFr+AhU82SkYX6Z7rnS7VyT pdrKDFyqSUdyQ== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 3/4] ring-buffer: Skip invalid sub-buffers when validating persistent ring buffer Date: Wed, 18 Feb 2026 19:14:35 +0900 Message-ID: <177140967567.1537493.7265236420134382381.stgit@mhiramat.tok.corp.google.com> X-Mailer: git-send-email 2.53.0.310.g728cabbaf7-goog In-Reply-To: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> References: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Skip invalid sub-buffers when validating the persistent ring buffer instead of invalidate all ring buffers. If the cache data in memory fails to be synchronized during a reboot, the persistent ring buffer may become partially corrupted, but other sub-buffers may still contain readable event data, allowing usersto recover data from the corrupted ring buffer. Signed-off-by: Masami Hiramatsu (Google) --- kernel/trace/ring_buffer.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index d2b69221a94c..0ae2a5ad8c3e 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2045,17 +2045,19 @@ static void rb_meta_validate_events(struct ring_buf= fer_per_cpu *cpu_buffer) if (ret < 0) { pr_info("Ring buffer meta [%d] invalid buffer page\n", cpu_buffer->cpu); - goto invalid; - } - - /* If the buffer has content, update pages_touched */ - if (ret) - local_inc(&cpu_buffer->pages_touched); - - entries +=3D ret; - entry_bytes +=3D local_read(&head_page->page->commit); - local_set(&cpu_buffer->head_page->entries, ret); + /* Instead of invalidate whole ring buffer, just clear this subbuffer. = */ + local_set(&head_page->entries, 0); + local_set(&head_page->page->commit, 0); + /* TODO: commit an event to mark this is broken. */ + } else { + /* If the buffer has content, update pages_touched */ + if (ret) + local_inc(&cpu_buffer->pages_touched); =20 + entries +=3D ret; + entry_bytes +=3D local_read(&head_page->page->commit); + local_set(&cpu_buffer->head_page->entries, ret); + } if (head_page =3D=3D cpu_buffer->commit_page) break; } From nobody Fri Apr 3 07:15:58 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CFCB318EF3; Wed, 18 Feb 2026 10:14:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409686; cv=none; b=e+QqP/IAw4Iv0m2KjISeGBB98Js2NPkiFNB9SGjJgX+cGB1AV1hyMVlklTBT1igqZ6FhV0cVWE3YsvWKWIpVLIdkdxl/FoefYXcWXwNIoWQrj8KjwHGnNBJ15jira80gjZtEA1LCgBQsrV3EcSqYDFWSbRyeEofeKhH15dTJYRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771409686; c=relaxed/simple; bh=zEPxgTozeXwayd3dN/+UCEPOsTsIXSSTPsBPi1Uh0R0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cfw+9b7ilxwcJdj30DlMJLH6ZCo07WQOgQfWCGvy8M7rgR3qeiBQcFQO+yutGhd33cZ93CKN9Y9XaRs39mZ0mVHa/s/sVHUHee5E1M1ha6VsZkID464+KNQa0BpbkiUl5NHEGkuPvAg6psgUIJVLbuzcncz4HdIRfueOoX2mM7A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=noK4Q9BP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="noK4Q9BP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 157D6C19421; Wed, 18 Feb 2026 10:14:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771409685; bh=zEPxgTozeXwayd3dN/+UCEPOsTsIXSSTPsBPi1Uh0R0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=noK4Q9BPNaMRoNjE7sAvQ5BRvbF7j0k7xhzphPwEbVMLP9j3l/qN0nb/xb6cXfx4A Ehw4oCc26O3WTyXRRbo1lliaMg5adIZNpXOX/yi8DgWETqyhb1GkkDrUMu37KXYhhF dobYyL6BZH2WYsZ9SOap4PZgDNOGJ0mXuAhBHxLYCTUA6hyqYvdno2rfDcaVNMC56D U3jVRwkRZuzO7ACL0AM+Nd1pPfo1XXcyW9bvThdJ8iucmMv3XHYhf97I53e+hmFSi+ 2+yqIXWZhLQv6FrOQDskiamRnvAFN2RvXeJNftCU0jzX07pQTHx8QAjF0sYCVYnyr0 JXqS5TLngffxA== From: "Masami Hiramatsu (Google)" To: Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 4/4] ring-buffer: Record invalid buffer event Date: Wed, 18 Feb 2026 19:14:43 +0900 Message-ID: <177140968338.1537493.3298484599734677165.stgit@mhiramat.tok.corp.google.com> X-Mailer: git-send-email 2.53.0.310.g728cabbaf7-goog In-Reply-To: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> References: <177140965047.1537493.15501794841217306382.stgit@mhiramat.tok.corp.google.com> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Masami Hiramatsu (Google) Record an invalid buffer event on the invalidated sub buffer so that user can notice how much data is skipped. Signed-off-by: Masami Hiramatsu (Google) --- kernel/trace/ring_buffer.c | 43 ++++++++++++++++++++++++++++++++++++--= ---- kernel/trace/trace.h | 1 + kernel/trace/trace_entries.h | 15 +++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 0ae2a5ad8c3e..98df5a67de26 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1911,6 +1911,38 @@ static int rb_validate_buffer(struct buffer_data_pag= e *dpage, int cpu) return rb_read_data_buffer(dpage, tail, cpu, &ts, &delta); } =20 +/* Inject invalid_buffer event */ +static void rb_record_invalid_buffer(struct buffer_page *buffer, + long commit_bytes, long entries, + int buffer_index) +{ + struct buffer_data_page *dpage =3D buffer->page; + struct invalid_subbuf_entry *entry; + struct ring_buffer_event *event; + long length; + + length =3D DIV_ROUND_UP(sizeof(*entry), RB_ALIGNMENT); + + /* + * Instead of ring_buffer_lock_reserve(), directly allocate it on + * the first entry of specific buffer_page. + */ + event =3D (struct ring_buffer_event *)&dpage->data[0]; + event->type_len =3D length; + event->time_delta =3D 0; + + trace_event_setup(event, TRACE_INVALID_BUF, 0); + + entry =3D ring_buffer_event_data(event); + entry->lost_bytes =3D commit_bytes; + entry->lost_entries =3D entries; + entry->buffer_index =3D buffer_index; + + /* This buffer_page has only one event. */ + local_set(&buffer->entries, 1); + local_set(&buffer->page->commit, rb_event_data_length(event)); +} + /* If the meta data has been validated, now validate the events */ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer) { @@ -2043,12 +2075,11 @@ static void rb_meta_validate_events(struct ring_buf= fer_per_cpu *cpu_buffer) =20 ret =3D rb_validate_buffer(head_page->page, cpu_buffer->cpu); if (ret < 0) { - pr_info("Ring buffer meta [%d] invalid buffer page\n", - cpu_buffer->cpu); - /* Instead of invalidate whole ring buffer, just clear this subbuffer. = */ - local_set(&head_page->entries, 0); - local_set(&head_page->page->commit, 0); - /* TODO: commit an event to mark this is broken. */ + /* Discard invalid buffer and record it. */ + rb_record_invalid_buffer(head_page, + local_read(&head_page->page->commit), + local_read(&head_page->entries), + rb_meta_subbuf_idx(meta, head_page->page)); } else { /* If the buffer has content, update pages_touched */ if (ret) diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 7894bf55743c..667834edb5b9 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -57,6 +57,7 @@ enum trace_type { TRACE_TIMERLAT, TRACE_RAW_DATA, TRACE_FUNC_REPEATS, + TRACE_INVALID_BUF, =20 __TRACE_LAST_TYPE, }; diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index f6a8d29c0d76..df39fc245ab4 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h @@ -457,3 +457,18 @@ FTRACE_ENTRY(timerlat, timerlat_entry, __entry->context, __entry->timer_latency) ); + +FTRACE_ENTRY(invalid_subbuf, invalid_subbuf_entry, + TRACE_INVALID_BUF, + + F_STRUCT( + __field( long, lost_bytes ) + __field( long, lost_entries ) + __field( int, buffer_index ) + ), + + F_printk("lost_bytes:%ld\tlost_entries:%ld\tbuffer_index:%d\n", + __entry->lost_bytes, + __entry->lost_entries, + __entry->buffer_index) +);