All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v8 0/9] perf c2c: add a function view
@ 2026-08-10  5:26 Jiebin Sun
  2026-08-10  5:26 ` [PATCH v8 1/9] perf c2c: extract shared data structures into util/c2c.h Jiebin Sun
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Jiebin Sun @ 2026-08-10  5:26 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, linux-perf-users, linux-kernel,
	Jiebin Sun

The perf c2c cacheline view identifies hot shared lines, but it can be
difficult to see which functions account for contention across those lines.
This series adds a function-oriented view that groups the existing data as:

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

Pressing TAB switches between the cacheline and function views. Existing
cacheline-view data and operations remain unchanged.

v1: https://lore.kernel.org/linux-perf-users/20260626070355.1556721-1-jiebin.sun@intel.com/
v2: https://lore.kernel.org/linux-perf-users/20260710084247.3576706-1-jiebin.sun@intel.com/
v3: https://lore.kernel.org/linux-perf-users/20260717020530.1645123-1-jiebin.sun@intel.com/
v4: https://lore.kernel.org/linux-perf-users/20260724095842.995920-1-jiebin.sun@intel.com/
v5: https://lore.kernel.org/linux-perf-users/20260730090521.2206375-1-jiebin.sun@intel.com/
v6: https://lore.kernel.org/linux-perf-users/20260803035220.172022-1-jiebin.sun@intel.com/
v7: https://lore.kernel.org/linux-perf-users/20260806074217.2846596-1-jiebin.sun@intel.com/

Changes since v7
================

  - Keep c2c-function.o in libperf-ui.a and drop the v7 tools/perf/Build
    change, as Namhyung suggested. builtin-c2c.c now passes the cacheline
    histograms, coalescing fields, symbol_full flag, and cacheline detail
    callback through struct c2c_function_view_args. The browser no longer
    references command-private state.

  - Move the shared c2c types and the two column-formatting callbacks into
    new util/c2c.h and util/c2c.c. Keep struct perf_c2c, the command
    instance, and perf_c2c__browse_cacheline() private to builtin-c2c.c.

  - Rebase onto perf-tools-next at bf10e6ee2ac3.

Changes since v6
================

  - Link c2c-function.o directly into perf under CONFIG_SLANG instead of
    including it in libperf-ui.a. The browser depends on state and callbacks
    provided by builtin-c2c.o, which is not linked into python/perf.so,
    while libperf-ui.a is linked under --whole-archive. This fixes the
    unresolved symbols seen when importing the Python module and keeps the
    TUI-only object out of NO_SLANG builds.

  - Rebase onto perf-tools-next at d74fb8c4c87f.

Changes since v5
================

  - Give the function-view children their own references instead of
    borrowing them, as suggested by Namhyung. They set ops and take refs
    via map_symbol__copy() and thread__get(), so hist_entry__delete()
    frees them; the custom child destructor and the
    WARN_ON_ONCE(report_hierarchy) guard are gone.

  - Add NO_SLANG stubs for the two TUI entry points declared in c2c.h,
    matching how util/hist.h declares its own.

  - Spell out in the symbol renderer why the length returned by
    se_snprintf() cannot exceed the cell.

  - Rebase onto perf-tools-next at d04ef71492fa.

No intended change to the rendered output, cacheline-view data, existing
cacheline operations, or --stdio output.

Changes since v4
================

  - Rebase onto perf-tools-next at 0d40fedcd1b9.

  - Require `iaddr` in --coalesce before entering the function view;
    without it, coalesced samples cannot be reliably attributed.

  - Reuse each source cacheline's existing index as the level-3 identity,
    so same-address sources no longer merge and 'd' finds the original
    entry, without adding fields to the shared C2C structures.

  - Keep same-function reader/writer pairs, which the coalesced view cannot
    reliably tell apart from cross-thread contention.

  - Robustness and cleanup: build the hierarchy only from filtered
    cachelines with a lightweight entry allocator; explicit
    mem_info__new() handling; a local bound in the symbol renderer; a
    NULL-map guard; deterministic tie-breaks; function-view-local row
    recounting; Ctrl-C as an exit key; and expanded man-page docs.

Changes since v3
================

Reworked the function view into a true function-centric hierarchy, as
discussed with Namhyung:

  - Level 1 is the read-side function itself, aggregating all of its code
    addresses into one entry and sorting by Cycles %.

  - Level 2 is the contending function that writes the shared lines,
    aggregated across cachelines and sorted by store count. Level 3 is the
    specific cachelines.

  - Dedicated code-address and offset columns were removed from the main
    view. Verbose function formatting can still include a representative
    code address, and full code-address information remains available in
    the per-cacheline detail view ('d').

  - Lower-level entries are indented like the normal perf report hierarchy
    view, and entries with no contending writer are pruned.

  - Reorganized the series from 14 mechanical patches into 9 logically
    self-contained patches.

Changes since v2
================

  - Prefix helpers exported from builtin-c2c.c with c2c_, as suggested by
    Namhyung.

Changes since v1
================

  - Add a worked man-page example, as suggested by Namhyung.

In the perf c2c TUI, press TAB in the cacheline view to switch to the
function view. It presents a three-level hierarchy:

  Level 1: read-side function, sorted by Cycles %
  Level 2: functions writing the shared lines, sorted by store count
  Level 3: cachelines where the two functions contend

For example, with dequeue_pushable_task expanded to its level-2 writers and
two of those writers expanded to their level-3 cachelines:

  Shared Data Functions Table     (19 entries, sorted on Cycles %)
     Cycles    Store
          %    count  Function / Contending function / Cacheline
  ----------------------------------------------------------------------
  +  35.67%      876  + [k] cpupri_set
  +  24.31%      424  + [k] pull_rt_task
  -  16.53%      555  - [k] dequeue_pushable_task
                 145    - [k] pull_rt_task
                 145        0xff2d0082809da080
                 139    - [k] enqueue_pushable_task
                  70        0xff2d00a2071f9640
                  69        0xff2d0082809da000

A level-1 store count decomposes into its level-2 writers, and each writer's
count decomposes into its level-3 cachelines (here 145 = 145, 139 = 70 + 69).

Keys in the function view:

  TAB/ESC/q/Ctrl-C   return to the cacheline view
  d                  show details for the selected level-3 cacheline
  e / +              expand / collapse the selected entry
  ?                  help

The function view is a separate hist_browser in
tools/perf/ui/browsers/c2c-function.c. Shared types and declarations used
by both views are factored out of builtin-c2c.c into util/c2c.h. The
hierarchy is constructed from the existing cacheline histograms into
dedicated hists and rendered with custom column formatters.

Testing: every commit builds with and without SLANG support. In both
configurations python/perf.so has no unresolved symbols, the Python module
imports successfully, and the full series passes `perf test c2c` and
`perf test 'import perf'`. The cacheline-view --stdio output is
byte-identical to the base commit. c2c-function.o remains in libperf-ui.a
without references to command-private symbols. Stdio support and automated
function-view coverage remain a separate follow-up.

Jiebin Sun (9):
  perf c2c: extract shared data structures into util/c2c.h
  perf c2c: add function view browser skeleton
  perf c2c: add column rendering for function view
  perf c2c: add HPP list parsing for function view columns
  perf c2c: add function view stats merge and memory management
  perf c2c: add function view hierarchy entry creation
  perf c2c: build and finalize the function view hierarchy
  perf c2c: add function view browser UI and cacheline detail
  perf c2c: document function view in perf-c2c man page

 tools/perf/Documentation/perf-c2c.txt |   71 +
 tools/perf/builtin-c2c.c              |  115 +-
 tools/perf/ui/browsers/Build          |    1 +
 tools/perf/ui/browsers/c2c-function.c | 1791 +++++++++++++++++++++++++
 tools/perf/util/Build                 |    1 +
 tools/perf/util/c2c.c                 |   21 +
 tools/perf/util/c2c.h                 |  131 ++
 7 files changed, 2029 insertions(+), 102 deletions(-)
 create mode 100644 tools/perf/ui/browsers/c2c-function.c
 create mode 100644 tools/perf/util/c2c.c
 create mode 100644 tools/perf/util/c2c.h


base-commit: bf10e6ee2ac3034c9068e03eed418fd16961984e
-- 
2.52.0


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

end of thread, other threads:[~2026-08-12  1:47 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10  5:26 [PATCH v8 0/9] perf c2c: add a function view Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 1/9] perf c2c: extract shared data structures into util/c2c.h Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 2/9] perf c2c: add function view browser skeleton Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 3/9] perf c2c: add column rendering for function view Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 4/9] perf c2c: add HPP list parsing for function view columns Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 5/9] perf c2c: add function view stats merge and memory management Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 6/9] perf c2c: add function view hierarchy entry creation Jiebin Sun
2026-08-10  5:49   ` sashiko-bot
2026-08-12  1:47     ` Namhyung Kim
2026-08-10  5:26 ` [PATCH v8 7/9] perf c2c: build and finalize the function view hierarchy Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 8/9] perf c2c: add function view browser UI and cacheline detail Jiebin Sun
2026-08-10  5:26 ` [PATCH v8 9/9] perf c2c: document function view in perf-c2c man page Jiebin Sun

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.