mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
Add the browser front end: create/run/delete the hist_browser and add the title. The d shortcut opens the existing per-cacheline detail view for the selected level-3 cacheline. Level-3 entries retain the source cacheline index, so the shortcut can locate the original entry without relying on a potentially ambiguous virtual address. Report a warning when the common model rejects a cacheline coalescing field list without `iaddr`. Without it, the detail histograms may already have merged samples from different functions and cannot support reliable function attribution. Keep visible-row accounting local to the function view by wrapping the generic browser refresh callback and recounting the currently reachable hierarchy before each redraw. This keeps navigation correct when a level-1 row is collapsed while level-3 descendants remain expanded, without adding C2C-specific hooks to the shared hist_browser. Also handle Ctrl-C like the other function-view exit keys. Keep callchains hidden while the function browser runs, restoring the user's setting while opening the cacheline detail view. Wire the builder into perf_c2c__browse_function_view(). 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>
136 lines
3.0 KiB
C
136 lines
3.0 KiB
C
/* 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 */
|