Linux Perf Users
 help / color / mirror / Atom feed
* Re: [PATCH 2/4] perf tests c2c: Report skip when the workload fails
  2026-08-21  5:56 ` [PATCH 2/4] perf tests c2c: Report skip when the workload fails Jiebin Sun
@ 2026-08-21  5:52   ` sashiko-bot
  0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-08-21  5:52 UTC (permalink / raw)
  To: Jiebin Sun; +Cc: linux-perf-users

> The workload path leaves err at 0 and returns, so the test exits 0 and is
> reported as a pass even though nothing was recorded and neither report
> invocation ran. The check_c2c_support() path above it already sets err=2.
> 
> Set err=2 there as well so a failing workload is reported as a skip.
> 
> Fixes: ac881007c4bf ("perf tests c2c: Add a basic c2c")
> Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>

Sashiko has reviewed this patch and found no issues. It looks great!

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1787283281.git.jiebin.sun@intel.com?part=2


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 0/4] perf c2c: Add function-view stdio support and coverage
@ 2026-08-21  5:56 Jiebin Sun
  2026-08-21  5:56 ` [PATCH 1/4] perf c2c: Fix documented default coalesce fields Jiebin Sun
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Jiebin Sun @ 2026-08-21  5:56 UTC (permalink / raw)
  To: namhyung
  Cc: acme, mingo, peterz, adrian.hunter, alexander.shishkin, irogers,
	james.clark, jolsa, mark.rutland, dapeng1.mi, thomas.falcon,
	tianyou.li, wangyang.guo, jiebin.sun, linux-perf-users,
	linux-kernel

The recently merged function-view series added an interactive TUI for
examining the c2c data as:

  read-side function -> contending writer -> shared cacheline

This follow-up makes the same view available to builds without SLANG and
to pipes and scripts. `perf c2c report --function` now implies stdio and
prints the three-level hierarchy fully expanded. It requires `iaddr` in
the coalescing fields and is rejected together with `--stats`.

The first two patches fix adjacent pre-existing issues: the documented
default coalesce fields are stale, and a workload recording failure in
the existing c2c shell test is incorrectly reported as a pass. The third
patch adds the stdio function view, and the final patch adds automated
coverage using a separate contended futex workload. Systems that record
no contended samples report a skip for the hierarchy checks rather than a
spurious failure.

This series follows the function-view work merged from:

  https://lore.kernel.org/linux-perf-users/20260817094623.3288456-1-jiebin.sun@intel.com/

The series is based on perf-tools-next commit 9453bc6a69ef ("perf vendor
events arm64: Fix Tegra410 Olympus event 0x0197").

Tested with:

  - SLANG and NO_SLANG=1 builds
  - perf test c2c
  - perf test 'import perf'
  - checkpatch.pl --strict on each patch
  - unresolved-symbol checks on the Python perf module

Jiebin Sun (4):
  perf c2c: Fix documented default coalesce fields
  perf tests c2c: Report skip when the workload fails
  perf c2c: Add stdio support for the function view
  perf tests c2c: Add function view stdio coverage

 tools/perf/Documentation/perf-c2c.txt |  14 +++-
 tools/perf/builtin-c2c.c              |  85 +++++++++++++++++--
 tools/perf/tests/shell/c2c.sh         | 114 ++++++++++++++++++++++++++
 tools/perf/util/c2c-function.c        |   9 +-
 tools/perf/util/c2c.h                 |   1 +
 5 files changed, 205 insertions(+), 18 deletions(-)


base-commit: 9453bc6a69ef43755f1c28d5688cacdd69fa16bd
-- 
2.52.0

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] perf c2c: Fix documented default coalesce fields
  2026-08-21  5:56 [PATCH 0/4] perf c2c: Add function-view stdio support and coverage Jiebin Sun
@ 2026-08-21  5:56 ` Jiebin Sun
  2026-08-21  5:57   ` sashiko-bot
  2026-08-21  5:56 ` [PATCH 2/4] perf tests c2c: Report skip when the workload fails Jiebin Sun
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Jiebin Sun @ 2026-08-21  5:56 UTC (permalink / raw)
  To: namhyung
  Cc: acme, mingo, peterz, adrian.hunter, alexander.shishkin, irogers,
	james.clark, jolsa, mark.rutland, dapeng1.mi, thomas.falcon,
	tianyou.li, wangyang.guo, jiebin.sun, linux-perf-users,
	linux-kernel

The default coalesce fields dropped pid in favor of iaddr, but the man
page still documents the old pid,iaddr default. Update it to match the
command.

Fixes: 423701a0c8d7 ("perf c2c: Change the default coalesce setup")
Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Reviewed-by: Tianyou Li <tianyou.li@intel.com>
Reviewed-by: Wangyang Guo <wangyang.guo@intel.com>
---
 tools/perf/Documentation/perf-c2c.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/Documentation/perf-c2c.txt b/tools/perf/Documentation/perf-c2c.txt
index 8775889bc0a3..9e58a51c55de 100644
--- a/tools/perf/Documentation/perf-c2c.txt
+++ b/tools/perf/Documentation/perf-c2c.txt
@@ -341,7 +341,7 @@ output fields set for cacheline offsets output:
              Code address, Code symbol, Shared Object, Source line
   dso   - coalesced by shared object
 
-By default the coalescing is setup with 'pid,iaddr'.
+By default, coalescing uses `iaddr`.
 
 STDIO OUTPUT
 ------------
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/4] perf tests c2c: Report skip when the workload fails
  2026-08-21  5:56 [PATCH 0/4] perf c2c: Add function-view stdio support and coverage Jiebin Sun
  2026-08-21  5:56 ` [PATCH 1/4] perf c2c: Fix documented default coalesce fields Jiebin Sun
@ 2026-08-21  5:56 ` Jiebin Sun
  2026-08-21  5:52   ` sashiko-bot
  2026-08-21  5:56 ` [PATCH 3/4] perf c2c: Add stdio support for the function view Jiebin Sun
  2026-08-21  5:56 ` [PATCH 4/4] perf tests c2c: Add function view stdio coverage Jiebin Sun
  3 siblings, 1 reply; 9+ messages in thread
From: Jiebin Sun @ 2026-08-21  5:56 UTC (permalink / raw)
  To: namhyung
  Cc: acme, mingo, peterz, adrian.hunter, alexander.shishkin, irogers,
	james.clark, jolsa, mark.rutland, dapeng1.mi, thomas.falcon,
	tianyou.li, wangyang.guo, jiebin.sun, linux-perf-users,
	linux-kernel

The workload path leaves err at 0 and returns, so the test exits 0 and is
reported as a pass even though nothing was recorded and neither report
invocation ran. The check_c2c_support() path above it already sets err=2.

Set err=2 there as well so a failing workload is reported as a skip.

Fixes: ac881007c4bf ("perf tests c2c: Add a basic c2c")
Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Reviewed-by: Tianyou Li <tianyou.li@intel.com>
Reviewed-by: Wangyang Guo <wangyang.guo@intel.com>
---
 tools/perf/tests/shell/c2c.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/perf/tests/shell/c2c.sh b/tools/perf/tests/shell/c2c.sh
index 2471d44595c3..f5f223cbf9cc 100755
--- a/tools/perf/tests/shell/c2c.sh
+++ b/tools/perf/tests/shell/c2c.sh
@@ -39,6 +39,7 @@ test_c2c_record_report() {
 	# Run a workload that does some memory operations.
 	if ! perf c2c record -o "${perfdata}" -- perf test -w datasym 1 > /dev/null 2>&1 ; then
 		echo "c2c record and report test [Skipped: perf c2c record failed during workload]"
+		err=2
 		return
 	fi
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/4] perf c2c: Add stdio support for the function view
  2026-08-21  5:56 [PATCH 0/4] perf c2c: Add function-view stdio support and coverage Jiebin Sun
  2026-08-21  5:56 ` [PATCH 1/4] perf c2c: Fix documented default coalesce fields Jiebin Sun
  2026-08-21  5:56 ` [PATCH 2/4] perf tests c2c: Report skip when the workload fails Jiebin Sun
@ 2026-08-21  5:56 ` Jiebin Sun
  2026-08-21  5:58   ` sashiko-bot
  2026-08-21  5:56 ` [PATCH 4/4] perf tests c2c: Add function view stdio coverage Jiebin Sun
  3 siblings, 1 reply; 9+ messages in thread
From: Jiebin Sun @ 2026-08-21  5:56 UTC (permalink / raw)
  To: namhyung
  Cc: acme, mingo, peterz, adrian.hunter, alexander.shishkin, irogers,
	james.clark, jolsa, mark.rutland, dapeng1.mi, thomas.falcon,
	tianyou.li, wangyang.guo, jiebin.sun, linux-perf-users,
	linux-kernel

The function view is currently TUI-only, so it cannot be used by builds
without SLANG support, when output is piped, or from a script. Add a
--function option that prints the fully expanded three-level hierarchy to
stdout.

Keep the stdio renderer in builtin-c2c.c and reuse the common function-view
model introduced by the merged series. Export only the coalescing-field
capability check from the model, preserving the util/UI boundary and
leaving the TUI object in libperf-ui.a.

Stop padding the final identity column in symbol_view_entry(). The generic
formatter pads non-final columns but deliberately leaves the final column
unpadded, avoiding trailing whitespace in function-view table rows. The TUI
remains unchanged because its browser clears the rest of each rendered row.

--function implies --stdio and is rejected together with --stats. Validate
the iaddr requirement before processing events. Return function-view build
failures from the report command, and preserve TUI browser errors when
converting the display helpers to return a status.

Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Reviewed-by: Tianyou Li <tianyou.li@intel.com>
Reviewed-by: Wangyang Guo <wangyang.guo@intel.com>
---
 tools/perf/Documentation/perf-c2c.txt | 12 +++-
 tools/perf/builtin-c2c.c              | 85 ++++++++++++++++++++++++---
 tools/perf/util/c2c-function.c        |  9 +--
 tools/perf/util/c2c.h                 |  1 +
 4 files changed, 90 insertions(+), 17 deletions(-)

diff --git a/tools/perf/Documentation/perf-c2c.txt b/tools/perf/Documentation/perf-c2c.txt
index 9e58a51c55de..7a0cf31be7ed 100644
--- a/tools/perf/Documentation/perf-c2c.txt
+++ b/tools/perf/Documentation/perf-c2c.txt
@@ -107,6 +107,10 @@ REPORT OPTIONS
 --stats::
 	Display only statistic tables and force stdio mode.
 
+--function::
+	Display the function view and force stdio mode.  This requires `iaddr`
+	in the cacheline coalescing fields and cannot be used with `--stats`.
+
 --full-symbols::
 	Display full length of symbols.
 
@@ -360,6 +364,10 @@ Following tables are displayed:
   Shared Cache Line Distribution Pareto
   - list of all accessed offsets for each cacheline
 
+With `--function`, the cacheline and Pareto tables are replaced by a fully
+expanded Shared Data Functions Table.  Its three levels are the read-side
+function, contending writer, and shared cacheline, as detailed below.
+
 TUI OUTPUT
 ----------
 The TUI output provides interactive interface to navigate
@@ -374,8 +382,8 @@ Verbose mode also includes code addresses in function rows, and code addresses
 remain available in the per-cacheline detail view ('d').
 
 The function view requires `iaddr` in the cacheline coalescing fields.  If
-`--coalesce` omits it, TAB reports that the view is unavailable rather than
-attributing already-coalesced samples to an arbitrary function.
+`--coalesce` omits it, TAB or `--function` reports that the view is unavailable
+rather than attributing already-coalesced samples to an arbitrary function.
 
   Level 1: the read-side function, sorted by Cycles % (estimated load
            cycles: HITM, peer-snoop and other-load cycles)
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index 715b75d42f2a..cce76a1e2ff5 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -73,6 +73,7 @@ struct perf_c2c {
 	bool			 show_all;
 	bool			 use_stdio;
 	bool			 stats_only;
+	bool			 function_view;
 	bool			 symbol_full;
 	bool			 stitch_lbr;
 
@@ -2530,7 +2531,48 @@ static void print_c2c_info(FILE *out, struct perf_session *session)
 	fprintf(out, "  Cacheline data grouping           : %s\n", c2c.cl_sort);
 }
 
-static void perf_c2c__hists_fprintf(FILE *out, struct perf_session *session)
+static void c2c_function__unfold_all(struct rb_root_cached *root)
+{
+	struct rb_node *nd;
+
+	for (nd = rb_first_cached(root); nd; nd = rb_next(nd)) {
+		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
+
+		if (!he->has_children)
+			continue;
+		he->unfolded = true;
+		c2c_function__unfold_all(&he->hroot_out);
+	}
+}
+
+static int perf_c2c__function_fprintf(FILE *out)
+{
+	bool saved_use_callchain = symbol_conf.use_callchain;
+	struct hists *hists;
+	int ret;
+
+	/* Function-view entries aggregate samples and never display callchains. */
+	symbol_conf.use_callchain = false;
+	ret = c2c_function__build(&c2c.hists, c2c.cl_sort, c2c.symbol_full,
+				  &hists);
+	if (ret) {
+		if (ret == -EOPNOTSUPP)
+			pr_err("The function view requires iaddr in --coalesce.\n");
+		else
+			pr_err("Failed to build function view hierarchy (ret=%d)\n", ret);
+		goto out;
+	}
+
+	/* Match fold signs to hists__fprintf()'s forced child traversal. */
+	c2c_function__unfold_all(&hists->entries);
+	hists__fprintf(hists, true, 0, 0, 0, out, true);
+	c2c_function__reset();
+out:
+	symbol_conf.use_callchain = saved_use_callchain;
+	return ret;
+}
+
+static int perf_c2c__hists_fprintf(FILE *out, struct perf_session *session)
 {
 	setup_pager();
 
@@ -2541,7 +2583,17 @@ static void perf_c2c__hists_fprintf(FILE *out, struct perf_session *session)
 	print_c2c_info(out, session);
 
 	if (c2c.stats_only)
-		return;
+		return 0;
+
+	if (c2c.function_view) {
+		fprintf(out, "\n");
+		fprintf(out, "=================================================\n");
+		fprintf(out, "           Shared Data Functions Table\n");
+		fprintf(out, "=================================================\n");
+		fprintf(out, "#\n");
+
+		return perf_c2c__function_fprintf(out);
+	}
 
 	fprintf(out, "\n");
 	fprintf(out, "=================================================\n");
@@ -2558,6 +2610,7 @@ static void perf_c2c__hists_fprintf(FILE *out, struct perf_session *session)
 	fprintf(out, "#\n");
 
 	print_pareto(out, perf_session__env(session));
+	return 0;
 }
 
 #ifdef HAVE_SLANG_SUPPORT
@@ -2794,18 +2847,18 @@ static int perf_c2c__hists_browse(struct hists *hists)
 	return 0;
 }
 
-static void perf_c2c_display(struct perf_session *session)
+static int perf_c2c_display(struct perf_session *session)
 {
 	if (use_browser == 0)
-		perf_c2c__hists_fprintf(stdout, session);
-	else
-		perf_c2c__hists_browse(&c2c.hists.hists);
+		return perf_c2c__hists_fprintf(stdout, session);
+
+	return perf_c2c__hists_browse(&c2c.hists.hists);
 }
 #else
-static void perf_c2c_display(struct perf_session *session)
+static int perf_c2c_display(struct perf_session *session)
 {
 	use_browser = 0;
-	perf_c2c__hists_fprintf(stdout, session);
+	return perf_c2c__hists_fprintf(stdout, session);
 }
 #endif /* HAVE_SLANG_SUPPORT */
 
@@ -3081,6 +3134,8 @@ static int perf_c2c__report(int argc, const char **argv)
 	OPT_BOOLEAN(0, "stdio", &c2c.use_stdio, "Use the stdio interface"),
 	OPT_BOOLEAN(0, "stats", &c2c.stats_only,
 		    "Display only statistic tables (implies --stdio)"),
+	OPT_BOOLEAN(0, "function", &c2c.function_view,
+		    "Display the function view (implies --stdio)"),
 	OPT_BOOLEAN(0, "full-symbols", &c2c.symbol_full,
 		    "Display full length of symbols"),
 	OPT_BOOLEAN(0, "no-source", &no_source,
@@ -3119,6 +3174,11 @@ static int perf_c2c__report(int argc, const char **argv)
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 	if (argc)
 		usage_with_options(report_c2c_usage, options);
+	if (c2c.stats_only && c2c.function_view) {
+		pr_err("--stats and --function cannot be used together.\n");
+		err = -EINVAL;
+		goto out;
+	}
 
 #ifndef HAVE_SLANG_SUPPORT
 	c2c.use_stdio = true;
@@ -3126,6 +3186,8 @@ static int perf_c2c__report(int argc, const char **argv)
 
 	if (c2c.stats_only)
 		c2c.use_stdio = true;
+	if (c2c.function_view)
+		c2c.use_stdio = true;
 
 	/**
 	 * Annotation related options disassembler_style, objdump_path are set
@@ -3199,6 +3261,11 @@ static int perf_c2c__report(int argc, const char **argv)
 		pr_debug("Failed to initialize hists\n");
 		goto out_session;
 	}
+	if (c2c.function_view && !c2c_function__has_iaddr(c2c.cl_sort)) {
+		pr_err("The function view requires iaddr in --coalesce.\n");
+		err = -EINVAL;
+		goto out_session;
+	}
 
 	err = c2c_hists__init(&c2c.hists, "dcacheline", 2, perf_session__env(session));
 	if (err) {
@@ -3332,7 +3399,7 @@ static int perf_c2c__report(int argc, const char **argv)
 		goto out_mem2node;
 	}
 
-	perf_c2c_display(session);
+	err = perf_c2c_display(session);
 
 out_mem2node:
 	mem2node__exit(&c2c.mem2node);
diff --git a/tools/perf/util/c2c-function.c b/tools/perf/util/c2c-function.c
index 5b6a06a5a067..d410196d0429 100644
--- a/tools/perf/util/c2c-function.c
+++ b/tools/perf/util/c2c-function.c
@@ -305,8 +305,8 @@ symbol_view_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
 		char symbuf[32];
 
 		scnprintf(symbuf, sizeof(symbuf), "0x%" PRIx64, addr);
-		ret += scnprintf(hpp->buf + ret, hpp->size - ret, "%-*.*s",
-				 text_width, text_width, symbuf);
+		ret += scnprintf(hpp->buf + ret, hpp->size - ret, "%.*s",
+				 text_width, symbuf);
 	} else {
 		/* Level 1 and level 2 are both functions. */
 		size_t cell_size;
@@ -331,9 +331,6 @@ symbol_view_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
 			len = min_t(size_t, len, cell_size - 1);
 
 		ret += len;
-		if (len < text_width)
-			ret += scnprintf(hpp->buf + ret, hpp->size - ret, "%*s",
-					 text_width - len, "");
 	}
 
 	return ret;
@@ -1519,7 +1516,7 @@ void c2c_function__reset(void)
 	symbol_conf.use_callchain = saved_use_callchain;
 }
 
-static bool c2c_function__has_iaddr(const char *cl_sort)
+bool c2c_function__has_iaddr(const char *cl_sort)
 {
 	const char *field = cl_sort;
 
diff --git a/tools/perf/util/c2c.h b/tools/perf/util/c2c.h
index 53f024e25d99..198032ec7c87 100644
--- a/tools/perf/util/c2c.h
+++ b/tools/perf/util/c2c.h
@@ -107,6 +107,7 @@ bool c2c_fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b);
 int c2c_function__build(struct c2c_hists *cl_hists, const char *cl_sort,
 			bool symbol_full, struct hists **hists);
 void c2c_function__reset(void);
+bool c2c_function__has_iaddr(const char *cl_sort);
 /* Valid only between a successful build and c2c_function__reset(). */
 struct hist_entry *c2c_function__find_cacheline(struct hist_entry *he);
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/4] perf tests c2c: Add function view stdio coverage
  2026-08-21  5:56 [PATCH 0/4] perf c2c: Add function-view stdio support and coverage Jiebin Sun
                   ` (2 preceding siblings ...)
  2026-08-21  5:56 ` [PATCH 3/4] perf c2c: Add stdio support for the function view Jiebin Sun
@ 2026-08-21  5:56 ` Jiebin Sun
  2026-08-21  5:58   ` sashiko-bot
  3 siblings, 1 reply; 9+ messages in thread
From: Jiebin Sun @ 2026-08-21  5:56 UTC (permalink / raw)
  To: namhyung
  Cc: acme, mingo, peterz, adrian.hunter, alexander.shishkin, irogers,
	james.clark, jolsa, mark.rutland, dapeng1.mi, thomas.falcon,
	tianyou.li, wangyang.guo, jiebin.sun, linux-perf-users,
	linux-kernel

Exercise the function view without driving a terminal now that it has
a stdio path. Keep the existing datasym record/report coverage and make a
separate recording of the contended locks used by the futex hash benchmark.

Always check the function table headers, table replacement, missing-iaddr
diagnostic, and conflicting options. A machine can support c2c recording
without capturing a contended sample, so report a skip when the hierarchy
is empty rather than treating hardware sampling variance as a failure.

When samples are available, check generic row shapes for all three
hierarchy levels, their expanded fold signs, cacheline addresses, and the
absence of trailing whitespace in the table body.

Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Reviewed-by: Tianyou Li <tianyou.li@intel.com>
Reviewed-by: Wangyang Guo <wangyang.guo@intel.com>
---
 tools/perf/tests/shell/c2c.sh | 113 ++++++++++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/tools/perf/tests/shell/c2c.sh b/tools/perf/tests/shell/c2c.sh
index f5f223cbf9cc..cf76359d19cc 100755
--- a/tools/perf/tests/shell/c2c.sh
+++ b/tools/perf/tests/shell/c2c.sh
@@ -6,10 +6,15 @@ set -e
 
 err=0
 perfdata=$(mktemp /tmp/__perf_c2c_test.perf.data.XXXXX)
+funcdata=$(mktemp /tmp/__perf_c2c_function_test.perf.data.XXXXX)
+perfout=$(mktemp /tmp/__perf_c2c_test.output.XXXXX)
 
 cleanup() {
 	rm -f "${perfdata}"
 	rm -f "${perfdata}".old
+	rm -f "${funcdata}"
+	rm -f "${funcdata}".old
+	rm -f "${perfout}"
 	trap - EXIT TERM INT
 }
 
@@ -58,6 +63,114 @@ test_c2c_record_report() {
 	echo "c2c record and report test [Success]"
 }
 
+test_c2c_function_report() {
+	echo "c2c function stdio report test"
+
+	if perf c2c report -i "${perfdata}" --function -c pid > "${perfout}" 2>&1 ; then
+		echo "c2c function stdio report test [Failed: report accepted missing iaddr]"
+		err=1
+		return
+	fi
+	if ! grep -Fq "The function view requires iaddr in --coalesce." "${perfout}" ; then
+		echo "c2c function stdio report test [Failed: missing iaddr diagnostic]"
+		cat "${perfout}"
+		err=1
+		return
+	fi
+	if grep -Fq "Shared Data Functions Table" "${perfout}" ; then
+		echo "c2c function stdio report test [Failed: partial report on missing iaddr]"
+		cat "${perfout}"
+		err=1
+		return
+	fi
+
+	if perf c2c report -i "${perfdata}" --function --stats > "${perfout}" 2>&1 ; then
+		echo "c2c function stdio report test [Failed: accepted conflicting options]"
+		err=1
+		return
+	fi
+	if ! grep -Fq -- "--stats and --function cannot be used together." "${perfout}" ; then
+		echo "c2c function stdio report test [Failed: missing conflict diagnostic]"
+		cat "${perfout}"
+		err=1
+		return
+	fi
+
+	# Exercise contended futex hash-bucket locks so the function view can get
+	# reader, writer, and cacheline rows without changing the original test.
+	if ! perf c2c record -o "${funcdata}" -- \
+		perf bench futex hash -t 4 -r 1 -s > /dev/null 2>&1 ; then
+		echo "c2c function stdio report test [Skipped: recording failed]"
+		err=2
+		return
+	fi
+
+	if ! perf c2c report -i "${funcdata}" --function > "${perfout}" 2>&1 ; then
+		echo "c2c function stdio report test [Failed: report failed]"
+		cat "${perfout}"
+		err=1
+		return
+	fi
+
+	for expected in "Shared Data Functions Table" \
+		"#    Cycles    Store" \
+		"#         %    count  Function / Contending function / Cacheline" \
+		"# .........  ......." ; do
+		if ! grep -Fq "${expected}" "${perfout}" ; then
+			echo "c2c function stdio report test [Failed: missing '${expected}']"
+			cat "${perfout}"
+			err=1
+			return
+		fi
+	done
+	for unexpected in "Shared Data Cache Line Table" \
+		"Shared Cache Line Distribution Pareto" ; do
+		if grep -Fq "${unexpected}" "${perfout}" ; then
+			echo "c2c function stdio report test [Failed: found '${unexpected}']"
+			cat "${perfout}"
+			err=1
+			return
+		fi
+	done
+
+	if ! awk '/^# \.+/ { body = 1; next }
+		body && !/^#/ && NF { found = 1 }
+		END { exit !found }' "${perfout}" ; then
+		echo "c2c function stdio report test [Skipped: no contended samples]"
+		err=2
+		return
+	fi
+
+	# The spaces intentionally verify per-level indentation and expanded
+	# fold-sign placement without depending on symbol names.
+	for expected in \
+		'^  - +[0-9]+\.[0-9]+% +[0-9]+  - ' \
+		'^ +[0-9]+    - ' \
+		'^ +[0-9]+        0x[[:xdigit:]]+$' ; do
+		if ! grep -Eq "${expected}" "${perfout}" ; then
+			echo "c2c function stdio report test [Failed: missing hierarchy row]"
+			echo "  ${expected}"
+			cat "${perfout}"
+			err=1
+			return
+		fi
+	done
+
+	if awk '/^# \.+/ { body = 1; next }
+		body && /[[:blank:]]$/ { found = 1 }
+		END { exit !found }' "${perfout}" ; then
+		echo "c2c function stdio report test [Failed: trailing whitespace in table body]"
+		cat "${perfout}"
+		err=1
+		return
+	fi
+
+	echo "c2c function stdio report test [Success]"
+}
+
 test_c2c_record_report
+if [ "${err}" -eq 0 ]; then
+	test_c2c_function_report
+fi
 cleanup
 exit $err
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/4] perf c2c: Fix documented default coalesce fields
  2026-08-21  5:56 ` [PATCH 1/4] perf c2c: Fix documented default coalesce fields Jiebin Sun
@ 2026-08-21  5:57   ` sashiko-bot
  0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-08-21  5:57 UTC (permalink / raw)
  To: Jiebin Sun; +Cc: linux-perf-users

> The default coalesce fields dropped pid in favor of iaddr, but the man
> page still documents the old pid,iaddr default. Update it to match the
> command.
> 
> Fixes: 423701a0c8d7 ("perf c2c: Change the default coalesce setup")
> Signed-off-by: Jiebin Sun <jiebin.sun@intel.com>

Sashiko has reviewed this patch and found no issues. It looks great!

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1787283281.git.jiebin.sun@intel.com?part=1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/4] perf tests c2c: Add function view stdio coverage
  2026-08-21  5:56 ` [PATCH 4/4] perf tests c2c: Add function view stdio coverage Jiebin Sun
@ 2026-08-21  5:58   ` sashiko-bot
  0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-08-21  5:58 UTC (permalink / raw)
  To: Jiebin Sun; +Cc: linux-perf-users

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The newly added `test_c2c_function_report` test fails spuriously because it incorrectly assumes `perfdata` is valid when `err` is 0. If the workload in `test_c2c_record_report` fails, it returns early but leaves `err=0`. This causes `test_c2c_function_report` to process an invalid or missing `perfdata` file, failing its diagnostic checks and setting `err=1` (test failure).
--

--- Patch [4]: [PATCH 4/4] perf tests c2c: Add function view stdio coverage ---
commit 32c977aa30c2c6186f39077056298ef3b53307dd
Author: Jiebin Sun <jiebin.sun@intel.com>

perf tests c2c: Add function view stdio coverage

Exercise the function view without driving a terminal now that it has
a stdio path. Keep the existing datasym record/report coverage and make a
separate recording of the contended locks used by the futex hash benchmark.

> diff --git a/tools/perf/tests/shell/c2c.sh b/tools/perf/tests/shell/c2c.sh
> index f5f223cbf9cc7..cf76359d19ccd 100755
> --- a/tools/perf/tests/shell/c2c.sh
> +++ b/tools/perf/tests/shell/c2c.sh
[ ... ]
> @@ -58,6 +63,114 @@ test_c2c_record_report() {
>  	echo "c2c record and report test [Success]"
>  }
>  
> +test_c2c_function_report() {
> +	echo "c2c function stdio report test"
> +
> +	if perf c2c report -i "${perfdata}" --function -c pid > "${perfout}" 2>&1 ; then
> +		echo "c2c function stdio report test [Failed: report accepted missing iaddr]"
> +		err=1
> +		return
> +	fi
[ ... ]
>  test_c2c_record_report
> +if [ "${err}" -eq 0 ]; then
> +	test_c2c_function_report
> +fi
>  cleanup
>  exit $err

[Severity: Medium]
Will this lead to a spurious test failure if the record workload fails?

In test_c2c_record_report(), if the 'perf test -w datasym 1' workload fails,
it returns early without modifying err, leaving err=0:

	if ! perf c2c record -o "${perfdata}" -- perf test -w datasym 1 > /dev/null 2>&1 ; then
		echo "c2c record and report test [Skipped: perf c2c record failed during workload]"
		return
	fi

Because err remains 0, test_c2c_function_report() will conditionally execute
and attempt to use the missing or invalid perfdata file. This will cause
test_c2c_function_report() to fail its diagnostic checks and set err=1.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1787283281.git.jiebin.sun@intel.com?part=4

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/4] perf c2c: Add stdio support for the function view
  2026-08-21  5:56 ` [PATCH 3/4] perf c2c: Add stdio support for the function view Jiebin Sun
@ 2026-08-21  5:58   ` sashiko-bot
  0 siblings, 0 replies; 9+ messages in thread
From: sashiko-bot @ 2026-08-21  5:58 UTC (permalink / raw)
  To: Jiebin Sun; +Cc: linux-perf-users

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:

Pre-existing issues:
- [Medium] Memory leak: L2 and L3 function-view child entries are not freed on cleanup because `perf c2c` does not set `symbol_conf.report_hierarchy`, bypassing the recursive deletion in `hist_entry__delete()`.
--

--- Patch [3]: [PATCH 3/4] perf c2c: Add stdio support for the function view ---
commit e1f0ed49bafb9da749fbfa14e02ab8497ae9d5d4
Author: Jiebin Sun <jiebin.sun@intel.com>

perf c2c: Add stdio support for the function view

This commit adds a --function option to perf c2c to print the fully expanded
three-level hierarchy to stdout, allowing its use without SLANG support,
when piped, or in scripts. It reuses the common function-view model while
preserving the boundary between utilities and the UI.

> diff --git a/tools/perf/util/c2c-function.c b/tools/perf/util/c2c-function.c
> --- a/tools/perf/util/c2c-function.c
> +++ b/tools/perf/util/c2c-function.c

[ ... ]

> @@ -1519,7 +1516,7 @@ void c2c_function__reset(void)
>  	symbol_conf.use_callchain = saved_use_callchain;
>  }

[Severity: Medium]
This is a pre-existing issue, but does this teardown logic in
c2c_function__reset() leak the L2 and L3 function-view child entries?

When cleaning up the hierarchy, hists__delete_all_entries() relies on
hist_entry__delete() for each node. However, in tools/perf/util/hist.c,
hist_entry__delete() only recursively deletes the child entries in hroot_out
if the hierarchy flag is set:

tools/perf/util/hist.c:hist_entry__delete() {
    ...
    if (symbol_conf.report_hierarchy) {
        struct rb_root *root = &he->hroot_out.rb_root;
        struct hist_entry *child, *tmp;

        rbtree_postorder_for_each_entry_safe(child, tmp, root, rb_node)
            hist_entry__delete(child);

        *root = RB_ROOT;
    }
    ...
}

Since perf c2c does not appear to set symbol_conf.report_hierarchy, won't
these child entries be orphaned and skipped during cleanup?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1787283281.git.jiebin.sun@intel.com?part=3

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-08-21  5:58 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-21  5:56 [PATCH 0/4] perf c2c: Add function-view stdio support and coverage Jiebin Sun
2026-08-21  5:56 ` [PATCH 1/4] perf c2c: Fix documented default coalesce fields Jiebin Sun
2026-08-21  5:57   ` sashiko-bot
2026-08-21  5:56 ` [PATCH 2/4] perf tests c2c: Report skip when the workload fails Jiebin Sun
2026-08-21  5:52   ` sashiko-bot
2026-08-21  5:56 ` [PATCH 3/4] perf c2c: Add stdio support for the function view Jiebin Sun
2026-08-21  5:58   ` sashiko-bot
2026-08-21  5:56 ` [PATCH 4/4] perf tests c2c: Add function view stdio coverage Jiebin Sun
2026-08-21  5:58   ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox