From nobody Tue Dec 2 02:17:31 2025 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 A82E831BC82; Thu, 20 Nov 2025 23:48:18 +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=1763682498; cv=none; b=EB1t+L+vsTMpl+Ir8+RxBp9qD1CDo5u6rddlsUi7mQEynxzep1rL/tUgVcEoRPxRxDS1JOjk3+cWUwpDgt+wJCqpGyImFHPU665nWzEH9AJnO4Em9JdmqLWjB4dfsE0Ma+BsVyz/DE/lCdnFYHI9MjRBi7sNH56FRfPe5oRtrZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763682498; c=relaxed/simple; bh=QMamA0NlFUaDlTU9/ZeJqqbfrtRkRhvOhwEeWlYNw3E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DjMw+UoUZNdc+/XI2VMhDc7D3uj/O3Kmxg7H7vkM/DZA+Y/UfmtreHG3qRZGGLnOigE8Vig1x4QLLTjtCkAnIFlVxa2OVlhlaXullCN3znufNVpiQa7guteznS+UBmF98kuCzcGq1zQ9k1Eq5+nH88rbOKSAip38oMjFRXIls4k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NqHoGseE; 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="NqHoGseE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E1395C116C6; Thu, 20 Nov 2025 23:48:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763682498; bh=QMamA0NlFUaDlTU9/ZeJqqbfrtRkRhvOhwEeWlYNw3E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NqHoGseEH4Ro4SA8zEx/DczzViuX0e5Hkz4T5htEqWEq/gSO/6p3YFNaH/tsU4IWm KgyNjChven9u7W0Z/Su5AJPVy1PTQF9zX5NpSFQDuUxNEYfJZq5vmTiNUiNjag0eDQ BUO8KP01GDTOPyQzLd7Xi/IN76vw9GZtNbDQUJ97fusqPx4/Dp/BPc4DWp19hXVsIO 0WhiCmTraIhZjaiWhpILtCi4pUk03w/yGuiLxkp28JsYV9lzk4DA+sfGk7AKB4AXaq Ufjkmh4aOXR4YzD5KJ99USQ+17Ok1L/rOTYT/DGOwvxkMKE8cgob2y70e+o7Tzc9+0 ey4Y/kl5r4QbQ== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , James Clark Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Jens Remus , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH v6 6/6] perf tools: Flush remaining samples w/o deferred callchains Date: Thu, 20 Nov 2025 15:48:04 -0800 Message-ID: <20251120234804.156340-7-namhyung@kernel.org> X-Mailer: git-send-email 2.52.0.rc2.455.g230fcf2819-goog In-Reply-To: <20251120234804.156340-1-namhyung@kernel.org> References: <20251120234804.156340-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It's possible that some kernel samples don't have matching deferred callchain records when the profiling session was ended before the threads came back to userspace. Let's flush the samples before finish the session. Signed-off-by: Namhyung Kim --- tools/perf/util/session.c | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index dc570ad47ccc2c63..4236503c8f6c1350 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1295,6 +1295,10 @@ struct deferred_event { union perf_event *event; }; =20 +/* + * This is called when a deferred callchain record comes up. Find all mat= ching + * samples, merge the callchains and process them. + */ static int evlist__deliver_deferred_callchain(struct evlist *evlist, const struct perf_tool *tool, union perf_event *event, @@ -1345,6 +1349,42 @@ static int evlist__deliver_deferred_callchain(struct= evlist *evlist, return ret; } =20 +/* + * This is called at the end of the data processing for the session. Flus= h the + * remaining samples as there's no hope for matching deferred callchains. + */ +static int session__flush_deferred_samples(struct perf_session *session, + const struct perf_tool *tool) +{ + struct evlist *evlist =3D session->evlist; + struct machine *machine =3D &session->machines.host; + struct deferred_event *de, *tmp; + struct evsel *evsel; + int ret =3D 0; + + list_for_each_entry_safe(de, tmp, &evlist->deferred_samples, list) { + struct perf_sample sample; + + ret =3D evlist__parse_sample(evlist, de->event, &sample); + if (ret < 0) { + pr_err("failed to parse original sample\n"); + break; + } + + evsel =3D evlist__id2evsel(evlist, sample.id); + ret =3D evlist__deliver_sample(evlist, tool, de->event, + &sample, evsel, machine); + + list_del(&de->list); + free(de->event); + free(de); + + if (ret) + break; + } + return ret; +} + static int machines__deliver_event(struct machines *machines, struct evlist *evlist, union perf_event *event, @@ -2038,6 +2078,9 @@ static int __perf_session__process_pipe_events(struct= perf_session *session) done: /* do the final flush for ordered samples */ err =3D ordered_events__flush(oe, OE_FLUSH__FINAL); + if (err) + goto out_err; + err =3D session__flush_deferred_samples(session, tool); if (err) goto out_err; err =3D auxtrace__flush_events(session, tool); @@ -2384,6 +2427,9 @@ static int __perf_session__process_events(struct perf= _session *session) if (err) goto out_err; err =3D auxtrace__flush_events(session, tool); + if (err) + goto out_err; + err =3D session__flush_deferred_samples(session, tool); if (err) goto out_err; err =3D perf_session__flush_thread_stacks(session); @@ -2506,6 +2552,10 @@ static int __perf_session__process_dir_events(struct= perf_session *session) if (ret) goto out_err; =20 + ret =3D session__flush_deferred_samples(session, tool); + if (ret) + goto out_err; + ret =3D perf_session__flush_thread_stacks(session); out_err: ui_progress__finish(); --=20 2.52.0.rc2.455.g230fcf2819-goog