mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
perf c2c: add function view model skeleton
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 <jiebin.sun@intel.com> Reviewed-by: Tianyou Li <tianyou.li@intel.com> Reviewed-by: Wangyang Guo <wangyang.guo@intel.com> Reviewed-by: Ian Rogers <irogers@google.com> Cc: Dapeng Mi <dapeng1.mi@linux.intel.com> Cc: James Clark <james.clark@linaro.org> Cc: Thomas Falcon <thomas.falcon@intel.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
734150717a
commit
e9ffc77f3f
|
|
@ -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
|
||||
|
|
|
|||
66
tools/perf/util/c2c-function.c
Normal file
66
tools/perf/util/c2c-function.c
Normal file
|
|
@ -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"
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user