Re: [PATCH v4 1/3] perf sched: Suppress latency table output when trace samples are missing
Aaron Tomlin <[email protected]> Wed, 29 Jul 2026 23:32:13 -0400
| Newsgroups | org.kernel.vger.linux-perf-users |
|---|---|
| Message-ID | <ekl6ozvbjfhocpqhmxghvtcv5piyqg6sstfvy73s4fn5logxxx@7yikyncrucq3> |
On Wed, Jul 29, 2026 at 03:00:38PM +0000, [email protected] wrote: > --- Patch [1]: [PATCH v4 1/3] perf sched: Suppress latency table output when trace samples are missing --- > commit e9be5c25be0368a795779cd7fdb10479f3b3c099 > Author: Aaron Tomlin <[email protected]> > > perf sched: Suppress latency table output when trace samples are missing > > This commit updates perf_sched__read_events() to abort early and return an > error when trace samples are missing. It also adds callbacks in cmd_sched() > to support pipe mode streams and adds a null check in map_switch_event(). > > > diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c > > index 7fd63a9db4574..fabd99a18aad4 100644 > > --- a/tools/perf/builtin-sched.c > > +++ b/tools/perf/builtin-sched.c > > [ ... ] > > > @@ -2001,7 +2001,7 @@ static int perf_sched__read_events(struct perf_sched *sched) > > .mode = PERF_DATA_MODE_READ, > > .force = sched->force, > > }; > > - int rc = -1; > > + int rc = -1, err; > > > > session = perf_session__new(&data, &sched->tool); > > if (IS_ERR(session)) { > > @@ -2018,18 +2018,25 @@ static int perf_sched__read_events(struct perf_sched *sched) > > if (perf_session__set_tracepoints_handlers(session, handlers)) > > goto out_delete; > > [Severity: Medium] > Does setting the tracepoint handlers before processing events work for > pipe mode? > > Since the evlist is empty in pipe mode until events are processed, it appears > perf_session__set_tracepoints_handlers() won't set up the handlers. > > When samples later arrive in perf_sched__process_tracepoint_sample(): > > if (evsel->handler != NULL) { > tracepoint_handler f = evsel->handler; > err = f(tool, sample, machine); > } > > Will they be silently dropped because evsel->handler is NULL? > > > - if (perf_session__has_traces(session, "record -R")) { > > - int err = perf_session__process_events(session); > > - if (err) { > > - pr_err("Failed to process events, error %d", err); > > - goto out_delete; > > - } > > + if (!perf_data__is_pipe(session->data) && > > + !perf_session__has_traces(session, "record -R")) > > + goto out_delete; > > > > - sched->nr_events = session->evlist->stats.nr_events[0]; > > - sched->nr_lost_events = session->evlist->stats.total_lost; > > - sched->nr_lost_chunks = session->evlist->stats.nr_events[PERF_RECORD_LOST]; > > + err = perf_session__process_events(session); > > [ ... ] > > > @@ -5167,6 +5174,9 @@ int cmd_sched(int argc, const char **argv) > > sched.tool.namespaces = perf_event__process_namespaces; > > sched.tool.lost = perf_event__process_lost; > > sched.tool.fork = perf_sched__process_fork_event; > > + sched.tool.attr = perf_event__process_attr; > > + sched.tool.tracing_data = perf_event__process_tracing_data; > > + sched.tool.build_id = perf_event__process_build_id; > > [Severity: Medium] > Does this code omit the feature callback required for pipe mode? > > Without registering perf_event__process_feature to tool.feature, it seems > feature events from the pipe stream will be silently dropped, leaving > struct perf_env unpopulated. > > > > > argc = parse_options_subcommand(argc, argv, sched_options, sched_subcommands, > > sched_usage, PARSE_OPT_STOP_AT_NON_OPTION); Hi Namhyung, Arnaldo, Ian, This feedback is valid. In pipe mode, header attributes arrive dynamically during event processing, meaning session->evlist starts empty prior to perf_session__process_events(). Calling perf_session__set_tracepoints_handlers() upfront resulted in zero handlers being attached, causing incoming tracepoint samples to be silently dropped (i.e., evsel->handler == NULL). I will resolve this in the next iteration. Kind regards, -- Aaron Tomlin