mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 13:23:18 +00:00
7043dc5286
Add weight1, weight2 and weight3 fields to -F/--fields and their aliases like 'ins_lat', 'p_stage_cyc' and 'retire_lat'. Note that they are in the sort keys too but the difference is that output fields will sum up the weight values and display the average. In the sort key, users can see the distribution of weight value and I think it's confusing we have local vs. global weight for the same weight. For example, I experiment with mem-loads events to get the weights. On my laptop, it seems only weight1 field is supported. $ perf mem record -- perf test -w noploop Let's look at the noploop function only. It has 7 samples. $ perf script -F event,ip,sym,weight | grep noploop # event weight ip sym cpu/mem-loads,ldlat=30/P: 43 55b3c122bffc noploop cpu/mem-loads,ldlat=30/P: 48 55b3c122bffc noploop cpu/mem-loads,ldlat=30/P: 38 55b3c122bffc noploop <--- same weight cpu/mem-loads,ldlat=30/P: 38 55b3c122bffc noploop <--- same weight cpu/mem-loads,ldlat=30/P: 59 55b3c122bffc noploop cpu/mem-loads,ldlat=30/P: 33 55b3c122bffc noploop cpu/mem-loads,ldlat=30/P: 38 55b3c122bffc noploop <--- same weight When you use the 'weight' sort key, it'd show entries with a separate weight value separately. Also note that the first entry has 3 samples with weight value 38, so they are displayed together and the weight value is the sum of 3 samples (114 = 38 * 3). $ perf report -n -s +weight | grep -e Weight -e noploop # Overhead Samples Command Shared Object Symbol Weight 0.53% 3 perf perf [.] noploop 114 0.18% 1 perf perf [.] noploop 59 0.18% 1 perf perf [.] noploop 48 0.18% 1 perf perf [.] noploop 43 0.18% 1 perf perf [.] noploop 33 If you use 'local_weight' sort key, you can see the actual weight. $ perf report -n -s +local_weight | grep -e Weight -e noploop # Overhead Samples Command Shared Object Symbol Local Weight 0.53% 3 perf perf [.] noploop 38 0.18% 1 perf perf [.] noploop 59 0.18% 1 perf perf [.] noploop 48 0.18% 1 perf perf [.] noploop 43 0.18% 1 perf perf [.] noploop 33 But when you use the -F/--field option instead, you can see the average weight for the while noploop function (as it won't group samples by weight value and use the default 'comm,dso,sym' sort keys). $ perf report -n -F +weight | grep -e Weight -e noploop Warning: --fields weight shows the average value unlike in the --sort key. # Overhead Samples Weight1 Command Shared Object Symbol 1.23% 7 42.4 perf perf [.] noploop The weight1 field shows the average value: (38 * 3 + 59 + 48 + 43 + 33) / 7 = 42.4 Also it'd show the warning that 'weight' field has the average value. Using 'weight1' can remove the warning. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: https://lore.kernel.org/r/20240411181718.2367948-3-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
155 lines
3.7 KiB
C
155 lines
3.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __PERF_SORT_H
|
|
#define __PERF_SORT_H
|
|
#include <regex.h>
|
|
#include <stdbool.h>
|
|
#include "hist.h"
|
|
|
|
struct option;
|
|
|
|
extern regex_t parent_regex;
|
|
extern const char *sort_order;
|
|
extern const char *field_order;
|
|
extern const char default_parent_pattern[];
|
|
extern const char *parent_pattern;
|
|
extern const char *default_sort_order;
|
|
extern regex_t ignore_callees_regex;
|
|
extern int have_ignore_callees;
|
|
extern enum sort_mode sort__mode;
|
|
extern struct sort_entry sort_comm;
|
|
extern struct sort_entry sort_dso;
|
|
extern struct sort_entry sort_sym;
|
|
extern struct sort_entry sort_parent;
|
|
extern struct sort_entry sort_dso_from;
|
|
extern struct sort_entry sort_dso_to;
|
|
extern struct sort_entry sort_sym_from;
|
|
extern struct sort_entry sort_sym_to;
|
|
extern struct sort_entry sort_srcline;
|
|
extern struct sort_entry sort_type;
|
|
extern const char default_mem_sort_order[];
|
|
extern bool chk_double_cl;
|
|
|
|
enum sort_mode {
|
|
SORT_MODE__NORMAL,
|
|
SORT_MODE__BRANCH,
|
|
SORT_MODE__MEMORY,
|
|
SORT_MODE__TOP,
|
|
SORT_MODE__DIFF,
|
|
SORT_MODE__TRACEPOINT,
|
|
};
|
|
|
|
enum sort_type {
|
|
/* common sort keys */
|
|
SORT_PID,
|
|
SORT_COMM,
|
|
SORT_DSO,
|
|
SORT_SYM,
|
|
SORT_PARENT,
|
|
SORT_CPU,
|
|
SORT_SOCKET,
|
|
SORT_SRCLINE,
|
|
SORT_SRCFILE,
|
|
SORT_LOCAL_WEIGHT,
|
|
SORT_GLOBAL_WEIGHT,
|
|
SORT_TRANSACTION,
|
|
SORT_TRACE,
|
|
SORT_SYM_SIZE,
|
|
SORT_DSO_SIZE,
|
|
SORT_CGROUP,
|
|
SORT_CGROUP_ID,
|
|
SORT_SYM_IPC_NULL,
|
|
SORT_TIME,
|
|
SORT_CODE_PAGE_SIZE,
|
|
SORT_LOCAL_INS_LAT,
|
|
SORT_GLOBAL_INS_LAT,
|
|
SORT_LOCAL_PIPELINE_STAGE_CYC,
|
|
SORT_GLOBAL_PIPELINE_STAGE_CYC,
|
|
SORT_ADDR,
|
|
SORT_LOCAL_RETIRE_LAT,
|
|
SORT_GLOBAL_RETIRE_LAT,
|
|
SORT_SIMD,
|
|
SORT_ANNOTATE_DATA_TYPE,
|
|
SORT_ANNOTATE_DATA_TYPE_OFFSET,
|
|
SORT_SYM_OFFSET,
|
|
|
|
/* branch stack specific sort keys */
|
|
__SORT_BRANCH_STACK,
|
|
SORT_DSO_FROM = __SORT_BRANCH_STACK,
|
|
SORT_DSO_TO,
|
|
SORT_SYM_FROM,
|
|
SORT_SYM_TO,
|
|
SORT_MISPREDICT,
|
|
SORT_ABORT,
|
|
SORT_IN_TX,
|
|
SORT_CYCLES,
|
|
SORT_SRCLINE_FROM,
|
|
SORT_SRCLINE_TO,
|
|
SORT_SYM_IPC,
|
|
SORT_ADDR_FROM,
|
|
SORT_ADDR_TO,
|
|
|
|
/* memory mode specific sort keys */
|
|
__SORT_MEMORY_MODE,
|
|
SORT_MEM_DADDR_SYMBOL = __SORT_MEMORY_MODE,
|
|
SORT_MEM_DADDR_DSO,
|
|
SORT_MEM_LOCKED,
|
|
SORT_MEM_TLB,
|
|
SORT_MEM_LVL,
|
|
SORT_MEM_SNOOP,
|
|
SORT_MEM_DCACHELINE,
|
|
SORT_MEM_IADDR_SYMBOL,
|
|
SORT_MEM_PHYS_DADDR,
|
|
SORT_MEM_DATA_PAGE_SIZE,
|
|
SORT_MEM_BLOCKED,
|
|
};
|
|
|
|
/*
|
|
* configurable sorting bits
|
|
*/
|
|
|
|
struct sort_entry {
|
|
const char *se_header;
|
|
|
|
int64_t (*se_cmp)(struct hist_entry *, struct hist_entry *);
|
|
int64_t (*se_collapse)(struct hist_entry *, struct hist_entry *);
|
|
int64_t (*se_sort)(struct hist_entry *, struct hist_entry *);
|
|
int (*se_snprintf)(struct hist_entry *he, char *bf, size_t size,
|
|
unsigned int width);
|
|
int (*se_filter)(struct hist_entry *he, int type, const void *arg);
|
|
void (*se_init)(struct hist_entry *he);
|
|
u8 se_width_idx;
|
|
};
|
|
|
|
extern struct sort_entry sort_thread;
|
|
|
|
struct evlist;
|
|
struct tep_handle;
|
|
int setup_sorting(struct evlist *evlist);
|
|
int setup_output_field(void);
|
|
void reset_output_field(void);
|
|
void sort__setup_elide(FILE *fp);
|
|
void perf_hpp__set_elide(int idx, bool elide);
|
|
|
|
char *sort_help(const char *prefix);
|
|
|
|
int report_parse_ignore_callees_opt(const struct option *opt, const char *arg, int unset);
|
|
|
|
bool is_strict_order(const char *order);
|
|
|
|
int hpp_dimension__add_output(unsigned col);
|
|
void reset_dimensions(void);
|
|
int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
|
|
struct evlist *evlist,
|
|
int level);
|
|
int output_field_add(struct perf_hpp_list *list, const char *tok);
|
|
int64_t
|
|
sort__iaddr_cmp(struct hist_entry *left, struct hist_entry *right);
|
|
int64_t
|
|
sort__daddr_cmp(struct hist_entry *left, struct hist_entry *right);
|
|
int64_t
|
|
sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right);
|
|
int64_t
|
|
_sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r);
|
|
char *hist_entry__srcline(struct hist_entry *he);
|
|
#endif /* __PERF_SORT_H */
|