16 #include <linux/list.h> 17 #include <linux/rbtree.h> 18 #include <linux/err.h> 31 #include <subcmd/parse-options.h> 32 #include <subcmd/exec-cmd.h> 50 #include <linux/bitmap.h> 51 #include <linux/stringify.h> 52 #include <sys/types.h> 55 #include <linux/mman.h> 94 if (!strcmp(var,
"report.group")) {
98 if (!strcmp(var,
"report.percent-limit")) {
99 double pcnt = strtof(value, NULL);
105 if (!strcmp(var,
"report.children")) {
109 if (!strcmp(var,
"report.queue-size"))
112 if (!strcmp(var,
"report.sort_order")) {
167 bool single __maybe_unused,
208 struct report *rep = container_of(tool,
struct report, tool);
214 pr_err(
"failed: wrong feature ID: %" PRIu64
"\n",
233 struct report *rep = container_of(tool,
struct report, tool);
249 pr_debug(
"problem processing %d event, skipping it.\n",
257 if (rep->
cpu_list && !test_bit(sample->
cpu, rep->cpu_bitmap))
283 pr_debug(
"problem adding hist entry, skipping event\n");
295 struct report *rep = container_of(tool,
struct report, tool);
323 sample_type |= PERF_SAMPLE_CALLCHAIN;
326 sample_type |= PERF_SAMPLE_BRANCH_STACK;
328 if (!is_pipe && !(sample_type & PERF_SAMPLE_CALLCHAIN)) {
330 ui__error(
"Selected --sort parent, but no " 331 "callchain data. Did you call " 332 "'perf record' without -g?\n");
337 ui__error(
"Selected -g or --branch-history.\n" 338 "But no callchain or branch data.\n" 339 "Did you call 'perf record' without -g or -b?\n");
347 ui__error(
"Can't register callchain params.\n");
354 if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
362 !(sample_type & PERF_SAMPLE_BRANCH_STACK)) {
363 ui__error(
"Selected -b but no branch data. " 364 "Did you call perf record without -b?\n");
370 if ((sample_type & PERF_SAMPLE_REGS_USER) &&
371 (sample_type & PERF_SAMPLE_STACK_USER)) {
374 }
else if (sample_type & PERF_SAMPLE_BRANCH_STACK)
382 PERF_SAMPLE_BRANCH_ANY))
394 const char *evname, FILE *fp)
398 unsigned long nr_samples = hists->
stats.
nr_events[PERF_RECORD_SAMPLE];
402 size_t size =
sizeof(buf);
433 ret = fprintf(fp,
"# Samples: %lu%c", nr_samples, unit);
434 if (evname != NULL) {
435 ret += fprintf(fp,
" of event%s '%s'",
440 ret += fprintf(fp,
" (time slices: %s)", rep->
time_str);
443 strstr(evname,
"call-graph=no")) {
444 ret += fprintf(fp,
", show reference callgraph");
448 ret += fprintf(fp,
"\n# Total weight : %" PRIu64, nr_events);
451 ret += fprintf(fp,
"\n# Event count (approx.): %" PRIu64, nr_events);
454 ret += fprintf(fp,
"\n# Processor Socket: %d", socked_id);
456 return ret + fprintf(fp,
"\n#\n");
466 fprintf(stdout,
"#\n# Total Lost Samples: %" PRIu64
"\n#\n",
482 fprintf(stdout,
"\n\n");
486 fprintf(stdout,
"#\n# (%s)\n#\n", help);
504 struct kmap *kernel_kmap = kernel_map ?
map__kmap(kernel_map) : NULL;
509 if (kernel_map == NULL ||
514 "As no suitable kallsyms nor vmlinux was found, kernel samples\n" 515 "can't be resolved.";
518 desc =
"If some relocation was applied (e.g. " 519 "kexec) symbols may be misresolved.";
523 "Kernel address maps (/proc/{kallsyms,modules}) were restricted.\n\n" 524 "Check /proc/sys/kernel/kptr_restrict before running 'perf record'.\n\n%s\n\n" 525 "Samples in kernel modules can't be resolved as well.\n\n",
550 const char *help =
perf_tip(system_path(TIPDIR));
556 help =
"Cannot load tips.txt file, please install perf!";
660 struct list_head list;
661 struct list_head children;
667 struct task *parent_task;
670 if (!list_empty(&task->
list))
674 if (thread->
ppid == -1)
679 return ERR_PTR(-ENOENT);
691 for (nd = rb_first(&maps->
entries); nd; nd = rb_next(nd)) {
694 printed += fprintf(fp,
"%*s %" PRIx64
"-%" PRIx64
" %c%c%c%c %08" PRIx64
" %" PRIu64
" %s\n",
696 map->
prot & PROT_READ ?
'r' :
'-',
697 map->
prot & PROT_WRITE ?
'w' :
'-',
698 map->
prot & PROT_EXEC ?
'x' :
'-',
699 map->
flags & MAP_SHARED ?
's' :
'p',
716 int comm_indent = fprintf(fp,
" %8d %8d %8d |%*s",
735 unsigned int nr = 0, itask = 0, i;
748 tasks =
malloc(
sizeof(*tasks) * nr);
755 for (nd = rb_first(&threads->
entries); nd; nd = rb_next(nd)) {
756 task = tasks + itask++;
760 INIT_LIST_HEAD(&task->
list);
770 for (itask = 0; itask <
nr; itask++) {
771 task = tasks + itask;
773 if (!list_empty(&task->
list))
778 pr_err(
"Error: failed to process tasks\n");
780 return PTR_ERR(task);
784 list_add_tail(&task->
list, &list);
787 fprintf(fp,
"# %8s %8s %8s %s\n",
"pid",
"tid",
"ppid",
"comm");
789 list_for_each_entry(task, &list, list)
866 ui__error(
"failed to process hist entry\n");
911 const char *arg,
int unset __maybe_unused)
918 pr_err(
"Invalid --ignore-callees regex: %s\n%s", arg, buf);
929 const char *
str __maybe_unused,
int unset)
933 *branch_mode = !unset;
939 int unset __maybe_unused)
941 struct report *rep = opt->value;
942 double pcnt = strtof(str, NULL);
954 bool has_br_stack =
false;
956 bool branch_call_mode =
false;
957 #define CALLCHAIN_DEFAULT_OPT "graph,0.5,caller,function,percent" 958 const char report_callchain_help[] =
"Display call graph (stack chain/backtrace):\n\n" 962 const char *
const report_usage[] = {
963 "perf report [<options>]",
984 .ordered_events =
true,
985 .ordering_requires_timestamps =
true,
987 .max_stack = PERF_MAX_STACK_DEPTH,
988 .pretty_printing_style =
"normal",
992 const struct option options[] = {
995 OPT_INCR(
'v',
"verbose", &
verbose,
996 "be more verbose (show symbol address, etc)"),
997 OPT_BOOLEAN(
'q',
"quiet", &
quiet,
"Do not show any message"),
998 OPT_BOOLEAN(
'D',
"dump-raw-trace", &
dump_trace,
999 "dump raw trace in ASCII"),
1000 OPT_BOOLEAN(0,
"stats", &report.
stats_mode,
"Display event stats"),
1001 OPT_BOOLEAN(0,
"tasks", &report.
tasks_mode,
"Display recorded tasks"),
1002 OPT_BOOLEAN(0,
"mmaps", &report.
mmaps_mode,
"Display recorded tasks memory maps"),
1004 "file",
"vmlinux pathname"),
1006 "don't load vmlinux even if found"),
1008 "file",
"kallsyms pathname"),
1011 "load module symbols - WARNING: use only with -k and LIVE kernel"),
1013 "Show a column with the number of samples"),
1015 "Show per-thread event counters"),
1017 "pretty printing style key: normal raw"),
1018 OPT_BOOLEAN(0,
"tui", &report.
use_tui,
"Use the TUI interface"),
1019 OPT_BOOLEAN(0,
"gtk", &report.
use_gtk,
"Use the GTK2 interface"),
1020 OPT_BOOLEAN(0,
"stdio", &report.
use_stdio,
1021 "Use the stdio interface"),
1022 OPT_BOOLEAN(0,
"header", &report.
header,
"Show data header."),
1023 OPT_BOOLEAN(0,
"header-only", &report.
header_only,
1024 "Show only data header."),
1025 OPT_STRING(
's',
"sort", &
sort_order,
"key[,key2...]",
1026 "sort by key(s): pid, comm, dso, symbol, parent, cpu, srcline, ..." 1027 " Please refer the man page for the complete list."),
1028 OPT_STRING(
'F',
"fields", &
field_order,
"key[,keys...]",
1029 "output field(s): overhead, period, sample plus all of sort keys"),
1031 "Show sample percentage for different cpu modes"),
1033 "Show sample percentage for different cpu modes", PARSE_OPT_HIDDEN),
1035 "regex filter to identify parent, see: '--sort parent'"),
1037 "Only display entries with parent-match"),
1039 "print_type,threshold[,print_limit],order,sort_key[,branch],value",
1041 callchain_default_opt),
1043 "Accumulate callchains of children and show total overhead as well"),
1044 OPT_INTEGER(0,
"max-stack", &report.
max_stack,
1045 "Set the maximum stack depth when parsing the callchain, " 1046 "anything beyond the specified depth will be ignored. " 1047 "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
1049 "alias for inverted call graph"),
1050 OPT_CALLBACK(0,
"ignore-callees", NULL,
"regex",
1051 "ignore callees of these functions in call graphs",
1054 "only consider symbols in these dsos"),
1056 "only consider symbols in these comms"),
1058 "only consider symbols in these pids"),
1060 "only consider symbols in these tids"),
1062 "only consider these symbols"),
1064 "only show symbols that (partially) match with this filter"),
1067 "don't try to adjust column width, use these fixed values"),
1069 "separator for columns, no spaces will be added between " 1070 "columns '.' is reserved."),
1072 "Only display entries resolved to a symbol"),
1073 OPT_CALLBACK(0,
"symfs", NULL,
"directory",
1074 "Look for files with symbols relative to this directory",
1076 OPT_STRING(
'C',
"cpu", &report.
cpu_list,
"cpu",
1077 "list of cpus to profile"),
1079 "Display extended information about perf.data file"),
1081 "Interleave source code with assembly code (default)"),
1083 "Display raw encoding of assembly instructions (default)"),
1085 "Specify disassembler style (e.g. -M intel for intel syntax)"),
1087 "Show a column with the sum of periods"),
1089 "Show event group information together"),
1090 OPT_CALLBACK_NOOPT(
'b',
"branch-stack", &branch_mode,
"",
1091 "use branch records for per branch histogram filling",
1093 OPT_BOOLEAN(0,
"branch-history", &branch_call_mode,
1094 "add last branch records to call history"),
1096 "objdump binary to use for disassembly and annotations"),
1098 "Disable symbol demangling"),
1100 "Enable kernel symbol demangling"),
1101 OPT_BOOLEAN(0,
"mem-mode", &report.
mem_mode,
"mem access profile"),
1102 OPT_CALLBACK(0,
"percent-limit", &report,
"percent",
1104 OPT_CALLBACK(0,
"percentage", NULL,
"relative|absolute",
1106 OPT_CALLBACK_OPTARG(0,
"itrace", &itrace_synth_opts, NULL,
"opts",
1107 "Instruction Tracing options",
1110 "Show full source file name path for source lines"),
1112 "Show callgraph from reference event"),
1114 "only show processor socket that match with this filter"),
1116 "Show raw trace event output (do not use print fmt or plugins)"),
1118 "Show entries in a hierarchy"),
1119 OPT_CALLBACK_DEFAULT(0,
"stdio-color", NULL,
"mode",
1120 "'always' (default), 'never' or 'auto' only applicable to --stdio mode",
1122 OPT_STRING(0,
"time", &report.
time_str,
"str",
1123 "Time span of interest (start,stop)"),
1125 "Show inline function"),
1140 argc = parse_options(argc, argv, options, report_usage, 0);
1147 usage_with_options(report_usage, options);
1179 if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
1190 if (session == NULL)
1208 has_br_stack =
true;
1210 if (has_br_stack && branch_call_mode)
1220 if (((branch_mode == -1 && has_br_stack) || branch_mode == 1) &&
1221 !branch_call_mode) {
1225 if (branch_call_mode) {
1236 pr_err(
"branch and mem mode incompatible\n");
1248 pr_err(
"Error: --hierarchy and --fields options cannot be used together\n");
1249 parse_options_usage(report_usage, options,
"F", 1);
1250 parse_options_usage(NULL, options,
"hierarchy", 0);
1274 pr_err(
"Error: --tasks and --mmaps can't be used together with --stats\n");
1285 parse_options_usage(report_usage, options,
"s", 1);
1287 parse_options_usage(
sort_order ? NULL : report_usage,
1301 fputs(
"# To display the perf.data header info, please use --header/--header-only options.\n#\n",
1345 pr_err(
"HINT: no first/last sample time found in perf data.\n" 1346 "Please use latest perf binary to execute 'perf record'\n" 1347 "(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
1359 pr_err(
"Invalid time string\n");
1371 pr_err(
"%s: failed to set libtraceevent function resolver\n",
int perf_read_values_add_value(struct perf_read_values *values, u32 pid, u32 tid, u64 rawid, const char *name, u64 value)
static void setup_sorting(struct perf_sched *sched, const struct option *options, const char *const usage_msg[])
static int report_parse_callchain_opt(const struct option *opt, const char *arg, int unset)
static void setup_forced_leader(struct report *report, struct perf_evlist *evlist)
int(* add_entry_cb)(struct hist_entry_iter *iter, struct addr_location *al, bool single, void *arg)
static int report__browse_hists(struct report *rep)
const char * comm_list_str
int cmd_report(int argc, const char **argv)
const char * col_width_list_str
struct perf_sample * sample
void perf_hpp__cancel_cumulate(void)
static void ordered_events__set_alloc_size(struct ordered_events *oe, u64 size)
struct perf_evlist * evlist
static int process_sample_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample, struct perf_evsel *evsel, struct machine *machine)
struct branch_type_stat brtype_stat
int stdio__config_color(const struct option *opt __maybe_unused, const char *mode, int unset __maybe_unused)
int machine__resolve(struct machine *machine, struct addr_location *al, struct perf_sample *sample)
size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
struct ordered_events ordered_events
const char * vmlinux_name
static void stats_setup(struct report *rep)
const char * perf_tip(const char *dirpath)
struct kmap * map__kmap(struct map *map)
static LIST_HEAD(page_alloc_sort_input)
enum sort_mode sort__mode
int ui__error(const char *format,...)
#define CALLCHAIN_REPORT_HELP
int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sample, struct perf_evsel *evsel, u64 ip)
int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, struct hist_browser_timer *hbt, float min_pcnt, struct perf_env *env, bool warn_lost_event, struct annotation_options *annotation_opts)
static int stats_print(struct report *rep)
int perf_event__process_mmap(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
int hists__link(struct hists *leader, struct hists *other)
struct feature_event feat
unsigned int callchain_sz
int ui__warning(const char *format,...)
static int report__gtk_browse_hists(struct report *rep, const char *help)
int hists__collapse_resort(struct hists *hists, struct ui_progress *prog)
int perf_config_bool(const char *name, const char *value)
struct perf_time_interval * perf_time__range_alloc(const char *ostr, int *size)
static void report__warn_kptr_restrict(const struct report *rep)
bool perf_evlist__exclude_kernel(struct perf_evlist *evlist)
struct itrace_synth_opts * itrace_synth_opts
struct perf_data_file file
const char * tid_list_str
struct list_head children
enum perf_call_graph_mode record_mode
struct annotation_options annotation_opts
static int hist_iter__report_callback(struct hist_entry_iter *iter, struct addr_location *al, bool single, void *arg)
size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
struct addr_map_symbol daddr
int perf_event__process_comm(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
int perf_event__process_exit(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
static struct hists * evsel__hists(struct perf_evsel *evsel)
static int report__setup_sample_type(struct report *rep)
struct branch_flags flags
int perf_event__process_fork(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
bool srcline_full_filename
static int parse_percent_limit(const struct option *opt, const char *str, int unset __maybe_unused)
x86 movsq based memset() in arch/x86/lib/memset_64.S") MEMSET_FN(memset_erms
bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf, int num, u64 timestamp)
static void tasks_setup(struct report *rep)
void perf_session__delete(struct perf_session *session)
struct trace_event tevent
int perf_quiet_option(void)
u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist)
struct perf_time_interval * ptime_range
static struct map * machine__kernel_map(struct machine *machine)
struct thread * machine__find_thread(struct machine *machine, pid_t pid, pid_t tid)
static void report__output_resort(struct report *rep)
void addr_location__put(struct addr_location *al)
int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
void setup_browser(bool fallback_to_pager)
int symbol__config_symfs(const struct option *opt __maybe_unused, const char *dir, int unset __maybe_unused)
bool dwarf_callchain_users
const char * objdump_path
const char * thread__comm_str(const struct thread *thread)
static struct perf_evsel * hists_to_evsel(struct hists *hists)
struct perf_evlist * evlist
int parse_callchain_report_opt(const char *arg)
#define pr_debug(fmt,...)
static int tasks_print(struct report *rep, FILE *fp)
#define evlist__for_each_entry(evlist, evsel)
struct perf_read_values show_threads_values
void sort__setup_elide(FILE *output)
struct perf_session * session
struct threads threads[THREADS__TABLE_SIZE]
const char * default_sort_order
u32 nr_non_filtered_samples
DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS)
int itrace_parse_synth_opts(const struct option *opt, const char *str, int unset)
const char * parent_pattern
unsigned long convert_unit(unsigned long value, char *unit)
static int str(yyscan_t scanner, int token)
int perf_config_u64(u64 *dest, const char *name, const char *value)
int symbol__annotation_init(void)
static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report *rep, const char *evname, FILE *fp)
void perf_read_values_display(FILE *fp, struct perf_read_values *values, int raw)
static void task__print_level(struct task *task, FILE *fp, int level)
const char default_mem_sort_order[]
const char * pid_list_str
#define ui_progress__init(p, total, title)
s64 perf_event__process_auxtrace(struct perf_tool *tool, union perf_event *event, struct perf_session *session)
const char * symbol_filter_str
int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_session *session)
struct branch_stack * branch_stack
void branch_type_stat_display(FILE *fp, struct branch_type_stat *st)
const char * pretty_printing_style
struct ref_reloc_sym * ref_reloc_sym
const char * disassembler_style
bool map__has_symbols(const struct map *map)
const char * dso_list_str
int report_parse_ignore_callees_opt(const struct option *opt __maybe_unused, const char *arg, int unset __maybe_unused)
static int process_read_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample __maybe_unused, struct perf_evsel *evsel, struct machine *machine __maybe_unused)
static struct task * tasks_list(struct task *task, struct machine *machine)
const char * perf_evsel__name(struct perf_evsel *evsel)
static int report__config(const char *var, const char *value, void *cb)
void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags, u64 from, u64 to)
bool ui__has_annotation(void)
const struct hist_iter_ops hist_iter_mem
struct perf_event_header header
static int hist_iter__branch_callback(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused, bool single __maybe_unused, void *arg)
int perf_read_values_init(struct perf_read_values *values)
#define CALLCHAIN_DEFAULT_OPT
static size_t maps__fprintf_task(struct maps *maps, int indent, FILE *fp)
void ui_progress__finish(void)
const struct hist_iter_ops hist_iter_normal
static int perf_data__is_pipe(struct perf_data *data)
struct branch_info * branch_info
void hist__account_cycles(struct branch_stack *bs, struct addr_location *al, struct perf_sample *sample, bool nonany_branch_mode)
struct perf_session * perf_session__new(struct perf_data *data, bool repipe, struct perf_tool *tool)
struct mem_info * mem_info
int perf_event__process_mmap2(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
const char * kallsyms_name
void perf_evlist__force_leader(struct perf_evlist *evlist)
#define for_each_group_member(_evsel, _leader)
struct annotation_options annotation__default_options
int perf_time__percent_parse_str(struct perf_time_interval *ptime_buf, int num, const char *ostr, u64 start, u64 end)
unsigned long * cpu_bitmap
int perf_config(config_fn_t fn, void *data)
int perf_session__process_events(struct perf_session *session)
void hists__match(struct hists *leader, struct hists *other)
struct perf_evsel * leader
regex_t ignore_callees_regex
bool show_branchflag_count
struct events_stats stats
struct perf_evsel * evsel
u64 perf_evlist__combined_branch_type(struct perf_evlist *evlist)
struct perf_header header
size_t perf_evlist__fprintf_nr_events(struct perf_evlist *evlist, FILE *fp)
static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist, struct report *rep, const char *help)
int symbol__init(struct perf_env *env)
const struct hist_iter_ops hist_iter_cumulative
int perf_event__process_id_index(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_session *session)
const char * sym_list_str
struct addr_map_symbol to
#define THREADS__TABLE_SIZE
struct addr_map_symbol from
struct events_stats stats
const struct hist_iter_ops hist_iter_branch
u32 nr_events[PERF_RECORD_HEADER_MAX]
static bool perf_evsel__is_group_event(struct perf_evsel *evsel)
static bool perf_evsel__is_group_leader(const struct perf_evsel *evsel)
static void thread__set_priv(struct thread *thread, void *p)
int perf_event__process_lost(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
void perf_evsel__output_resort(struct perf_evsel *evsel, struct ui_progress *prog)
void annotation_config__init(void)
const struct hist_iter_ops * ops
static int parse_branch_mode(const struct option *opt, const char *str __maybe_unused, int unset)
#define K_SWITCH_INPUT_DATA
static void sig_handler(int sig __maybe_unused)
int parse_filter_percentage(const struct option *opt __maybe_unused, const char *arg, int unset __maybe_unused)
char * machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp)
static int map_groups__fprintf_task(struct map_groups *mg, int indent, FILE *fp)
int perf_session__cpu_bitmap(struct perf_session *session, const char *cpu_list, unsigned long *cpu_bitmap)
static int report__collapse_hists(struct report *rep)
u64 total_non_filtered_period
void perf_session__fprintf_info(struct perf_session *session, FILE *fp, bool full)
int perf_event__process_namespaces(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, struct machine *machine)
const char * symbol_filter_str
int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, struct perf_sample *sample, struct perf_evsel *evsel)
size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, int max_cols, float min_pcnt, FILE *fp, bool use_callchain)
int callchain_register_param(struct callchain_param *param)
int perf_time__parse_str(struct perf_time_interval *ptime, const char *ostr)
void perf_read_values_destroy(struct perf_read_values *values)
bool show_cpu_utilization
static int process_feature_event(struct perf_tool *tool, union perf_event *event, struct perf_session *session __maybe_unused)
int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al, int max_stack_depth, void *arg)
static void * thread__priv(struct thread *thread)
static int __cmd_report(struct report *rep)