All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	stable@vger.kernel.org, Tengda Wu <wutengda@huaweicloud.com>
Subject: [for-linus][PATCH 11/16] tracing: Fix hist trigger timestamps for buffered events
Date: Thu, 15 Oct 2026 09:33:21 -0400	[thread overview]
Message-ID: <20261015133404.170463200@kernel.org> (raw)
In-Reply-To: 20261015133310.731003448@kernel.org

From: Tengda Wu <wutengda@huaweicloud.com>

Syzkaller triggered a WARN_ON_ONCE(!nest) warning:

  WARNING: kernel/trace/ring_buffer.c:821 at ring_buffer_event_time_stamp
  Call trace:
    ring_buffer_event_time_stamp
    hist_field_timestamp
    hist_fn_call
    event_hist_trigger
    event_triggers_call
    __event_trigger_test_discard
    trace_event_buffer_commit
    do_trace_event_raw_event_sched_switch
    trace_event_raw_event_sched_switch

The warning is probabilistically reproducible and is related to syzkaller
executing the following commands:

  echo 'prev_pid == 999999' > events/sched/sched_switch/filter
  echo 'hist:keys=common_timestamp' > events/sched/sched_switch/trigger

The specific triggering process is as follows:

CPU 0                                           CPU 1
(context switching)                             (echo 'hist:keys=common_timestamp' > \
                                                        events/sched/sched_switch/trigger)
do_trace_event_raw_event_##call
  trace_event_buffer_lock_reserve
    if (!tr->no_filter_buffering_ref &&
        trace_file->flags & EVENT_FILE_FL_FILTERED)
        return entry;  // return directly
                                                event_hist_trigger_parse
                                                  hist_register_trigger
                                                    tracing_set_filter_buffering(file->tr, true);
                                                      tr->no_filter_buffering_ref++;
    __trace_buffer_lock_reserve
      rb_start_commit
        local_inc(&cpu_buffer->committing);  // skipped and not executed
  trace_event_buffer_commit
    __event_trigger_test_discard
      event_triggers_call
        event_hist_trigger
          hist_fn_call
            hist_field_timestamp
              ring_buffer_event_time_stamp
                nest = local_read(&cpu_buffer->committing);
                WARN_ON_ONCE(!nest)  // trigger warning

The root cause is that when an event file has a filter attached and the
hist trigger has not yet been attached, trace_event_buffer_lock_reserve()
writes the event into the per-CPU trace_buffered_event temp buffer instead
of reserving it in the ring buffer, so cpu_buffer->committing is not
incremented. When the event is later processed at commit time by a hist
trigger, hist_field_timestamp() -> ring_buffer_event_time_stamp() sees a
zero committing count, triggering WARN_ON_ONCE(!nest).

tracing_event_time_stamp() was added by commit d8279bfc5e959 ("tracing:
Add tracing_event_time_stamp() API") for exactly this case: if the event
is the per-CPU trace_buffered_event, it returns the current ring buffer
timestamp. But it never gained a caller. Use it in hist_field_timestamp(),
so that a hist trigger that races onto a buffered event records the
current time, which is only marginally later than when the event was
recorded, instead of warning and recording a bogus timestamp.

Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260929104015.1689921-1-wutengda@huaweicloud.com
Fixes: b94bc80df648 ("tracing: Use a no_filter_buffering_ref to stop using the filter buffer")
Signed-off-by: Tengda Wu <wutengda@huaweicloud.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/trace/trace_events_hist.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 71d7f43a7964..571a57e0f369 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -873,7 +873,7 @@ static u64 hist_field_timestamp(struct hist_field *hist_field,
 	struct hist_trigger_data *hist_data = hist_field->hist_data;
 	struct trace_array *tr = hist_data->event_file->tr;
 
-	u64 ts = ring_buffer_event_time_stamp(buffer, rbe);
+	u64 ts = tracing_event_time_stamp(buffer, rbe);
 
 	if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr))
 		ts = ns2usecs(ts);
-- 
2.53.0

  parent reply	other threads:[~2026-10-15 13:34 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-15 13:33 [for-linus][PATCH 00/16] tracing: Fixes for v7.3 Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 01/16] tracing: Fix NULL dereference when copying keys for a field variable Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 02/16] tracing: Take trace_types_lock when dropping the buffer_meta reference Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 03/16] ring-buffer: Do not show buffer_meta for CPUs without a buffer Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 04/16] tracing: Fix the shift out of bounds in the log2 histogram modifier Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 05/16] ring-buffer: Fix the sub-buffer array base in rb_meta_subbuf_idx() Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 06/16] tracing: Fix empty symbol names in simple_ring_buffer undef check Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 07/16] tracing: Fix simple_ring_buffer undef check on parisc Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 08/16] tracing: Fix simple_ring_buffer undef check on sparc64 Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 09/16] ring-buffer: Fix false warning in ring_buffer_map_get_reader() Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 10/16] tracing: Fix ignored return value of resize_buffer_duplicate_size() Steven Rostedt
2026-10-15 13:33 ` Steven Rostedt [this message]
2026-10-15 13:33 ` [for-linus][PATCH 12/16] tracing: Do not initialize tracefs work if tracing is disabled Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 13/16] eventfs: Free the eventfs_inode after an rcu grace period too Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 14/16] ring-buffer: Skip si_mem_available() for persistent and remote buffers Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 15/16] ring-buffer: Use subbuf_order in available memory estimation Steven Rostedt
2026-10-15 13:33 ` [for-linus][PATCH 16/16] tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261015133404.170463200@kernel.org \
    --to=rostedt@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=wutengda@huaweicloud.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.