Re: [PATCH v9 2/9] perf c2c: add function view model skeleton
Ian Rogers <[email protected]>
| Newsgroups | org.kernel.vger.linux-perf-users,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAP-5=fUbShKSuco7GUFuqMWiAt+z--+BNBuec-toHV8ZMULh6g@mail.gmail.com> |
On Mon, Aug 17, 2026 at 3:48 PM Namhyung Kim <[email protected]> wrote: > > Hello, > > On Mon, Aug 17, 2026 at 01:53:46PM -0700, Ian Rogers wrote: > > On Mon, Aug 17, 2026 at 2:40 AM Jiebin Sun <[email protected]> wrote: > > > > > > Add the initial common model for the c2c function view: model state and > > > small helpers shared by the hierarchy construction and formatting added > > > in later patches. > > > > > > Build the model from util/ so it remains independent of the TUI and > > > command-private symbols. > > > > > > Signed-off-by: Jiebin Sun <[email protected]> > > > Cc: Adrian Hunter <[email protected]> > > > Cc: Alexander Shishkin <[email protected]> > > > Cc: Arnaldo Carvalho de Melo <[email protected]> > > > Cc: Dapeng Mi <[email protected]> > > > Cc: Ian Rogers <[email protected]> > > > Cc: Ingo Molnar <[email protected]> > > > Cc: James Clark <[email protected]> > > > Cc: Jiri Olsa <[email protected]> > > > Cc: Mark Rutland <[email protected]> > > > Cc: Namhyung Kim <[email protected]> > > > Cc: Peter Zijlstra <[email protected]> > > > Cc: Thomas Falcon <[email protected]> > > > Reviewed-by: Tianyou Li <[email protected]> > > > Reviewed-by: Wangyang Guo <[email protected]> > > > --- > > > tools/perf/util/Build | 1 + > > > tools/perf/util/c2c-function.c | 66 ++++++++++++++++++++++++++++++++++ > > > 2 files changed, 67 insertions(+) > > > create mode 100644 tools/perf/util/c2c-function.c > > > > > > diff --git a/tools/perf/util/Build b/tools/perf/util/Build > > > index 1dfd92cbe3b7..b26a0b1ddfa3 100644 > > > --- a/tools/perf/util/Build > > > +++ b/tools/perf/util/Build > > > @@ -12,6 +12,7 @@ perf-util-y += block-info.o > > > perf-util-y += block-range.o > > > perf-util-y += build-id.o > > > perf-util-y += c2c.o > > > +perf-util-y += c2c-function.o > > > perf-util-y += cacheline.o > > > perf-util-$(CONFIG_LIBCAPSTONE) += capstone.o > > > perf-util-y += config.o > > > diff --git a/tools/perf/util/c2c-function.c b/tools/perf/util/c2c-function.c > > > new file mode 100644 > > > index 000000000000..ca82425a28dc > > > --- /dev/null > > > +++ b/tools/perf/util/c2c-function.c > > > @@ -0,0 +1,66 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * C2C function model - function-level cacheline sharing analysis > > > + * > > > + * Displays a 3-level hierarchy showing which functions share cachelines: > > > + * Level 1: Read-side functions sorted by Cycles % (estimated load cycles) > > > + * Level 2: Functions sampled writing the shared lines read by level 1 > > > + * Level 3: The specific cachelines where the two functions contend > > > + * > > > + * Builds the hierarchy from the existing cacheline histograms > > > + * (c2c_hist_entry->hists), reusing the shared c2c data structures. > > > + */ > > > + > > > +#include <errno.h> > > > +#include <inttypes.h> > > > +#include <stdlib.h> > > > +#include <string.h> > > > +#include <tools/libc_compat.h> /* reallocarray */ > > > +#include <linux/list.h> > > > +#include <linux/rbtree.h> > > > +#include <linux/zalloc.h> > > > + > > > +#include "addr_location.h" > > > +#include "c2c.h" > > > +#include "cacheline.h" > > > +#include "hist.h" > > > +#include "map.h" > > > +#include "mem-events.h" > > > +#include "mem-info.h" > > > +#include "sort.h" > > > +#include "symbol.h" > > > +#include "thread.h" > > > > nit: the number of #includes is somewhat generous here. I presume > > later patches will require these includes. To avoid everything > > depending on everything else it would be nice to use forward > > declarations when possible. For example, if the only reason for > > including the header file was to use a struct's name where it is > > passed as a pointer in a function declaration, ie in header files > > prefer: > > > > struct map; > > int foo(struct map *m); > > > > over > > > > #include "map.h" > > int foo(struct map *m); > > I think they are actually used in the later patches in this series. Ah. I misread and thought they were being added to the header file. My mistake and I guess it is okay to add unused header file #includes in the same way as the patches introduce initially unused functions. Reviewed-by: Ian Rogers <[email protected]> Thanks, Ian > > > > > + > > > +struct c2c_function_model { > > > + struct c2c_hists function_hists; > > > + /* Total estimated cycles across all level-1 entries. */ > > > + u64 total_cycles; > > > + /* Source cacheline histograms; not owned here. */ > > > + struct c2c_hists *cl_hists; > > > + /* --coalesce field list, used to require iaddr. */ > > > + const char *cl_sort; > > > + /* Do not cap long symbol names. */ > > > + bool symbol_full; > > > +}; > > > + > > > +static struct c2c_function_model c2c_ext __maybe_unused; > > > + > > > +static inline __maybe_unused u64 c2c_hitm_count(const struct c2c_stats *stats) > > > +{ > > > + return stats->tot_hitm; > > > +} > > > + > > > +static inline __maybe_unused bool symbol_name_equal(struct symbol *a, struct symbol *b) > > > +{ > > > + /* Two unknown symbols compare equal, matching cmp_null() in util/sort.c. */ > > > + if (!a || !b) > > > + return a == b; > > > + return arch__compare_symbol_names(a->name, b->name) == 0; > > > > Sashiko rightly flagged this as not being cross-platform compatible, > > but this is a pre-existing issue that looks relatively easy to clean > > up but only really impacts PowerPC and so is hard for me to test. I'll > > try to do it anyway. > > Thanks for your review. Yep, I think it can be handled separately. > > Namhyung > > > > > > +} > > > + > > > +static inline __maybe_unused u64 hist_entry__iaddr(struct hist_entry *he) > > > +{ > > > + if (he->mem_info) > > > + return mem_info__iaddr(he->mem_info)->addr; > > > + return he->ip; > > > +} > > > -- > > > 2.52.0 > > >