| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef __PERF_UTIL_C2C_H | |
| #define __PERF_UTIL_C2C_H | |
| #include <stdbool.h> | |
| #include <stdint.h> | |
| #include <linux/types.h> | |
| #include "hist.h" | |
| #include "mem-events.h" | |
| #include "stat.h" | |
| struct sort_entry; | |
| struct c2c_hists { | |
| struct hists hists; | |
| struct perf_hpp_list list; | |
| struct c2c_stats stats; | |
| }; | |
| struct compute_stats { | |
| struct stats lcl_hitm; | |
| struct stats rmt_hitm; | |
| struct stats lcl_peer; | |
| struct stats rmt_peer; | |
| struct stats load; | |
| }; | |
| struct c2c_hist_entry { | |
| struct c2c_hists *hists; | |
| struct evsel *evsel; | |
| struct c2c_stats stats; | |
| unsigned long *cpuset; | |
| unsigned long *nodeset; | |
| struct c2c_stats *node_stats; | |
| unsigned int cacheline_idx; | |
| struct compute_stats cstats; | |
| unsigned long paddr; | |
| unsigned long paddr_cnt; | |
| bool paddr_zero; | |
| char *nodestr; | |
| /* | |
| * must be at the end, | |
| * because of its callchain dynamic entry | |
| */ | |
| struct hist_entry he; | |
| }; | |
| #define C2C_HEADER_MAX 2 | |
| struct c2c_header { | |
| struct { | |
| const char *text; | |
| int span; | |
| } line[C2C_HEADER_MAX]; | |
| }; | |
| struct c2c_dimension { | |
| struct c2c_header header; | |
| const char *name; | |
| int width; | |
| struct sort_entry *se; | |
| int64_t (*cmp)(struct perf_hpp_fmt *fmt, | |
| struct hist_entry *left, struct hist_entry *right); | |
| int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, | |
| struct hist_entry *he); | |
| int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, | |
| struct hist_entry *he); | |
| }; | |
| struct c2c_fmt { | |
| struct perf_hpp_fmt fmt; | |
| struct c2c_dimension *dim; | |
| }; | |
| #define SYMBOL_WIDTH 30 | |
| #define HEADER_LOW(__h) \ | |
| { \ | |
| .line[1] = { \ | |
| .text = __h, \ | |
| }, \ | |
| } | |
| #define HEADER_BOTH(__h0, __h1) \ | |
| { \ | |
| .line[0] = { \ | |
| .text = __h0, \ | |
| }, \ | |
| .line[1] = { \ | |
| .text = __h1, \ | |
| }, \ | |
| } | |
| void c2c_fmt_free(struct perf_hpp_fmt *fmt); | |
| bool c2c_fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b); | |
| /* | |
| * Build the function-view hierarchy. Returns -EOPNOTSUPP when @cl_sort lacks | |
| * iaddr. On success, *@hists remains valid until the next | |
| * c2c_function__build() or c2c_function__reset(). On failure, *@hists is | |
| * NULL. | |
| */ | |
| int c2c_function__build(struct c2c_hists *cl_hists, const char *cl_sort, | |
| bool symbol_full, struct hists **hists); | |
| void c2c_function__reset(void); | |
| /* Valid only between a successful build and c2c_function__reset(). */ | |
| struct hist_entry *c2c_function__find_cacheline(struct hist_entry *he); | |
| /* Inputs and TUI callback supplied by the c2c command. */ | |
| struct c2c_function_view_args { | |
| /* Source cacheline histograms used by the common model. */ | |
| 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; | |
| /* Open the cacheline detail view for @he. */ | |
| int (*browse_cacheline)(struct hist_entry *he); | |
| }; | |
| #ifdef HAVE_SLANG_SUPPORT | |
| int perf_c2c__browse_function_view(struct c2c_function_view_args *args); | |
| #else | |
| static inline int | |
| perf_c2c__browse_function_view(struct c2c_function_view_args *args __maybe_unused) | |
| { | |
| return 0; | |
| } | |
| #endif | |
| #endif /* __PERF_UTIL_C2C_H */ |