Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "Misc fixes on the kernel and tooling side - nothing in particular stands out" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (21 commits) perf/core: Fix the perf_cpu_time_max_percent check perf/core: Fix perf_event_enable_on_exec() timekeeping (again) perf/core: Remove confusing comment and move put_ctx() perf record: Honor --quiet option properly perf annotate: Add -q/--quiet option perf diff: Add -q/--quiet option perf report: Add -q/--quiet option perf utils: Check verbose flag properly perf utils: Add perf_quiet_option() perf record: Add -a as default target perf stat: Add -a as default target perf tools: Fail on using multiple bits long terms without value perf tools: Move new_term arguments into struct parse_events_term template perf build: Add special fixdep cleaning rule perf tools: Replace _SC_NPROCESSORS_CONF with max_present_cpu in cpu_topology_map perf header: Make build_cpu_topology skip offline/absent CPUs perf cpumap: Add cpu__max_present_cpu() perf session: Fix DEBUG=1 build with clang tools lib traceevent: It's preempt not prempt perf python: Filter out -specs=/a/b/c from the python binding cc options ...
This commit is contained in:
commit
3f26b0c876
|
@ -455,7 +455,7 @@ int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
|
||||||
void __user *buffer, size_t *lenp,
|
void __user *buffer, size_t *lenp,
|
||||||
loff_t *ppos)
|
loff_t *ppos)
|
||||||
{
|
{
|
||||||
int ret = proc_dointvec(table, write, buffer, lenp, ppos);
|
int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||||
|
|
||||||
if (ret || !write)
|
if (ret || !write)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3522,6 +3522,8 @@ static void perf_event_enable_on_exec(int ctxn)
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
clone_ctx = unclone_ctx(ctx);
|
clone_ctx = unclone_ctx(ctx);
|
||||||
ctx_resched(cpuctx, ctx, event_type);
|
ctx_resched(cpuctx, ctx, event_type);
|
||||||
|
} else {
|
||||||
|
ctx_sched_in(ctx, cpuctx, EVENT_TIME, current);
|
||||||
}
|
}
|
||||||
perf_ctx_unlock(cpuctx, ctx);
|
perf_ctx_unlock(cpuctx, ctx);
|
||||||
|
|
||||||
|
@ -9955,6 +9957,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||||
* of swizzling perf_event::ctx.
|
* of swizzling perf_event::ctx.
|
||||||
*/
|
*/
|
||||||
perf_remove_from_context(group_leader, 0);
|
perf_remove_from_context(group_leader, 0);
|
||||||
|
put_ctx(gctx);
|
||||||
|
|
||||||
list_for_each_entry(sibling, &group_leader->sibling_list,
|
list_for_each_entry(sibling, &group_leader->sibling_list,
|
||||||
group_entry) {
|
group_entry) {
|
||||||
|
@ -9993,13 +9996,6 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||||
perf_event__state_init(group_leader);
|
perf_event__state_init(group_leader);
|
||||||
perf_install_in_context(ctx, group_leader, group_leader->cpu);
|
perf_install_in_context(ctx, group_leader, group_leader->cpu);
|
||||||
get_ctx(ctx);
|
get_ctx(ctx);
|
||||||
|
|
||||||
/*
|
|
||||||
* Now that all events are installed in @ctx, nothing
|
|
||||||
* references @gctx anymore, so drop the last reference we have
|
|
||||||
* on it.
|
|
||||||
*/
|
|
||||||
put_ctx(gctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -35,8 +35,8 @@ all: $(OUTPUT)fixdep
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(call QUIET_CLEAN, fixdep)
|
$(call QUIET_CLEAN, fixdep)
|
||||||
$(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
||||||
$(Q)rm -f fixdep
|
$(Q)rm -f $(OUTPUT)fixdep
|
||||||
|
|
||||||
$(OUTPUT)fixdep-in.o: FORCE
|
$(OUTPUT)fixdep-in.o: FORCE
|
||||||
$(Q)$(MAKE) $(build)=fixdep
|
$(Q)$(MAKE) $(build)=fixdep
|
||||||
|
|
|
@ -3,4 +3,7 @@ build := -f $(srctree)/tools/build/Makefile.build dir=. obj
|
||||||
fixdep:
|
fixdep:
|
||||||
$(Q)$(MAKE) -C $(srctree)/tools/build CFLAGS= LDFLAGS= $(OUTPUT)fixdep
|
$(Q)$(MAKE) -C $(srctree)/tools/build CFLAGS= LDFLAGS= $(OUTPUT)fixdep
|
||||||
|
|
||||||
|
fixdep-clean:
|
||||||
|
$(Q)$(MAKE) -C $(srctree)/tools/build clean
|
||||||
|
|
||||||
.PHONY: fixdep
|
.PHONY: fixdep
|
||||||
|
|
|
@ -5225,13 +5225,13 @@ int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pevent_data_prempt_count - parse the preempt count from the record
|
* pevent_data_preempt_count - parse the preempt count from the record
|
||||||
* @pevent: a handle to the pevent
|
* @pevent: a handle to the pevent
|
||||||
* @rec: the record to parse
|
* @rec: the record to parse
|
||||||
*
|
*
|
||||||
* This returns the preempt count from a record.
|
* This returns the preempt count from a record.
|
||||||
*/
|
*/
|
||||||
int pevent_data_prempt_count(struct pevent *pevent, struct pevent_record *rec)
|
int pevent_data_preempt_count(struct pevent *pevent, struct pevent_record *rec)
|
||||||
{
|
{
|
||||||
return parse_common_pc(pevent, rec->data);
|
return parse_common_pc(pevent, rec->data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -710,7 +710,7 @@ void pevent_data_lat_fmt(struct pevent *pevent,
|
||||||
int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
|
int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
|
||||||
struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
|
struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
|
||||||
int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
|
int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
|
||||||
int pevent_data_prempt_count(struct pevent *pevent, struct pevent_record *rec);
|
int pevent_data_preempt_count(struct pevent *pevent, struct pevent_record *rec);
|
||||||
int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec);
|
int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec);
|
||||||
const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
|
const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
|
||||||
struct cmdline;
|
struct cmdline;
|
||||||
|
|
|
@ -39,6 +39,10 @@ OPTIONS
|
||||||
--verbose::
|
--verbose::
|
||||||
Be more verbose. (Show symbol address, etc)
|
Be more verbose. (Show symbol address, etc)
|
||||||
|
|
||||||
|
-q::
|
||||||
|
--quiet::
|
||||||
|
Do not show any message. (Suppress -v)
|
||||||
|
|
||||||
-D::
|
-D::
|
||||||
--dump-raw-trace::
|
--dump-raw-trace::
|
||||||
Dump raw trace in ASCII.
|
Dump raw trace in ASCII.
|
||||||
|
|
|
@ -73,6 +73,10 @@ OPTIONS
|
||||||
Be verbose, for instance, show the raw counts in addition to the
|
Be verbose, for instance, show the raw counts in addition to the
|
||||||
diff.
|
diff.
|
||||||
|
|
||||||
|
-q::
|
||||||
|
--quiet::
|
||||||
|
Do not show any message. (Suppress -v)
|
||||||
|
|
||||||
-f::
|
-f::
|
||||||
--force::
|
--force::
|
||||||
Don't do ownership validation.
|
Don't do ownership validation.
|
||||||
|
|
|
@ -157,7 +157,7 @@ OPTIONS
|
||||||
|
|
||||||
-a::
|
-a::
|
||||||
--all-cpus::
|
--all-cpus::
|
||||||
System-wide collection from all CPUs.
|
System-wide collection from all CPUs (default if no target is specified).
|
||||||
|
|
||||||
-p::
|
-p::
|
||||||
--pid=::
|
--pid=::
|
||||||
|
|
|
@ -25,6 +25,10 @@ OPTIONS
|
||||||
--verbose::
|
--verbose::
|
||||||
Be more verbose. (show symbol address, etc)
|
Be more verbose. (show symbol address, etc)
|
||||||
|
|
||||||
|
-q::
|
||||||
|
--quiet::
|
||||||
|
Do not show any message. (Suppress -v)
|
||||||
|
|
||||||
-n::
|
-n::
|
||||||
--show-nr-samples::
|
--show-nr-samples::
|
||||||
Show the number of samples for each symbol
|
Show the number of samples for each symbol
|
||||||
|
|
|
@ -63,7 +63,7 @@ report::
|
||||||
|
|
||||||
-a::
|
-a::
|
||||||
--all-cpus::
|
--all-cpus::
|
||||||
system-wide collection from all CPUs
|
system-wide collection from all CPUs (default if no target is specified)
|
||||||
|
|
||||||
-c::
|
-c::
|
||||||
--scale::
|
--scale::
|
||||||
|
|
|
@ -175,6 +175,10 @@ PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG))
|
||||||
PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
|
PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
|
||||||
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
||||||
|
|
||||||
|
ifeq ($(CC), clang)
|
||||||
|
PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
|
||||||
|
endif
|
||||||
|
|
||||||
FEATURE_CHECK_CFLAGS-libpython := $(PYTHON_EMBED_CCOPTS)
|
FEATURE_CHECK_CFLAGS-libpython := $(PYTHON_EMBED_CCOPTS)
|
||||||
FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS)
|
FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS)
|
||||||
FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS)
|
FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS)
|
||||||
|
@ -601,6 +605,9 @@ else
|
||||||
PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
|
PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
|
||||||
PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
|
PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
|
||||||
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
||||||
|
ifeq ($(CC), clang)
|
||||||
|
PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
|
||||||
|
endif
|
||||||
FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
|
FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
|
||||||
|
|
||||||
ifneq ($(feature-libpython), 1)
|
ifneq ($(feature-libpython), 1)
|
||||||
|
|
|
@ -726,13 +726,13 @@ config-clean:
|
||||||
$(call QUIET_CLEAN, config)
|
$(call QUIET_CLEAN, config)
|
||||||
$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null
|
$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null
|
||||||
|
|
||||||
clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean
|
clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean fixdep-clean
|
||||||
$(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
|
$(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
|
||||||
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
||||||
$(Q)$(RM) $(OUTPUT).config-detected
|
$(Q)$(RM) $(OUTPUT).config-detected
|
||||||
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
|
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
|
||||||
$(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
|
$(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
|
||||||
$(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \
|
$(OUTPUT)util/intel-pt-decoder/inat-tables.c \
|
||||||
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
|
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
|
||||||
$(OUTPUT)pmu-events/pmu-events.c
|
$(OUTPUT)pmu-events/pmu-events.c
|
||||||
$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
|
$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
|
||||||
|
|
|
@ -410,6 +410,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"),
|
OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"),
|
||||||
OPT_INCR('v', "verbose", &verbose,
|
OPT_INCR('v', "verbose", &verbose,
|
||||||
"be more verbose (show symbol address, etc)"),
|
"be more verbose (show symbol address, etc)"),
|
||||||
|
OPT_BOOLEAN('q', "quiet", &quiet, "do now show any message"),
|
||||||
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
|
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
|
||||||
"dump raw trace in ASCII"),
|
"dump raw trace in ASCII"),
|
||||||
OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),
|
OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),
|
||||||
|
@ -463,6 +464,9 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
annotate.sym_hist_filter = argv[0];
|
annotate.sym_hist_filter = argv[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quiet)
|
||||||
|
perf_quiet_option();
|
||||||
|
|
||||||
file.path = input_name;
|
file.path = input_name;
|
||||||
|
|
||||||
annotate.session = perf_session__new(&file, false, &annotate.tool);
|
annotate.session = perf_session__new(&file, false, &annotate.tool);
|
||||||
|
|
|
@ -691,7 +691,7 @@ static void hists__process(struct hists *hists)
|
||||||
hists__precompute(hists);
|
hists__precompute(hists);
|
||||||
hists__output_resort(hists, NULL);
|
hists__output_resort(hists, NULL);
|
||||||
|
|
||||||
hists__fprintf(hists, true, 0, 0, 0, stdout,
|
hists__fprintf(hists, !quiet, 0, 0, 0, stdout,
|
||||||
symbol_conf.use_callchain);
|
symbol_conf.use_callchain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -739,12 +739,14 @@ static void data_process(void)
|
||||||
hists__link(hists_base, hists);
|
hists__link(hists_base, hists);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stdout, "%s# Event '%s'\n#\n", first ? "" : "\n",
|
if (!quiet) {
|
||||||
perf_evsel__name(evsel_base));
|
fprintf(stdout, "%s# Event '%s'\n#\n", first ? "" : "\n",
|
||||||
|
perf_evsel__name(evsel_base));
|
||||||
|
}
|
||||||
|
|
||||||
first = false;
|
first = false;
|
||||||
|
|
||||||
if (verbose || data__files_cnt > 2)
|
if (verbose > 0 || ((data__files_cnt > 2) && !quiet))
|
||||||
data__fprintf();
|
data__fprintf();
|
||||||
|
|
||||||
/* Don't sort callchain for perf diff */
|
/* Don't sort callchain for perf diff */
|
||||||
|
@ -807,6 +809,7 @@ static const char * const diff_usage[] = {
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
OPT_INCR('v', "verbose", &verbose,
|
OPT_INCR('v', "verbose", &verbose,
|
||||||
"be more verbose (show symbol address, etc)"),
|
"be more verbose (show symbol address, etc)"),
|
||||||
|
OPT_BOOLEAN('q', "quiet", &quiet, "Do not show any message"),
|
||||||
OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
|
OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
|
||||||
"Show only items with match in baseline"),
|
"Show only items with match in baseline"),
|
||||||
OPT_CALLBACK('c', "compute", &compute,
|
OPT_CALLBACK('c', "compute", &compute,
|
||||||
|
@ -1328,6 +1331,9 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
|
|
||||||
argc = parse_options(argc, argv, options, diff_usage, 0);
|
argc = parse_options(argc, argv, options, diff_usage, 0);
|
||||||
|
|
||||||
|
if (quiet)
|
||||||
|
perf_quiet_option();
|
||||||
|
|
||||||
if (symbol__init(NULL) < 0)
|
if (symbol__init(NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,8 @@ static int parse_record_events(const struct option *opt,
|
||||||
|
|
||||||
fprintf(stderr, "%-13s%-*s%s\n",
|
fprintf(stderr, "%-13s%-*s%s\n",
|
||||||
e->tag,
|
e->tag,
|
||||||
verbose ? 25 : 0,
|
verbose > 0 ? 25 : 0,
|
||||||
verbose ? perf_mem_events__name(j) : "",
|
verbose > 0 ? perf_mem_events__name(j) : "",
|
||||||
e->supported ? ": available" : "");
|
e->supported ? ": available" : "");
|
||||||
}
|
}
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
|
@ -432,7 +432,7 @@ static int record__open(struct record *rec)
|
||||||
try_again:
|
try_again:
|
||||||
if (perf_evsel__open(pos, pos->cpus, pos->threads) < 0) {
|
if (perf_evsel__open(pos, pos->cpus, pos->threads) < 0) {
|
||||||
if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
|
if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
ui__warning("%s\n", msg);
|
ui__warning("%s\n", msg);
|
||||||
goto try_again;
|
goto try_again;
|
||||||
}
|
}
|
||||||
|
@ -1677,8 +1677,12 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
|
|
||||||
argc = parse_options(argc, argv, record_options, record_usage,
|
argc = parse_options(argc, argv, record_options, record_usage,
|
||||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||||
|
if (quiet)
|
||||||
|
perf_quiet_option();
|
||||||
|
|
||||||
|
/* Make system wide (-a) the default target. */
|
||||||
if (!argc && target__none(&rec->opts.target))
|
if (!argc && target__none(&rec->opts.target))
|
||||||
usage_with_options(record_usage, record_options);
|
rec->opts.target.system_wide = true;
|
||||||
|
|
||||||
if (nr_cgroups && !rec->opts.target.system_wide) {
|
if (nr_cgroups && !rec->opts.target.system_wide) {
|
||||||
usage_with_options_msg(record_usage, record_options,
|
usage_with_options_msg(record_usage, record_options,
|
||||||
|
|
|
@ -320,6 +320,9 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report
|
||||||
size_t size = sizeof(buf);
|
size_t size = sizeof(buf);
|
||||||
int socked_id = hists->socket_filter;
|
int socked_id = hists->socket_filter;
|
||||||
|
|
||||||
|
if (quiet)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (symbol_conf.filter_relative) {
|
if (symbol_conf.filter_relative) {
|
||||||
nr_samples = hists->stats.nr_non_filtered_samples;
|
nr_samples = hists->stats.nr_non_filtered_samples;
|
||||||
nr_events = hists->stats.total_non_filtered_period;
|
nr_events = hists->stats.total_non_filtered_period;
|
||||||
|
@ -372,7 +375,11 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
|
||||||
{
|
{
|
||||||
struct perf_evsel *pos;
|
struct perf_evsel *pos;
|
||||||
|
|
||||||
fprintf(stdout, "#\n# Total Lost Samples: %" PRIu64 "\n#\n", evlist->stats.total_lost_samples);
|
if (!quiet) {
|
||||||
|
fprintf(stdout, "#\n# Total Lost Samples: %" PRIu64 "\n#\n",
|
||||||
|
evlist->stats.total_lost_samples);
|
||||||
|
}
|
||||||
|
|
||||||
evlist__for_each_entry(evlist, pos) {
|
evlist__for_each_entry(evlist, pos) {
|
||||||
struct hists *hists = evsel__hists(pos);
|
struct hists *hists = evsel__hists(pos);
|
||||||
const char *evname = perf_evsel__name(pos);
|
const char *evname = perf_evsel__name(pos);
|
||||||
|
@ -382,7 +389,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hists__fprintf_nr_sample_events(hists, rep, evname, stdout);
|
hists__fprintf_nr_sample_events(hists, rep, evname, stdout);
|
||||||
hists__fprintf(hists, true, 0, 0, rep->min_percent, stdout,
|
hists__fprintf(hists, !quiet, 0, 0, rep->min_percent, stdout,
|
||||||
symbol_conf.use_callchain);
|
symbol_conf.use_callchain);
|
||||||
fprintf(stdout, "\n\n");
|
fprintf(stdout, "\n\n");
|
||||||
}
|
}
|
||||||
|
@ -716,6 +723,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
"input file name"),
|
"input file name"),
|
||||||
OPT_INCR('v', "verbose", &verbose,
|
OPT_INCR('v', "verbose", &verbose,
|
||||||
"be more verbose (show symbol address, etc)"),
|
"be more verbose (show symbol address, etc)"),
|
||||||
|
OPT_BOOLEAN('q', "quiet", &quiet, "Do not show any message"),
|
||||||
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
|
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
|
||||||
"dump raw trace in ASCII"),
|
"dump raw trace in ASCII"),
|
||||||
OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
|
OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
|
||||||
|
@ -863,6 +871,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
report.symbol_filter_str = argv[0];
|
report.symbol_filter_str = argv[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quiet)
|
||||||
|
perf_quiet_option();
|
||||||
|
|
||||||
if (symbol_conf.vmlinux_name &&
|
if (symbol_conf.vmlinux_name &&
|
||||||
access(symbol_conf.vmlinux_name, R_OK)) {
|
access(symbol_conf.vmlinux_name, R_OK)) {
|
||||||
pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
|
pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
|
||||||
|
@ -983,14 +994,14 @@ repeat:
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (report.header || report.header_only) {
|
if ((report.header || report.header_only) && !quiet) {
|
||||||
perf_session__fprintf_info(session, stdout,
|
perf_session__fprintf_info(session, stdout,
|
||||||
report.show_full_info);
|
report.show_full_info);
|
||||||
if (report.header_only) {
|
if (report.header_only) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else if (use_browser == 0) {
|
} else if (use_browser == 0 && !quiet) {
|
||||||
fputs("# To display the perf.data header info, please use --header/--header-only options.\n#\n",
|
fputs("# To display the perf.data header info, please use --header/--header-only options.\n#\n",
|
||||||
stdout);
|
stdout);
|
||||||
}
|
}
|
||||||
|
@ -1009,7 +1020,7 @@ repeat:
|
||||||
* providing it only in verbose mode not to bloat too
|
* providing it only in verbose mode not to bloat too
|
||||||
* much struct symbol.
|
* much struct symbol.
|
||||||
*/
|
*/
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
/*
|
/*
|
||||||
* XXX: Need to provide a less kludgy way to ask for
|
* XXX: Need to provide a less kludgy way to ask for
|
||||||
* more space per symbol, the u32 is for the index on
|
* more space per symbol, the u32 is for the index on
|
||||||
|
|
|
@ -460,7 +460,7 @@ static struct task_desc *register_pid(struct perf_sched *sched,
|
||||||
BUG_ON(!sched->tasks);
|
BUG_ON(!sched->tasks);
|
||||||
sched->tasks[task->nr] = task;
|
sched->tasks[task->nr] = task;
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm);
|
printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm);
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
|
@ -794,7 +794,7 @@ replay_wakeup_event(struct perf_sched *sched,
|
||||||
const u32 pid = perf_evsel__intval(evsel, sample, "pid");
|
const u32 pid = perf_evsel__intval(evsel, sample, "pid");
|
||||||
struct task_desc *waker, *wakee;
|
struct task_desc *waker, *wakee;
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
printf("sched_wakeup event %p\n", evsel);
|
printf("sched_wakeup event %p\n", evsel);
|
||||||
|
|
||||||
printf(" ... pid %d woke up %s/%d\n", sample->tid, comm, pid);
|
printf(" ... pid %d woke up %s/%d\n", sample->tid, comm, pid);
|
||||||
|
@ -822,7 +822,7 @@ static int replay_switch_event(struct perf_sched *sched,
|
||||||
int cpu = sample->cpu;
|
int cpu = sample->cpu;
|
||||||
s64 delta;
|
s64 delta;
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
printf("sched_switch event %p\n", evsel);
|
printf("sched_switch event %p\n", evsel);
|
||||||
|
|
||||||
if (cpu >= MAX_CPUS || cpu < 0)
|
if (cpu >= MAX_CPUS || cpu < 0)
|
||||||
|
@ -870,7 +870,7 @@ static int replay_fork_event(struct perf_sched *sched,
|
||||||
goto out_put;
|
goto out_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
printf("fork event\n");
|
printf("fork event\n");
|
||||||
printf("... parent: %s/%d\n", thread__comm_str(parent), parent->tid);
|
printf("... parent: %s/%d\n", thread__comm_str(parent), parent->tid);
|
||||||
printf("... child: %s/%d\n", thread__comm_str(child), child->tid);
|
printf("... child: %s/%d\n", thread__comm_str(child), child->tid);
|
||||||
|
@ -1573,7 +1573,7 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,
|
||||||
|
|
||||||
timestamp__scnprintf_usec(timestamp, stimestamp, sizeof(stimestamp));
|
timestamp__scnprintf_usec(timestamp, stimestamp, sizeof(stimestamp));
|
||||||
color_fprintf(stdout, color, " %12s secs ", stimestamp);
|
color_fprintf(stdout, color, " %12s secs ", stimestamp);
|
||||||
if (new_shortname || (verbose && sched_in->tid)) {
|
if (new_shortname || (verbose > 0 && sched_in->tid)) {
|
||||||
const char *pid_color = color;
|
const char *pid_color = color;
|
||||||
|
|
||||||
if (thread__has_color(sched_in))
|
if (thread__has_color(sched_in))
|
||||||
|
@ -2050,7 +2050,7 @@ static void save_task_callchain(struct perf_sched *sched,
|
||||||
|
|
||||||
if (thread__resolve_callchain(thread, cursor, evsel, sample,
|
if (thread__resolve_callchain(thread, cursor, evsel, sample,
|
||||||
NULL, NULL, sched->max_stack + 2) != 0) {
|
NULL, NULL, sched->max_stack + 2) != 0) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
error("Failed to resolve callchain. Skipping\n");
|
error("Failed to resolve callchain. Skipping\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -573,7 +573,7 @@ try_again:
|
||||||
if (errno == EINVAL || errno == ENOSYS ||
|
if (errno == EINVAL || errno == ENOSYS ||
|
||||||
errno == ENOENT || errno == EOPNOTSUPP ||
|
errno == ENOENT || errno == EOPNOTSUPP ||
|
||||||
errno == ENXIO) {
|
errno == ENXIO) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
ui__warning("%s event is not supported by the kernel.\n",
|
ui__warning("%s event is not supported by the kernel.\n",
|
||||||
perf_evsel__name(counter));
|
perf_evsel__name(counter));
|
||||||
counter->supported = false;
|
counter->supported = false;
|
||||||
|
@ -582,7 +582,7 @@ try_again:
|
||||||
!(counter->leader->nr_members > 1))
|
!(counter->leader->nr_members > 1))
|
||||||
continue;
|
continue;
|
||||||
} else if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
|
} else if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
ui__warning("%s\n", msg);
|
ui__warning("%s\n", msg);
|
||||||
goto try_again;
|
goto try_again;
|
||||||
}
|
}
|
||||||
|
@ -1765,7 +1765,7 @@ static inline int perf_env__get_cpu(struct perf_env *env, struct cpu_map *map, i
|
||||||
|
|
||||||
cpu = map->map[idx];
|
cpu = map->map[idx];
|
||||||
|
|
||||||
if (cpu >= env->nr_cpus_online)
|
if (cpu >= env->nr_cpus_avail)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return cpu;
|
return cpu;
|
||||||
|
@ -2445,8 +2445,9 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
} else if (big_num_opt == 0) /* User passed --no-big-num */
|
} else if (big_num_opt == 0) /* User passed --no-big-num */
|
||||||
big_num = false;
|
big_num = false;
|
||||||
|
|
||||||
|
/* Make system wide (-a) the default target. */
|
||||||
if (!argc && target__none(&target))
|
if (!argc && target__none(&target))
|
||||||
usage_with_options(stat_usage, stat_options);
|
target.system_wide = true;
|
||||||
|
|
||||||
if (run_count < 0) {
|
if (run_count < 0) {
|
||||||
pr_err("Run count must be a positive number\n");
|
pr_err("Run count must be a positive number\n");
|
||||||
|
@ -2538,7 +2539,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
|
|
||||||
status = 0;
|
status = 0;
|
||||||
for (run_idx = 0; forever || run_idx < run_count; run_idx++) {
|
for (run_idx = 0; forever || run_idx < run_count; run_idx++) {
|
||||||
if (run_count != 1 && verbose)
|
if (run_count != 1 && verbose > 0)
|
||||||
fprintf(output, "[ perf stat: executing run #%d ... ]\n",
|
fprintf(output, "[ perf stat: executing run #%d ... ]\n",
|
||||||
run_idx + 1);
|
run_idx + 1);
|
||||||
|
|
||||||
|
|
|
@ -871,7 +871,7 @@ try_again:
|
||||||
if (perf_evsel__open(counter, top->evlist->cpus,
|
if (perf_evsel__open(counter, top->evlist->cpus,
|
||||||
top->evlist->threads) < 0) {
|
top->evlist->threads) < 0) {
|
||||||
if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
|
if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
ui__warning("%s\n", msg);
|
ui__warning("%s\n", msg);
|
||||||
goto try_again;
|
goto try_again;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1399,7 +1399,7 @@ static struct syscall *trace__syscall_info(struct trace *trace,
|
||||||
return &trace->syscalls.table[id];
|
return &trace->syscalls.table[id];
|
||||||
|
|
||||||
out_cant_read:
|
out_cant_read:
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
fprintf(trace->output, "Problems reading syscall %d", id);
|
fprintf(trace->output, "Problems reading syscall %d", id);
|
||||||
if (id <= trace->syscalls.max && trace->syscalls.table[id].name != NULL)
|
if (id <= trace->syscalls.max && trace->syscalls.table[id].name != NULL)
|
||||||
fprintf(trace->output, "(%s)", trace->syscalls.table[id].name);
|
fprintf(trace->output, "(%s)", trace->syscalls.table[id].name);
|
||||||
|
@ -1801,10 +1801,10 @@ static void print_location(FILE *f, struct perf_sample *sample,
|
||||||
bool print_dso, bool print_sym)
|
bool print_dso, bool print_sym)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((verbose || print_dso) && al->map)
|
if ((verbose > 0 || print_dso) && al->map)
|
||||||
fprintf(f, "%s@", al->map->dso->long_name);
|
fprintf(f, "%s@", al->map->dso->long_name);
|
||||||
|
|
||||||
if ((verbose || print_sym) && al->sym)
|
if ((verbose > 0 || print_sym) && al->sym)
|
||||||
fprintf(f, "%s+0x%" PRIx64, al->sym->name,
|
fprintf(f, "%s+0x%" PRIx64, al->sym->name,
|
||||||
al->addr - al->sym->start);
|
al->addr - al->sym->start);
|
||||||
else if (al->map)
|
else if (al->map)
|
||||||
|
|
|
@ -49,7 +49,7 @@ static char *mapfile(const char *fn, size_t *size)
|
||||||
int err;
|
int err;
|
||||||
int fd = open(fn, O_RDONLY);
|
int fd = open(fn, O_RDONLY);
|
||||||
|
|
||||||
if (fd < 0 && verbose && fn) {
|
if (fd < 0 && verbose > 0 && fn) {
|
||||||
pr_err("Error opening events file '%s': %s\n", fn,
|
pr_err("Error opening events file '%s': %s\n", fn,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,7 @@ static int run_dir(const char *d, const char *perf)
|
||||||
int vcnt = min(verbose, (int) sizeof(v) - 1);
|
int vcnt = min(verbose, (int) sizeof(v) - 1);
|
||||||
char cmd[3*PATH_MAX];
|
char cmd[3*PATH_MAX];
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
vcnt++;
|
vcnt++;
|
||||||
|
|
||||||
snprintf(cmd, 3*PATH_MAX, PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s",
|
snprintf(cmd, 3*PATH_MAX, PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s",
|
||||||
|
|
|
@ -299,7 +299,7 @@ static int run_test(struct test *test, int subtest)
|
||||||
if (!dont_fork) {
|
if (!dont_fork) {
|
||||||
pr_debug("test child forked, pid %d\n", getpid());
|
pr_debug("test child forked, pid %d\n", getpid());
|
||||||
|
|
||||||
if (!verbose) {
|
if (verbose <= 0) {
|
||||||
int nullfd = open("/dev/null", O_WRONLY);
|
int nullfd = open("/dev/null", O_WRONLY);
|
||||||
|
|
||||||
if (nullfd >= 0) {
|
if (nullfd >= 0) {
|
||||||
|
|
|
@ -599,7 +599,7 @@ static int do_test_code_reading(bool try_kcore)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
char errbuf[512];
|
char errbuf[512];
|
||||||
perf_evlist__strerror_open(evlist, errno, errbuf, sizeof(errbuf));
|
perf_evlist__strerror_open(evlist, errno, errbuf, sizeof(errbuf));
|
||||||
pr_debug("perf_evlist__open() failed!\n%s\n", errbuf);
|
pr_debug("perf_evlist__open() failed!\n%s\n", errbuf);
|
||||||
|
|
|
@ -19,7 +19,7 @@ static int fdarray__fprintf_prefix(struct fdarray *fda, const char *prefix, FILE
|
||||||
{
|
{
|
||||||
int printed = 0;
|
int printed = 0;
|
||||||
|
|
||||||
if (!verbose)
|
if (verbose <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
printed += fprintf(fp, "\n%s: ", prefix);
|
printed += fprintf(fp, "\n%s: ", prefix);
|
||||||
|
|
|
@ -76,7 +76,7 @@ test_llvm__fetch_bpf_obj(void **p_obj_buf,
|
||||||
* Skip this test if user's .perfconfig doesn't set [llvm] section
|
* Skip this test if user's .perfconfig doesn't set [llvm] section
|
||||||
* and clang is not found in $PATH, and this is not perf test -v
|
* and clang is not found in $PATH, and this is not perf test -v
|
||||||
*/
|
*/
|
||||||
if (!force && (verbose == 0 &&
|
if (!force && (verbose <= 0 &&
|
||||||
!llvm_param.user_set_param &&
|
!llvm_param.user_set_param &&
|
||||||
llvm__search_clang())) {
|
llvm__search_clang())) {
|
||||||
pr_debug("No clang and no verbosive, skip this test\n");
|
pr_debug("No clang and no verbosive, skip this test\n");
|
||||||
|
|
|
@ -1808,7 +1808,7 @@ static void debug_warn(const char *warn, va_list params)
|
||||||
{
|
{
|
||||||
char msg[1024];
|
char msg[1024];
|
||||||
|
|
||||||
if (!verbose)
|
if (verbose <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vsnprintf(msg, sizeof(msg), warn, params);
|
vsnprintf(msg, sizeof(msg), warn, params);
|
||||||
|
|
|
@ -172,13 +172,13 @@ int test__PERF_RECORD(int subtest __maybe_unused)
|
||||||
|
|
||||||
err = perf_evlist__parse_sample(evlist, event, &sample);
|
err = perf_evlist__parse_sample(evlist, event, &sample);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
perf_event__fprintf(event, stderr);
|
perf_event__fprintf(event, stderr);
|
||||||
pr_debug("Couldn't parse sample\n");
|
pr_debug("Couldn't parse sample\n");
|
||||||
goto out_delete_evlist;
|
goto out_delete_evlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
|
pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
|
||||||
perf_event__fprintf(event, stderr);
|
perf_event__fprintf(event, stderr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ int test__python_use(int subtest __maybe_unused)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (asprintf(&cmd, "echo \"import sys ; sys.path.append('%s'); import perf\" | %s %s",
|
if (asprintf(&cmd, "echo \"import sys ; sys.path.append('%s'); import perf\" | %s %s",
|
||||||
PYTHONPATH, PYTHON, verbose ? "" : "2> /dev/null") < 0)
|
PYTHONPATH, PYTHON, verbose > 0 ? "" : "2> /dev/null") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = system(cmd) ? -1 : 0;
|
ret = system(cmd) ? -1 : 0;
|
||||||
|
|
|
@ -109,7 +109,7 @@ int test__thread_map_remove(int subtest __maybe_unused)
|
||||||
TEST_ASSERT_VAL("failed to allocate thread_map",
|
TEST_ASSERT_VAL("failed to allocate thread_map",
|
||||||
threads);
|
threads);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
thread_map__fprintf(threads, stderr);
|
thread_map__fprintf(threads, stderr);
|
||||||
|
|
||||||
TEST_ASSERT_VAL("failed to remove thread",
|
TEST_ASSERT_VAL("failed to remove thread",
|
||||||
|
@ -117,7 +117,7 @@ int test__thread_map_remove(int subtest __maybe_unused)
|
||||||
|
|
||||||
TEST_ASSERT_VAL("thread_map count != 1", threads->nr == 1);
|
TEST_ASSERT_VAL("thread_map count != 1", threads->nr == 1);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
thread_map__fprintf(threads, stderr);
|
thread_map__fprintf(threads, stderr);
|
||||||
|
|
||||||
TEST_ASSERT_VAL("failed to remove thread",
|
TEST_ASSERT_VAL("failed to remove thread",
|
||||||
|
@ -125,7 +125,7 @@ int test__thread_map_remove(int subtest __maybe_unused)
|
||||||
|
|
||||||
TEST_ASSERT_VAL("thread_map count != 0", threads->nr == 0);
|
TEST_ASSERT_VAL("thread_map count != 0", threads->nr == 0);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
thread_map__fprintf(threads, stderr);
|
thread_map__fprintf(threads, stderr);
|
||||||
|
|
||||||
TEST_ASSERT_VAL("failed to not remove thread",
|
TEST_ASSERT_VAL("failed to not remove thread",
|
||||||
|
|
|
@ -65,7 +65,9 @@ static int check_cpu_topology(char *path, struct cpu_map *map)
|
||||||
session = perf_session__new(&file, false, NULL);
|
session = perf_session__new(&file, false, NULL);
|
||||||
TEST_ASSERT_VAL("can't get session", session);
|
TEST_ASSERT_VAL("can't get session", session);
|
||||||
|
|
||||||
for (i = 0; i < session->header.env.nr_cpus_online; i++) {
|
for (i = 0; i < session->header.env.nr_cpus_avail; i++) {
|
||||||
|
if (!cpu_map__has(map, i))
|
||||||
|
continue;
|
||||||
pr_debug("CPU %d, core %d, socket %d\n", i,
|
pr_debug("CPU %d, core %d, socket %d\n", i,
|
||||||
session->header.env.cpu[i].core_id,
|
session->header.env.cpu[i].core_id,
|
||||||
session->header.env.cpu[i].socket_id);
|
session->header.env.cpu[i].socket_id);
|
||||||
|
|
|
@ -168,7 +168,7 @@ next_pair:
|
||||||
err = -1;
|
err = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!verbose)
|
if (verbose <= 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
header_printed = false;
|
header_printed = false;
|
||||||
|
|
|
@ -73,7 +73,7 @@ static int map_browser__run(struct map_browser *browser)
|
||||||
|
|
||||||
if (ui_browser__show(&browser->b, browser->map->dso->long_name,
|
if (ui_browser__show(&browser->b, browser->map->dso->long_name,
|
||||||
"Press ESC to exit, %s / to search",
|
"Press ESC to exit, %s / to search",
|
||||||
verbose ? "" : "restart with -v to use") < 0)
|
verbose > 0 ? "" : "restart with -v to use") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -81,7 +81,7 @@ static int map_browser__run(struct map_browser *browser)
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case '/':
|
case '/':
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
map_browser__search(browser);
|
map_browser__search(browser);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -117,7 +117,7 @@ int map__browse(struct map *map)
|
||||||
|
|
||||||
if (maxaddr < pos->end)
|
if (maxaddr < pos->end)
|
||||||
maxaddr = pos->end;
|
maxaddr = pos->end;
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
u32 *idx = symbol__browser_index(pos);
|
u32 *idx = symbol__browser_index(pos);
|
||||||
*idx = mb.b.nr_entries;
|
*idx = mb.b.nr_entries;
|
||||||
}
|
}
|
||||||
|
|
|
@ -648,7 +648,7 @@ unsigned int hists__sort_list_width(struct hists *hists)
|
||||||
ret += fmt->width(fmt, &dummy_hpp, hists);
|
ret += fmt->width(fmt, &dummy_hpp, hists);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose && hists__has(hists, sym)) /* Addr + origin */
|
if (verbose > 0 && hists__has(hists, sym)) /* Addr + origin */
|
||||||
ret += 3 + BITS_PER_LONG / 4;
|
ret += 3 + BITS_PER_LONG / 4;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1768,7 +1768,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,
|
||||||
printf("%-*.*s----\n",
|
printf("%-*.*s----\n",
|
||||||
graph_dotted_len, graph_dotted_len, graph_dotted_line);
|
graph_dotted_len, graph_dotted_len, graph_dotted_line);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
symbol__annotate_hits(sym, evsel);
|
symbol__annotate_hits(sym, evsel);
|
||||||
|
|
||||||
list_for_each_entry(pos, ¬es->src->source, node) {
|
list_for_each_entry(pos, ¬es->src->source, node) {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "asm/bug.h"
|
#include "asm/bug.h"
|
||||||
|
|
||||||
static int max_cpu_num;
|
static int max_cpu_num;
|
||||||
|
static int max_present_cpu_num;
|
||||||
static int max_node_num;
|
static int max_node_num;
|
||||||
static int *cpunode_map;
|
static int *cpunode_map;
|
||||||
|
|
||||||
|
@ -442,6 +443,7 @@ static void set_max_cpu_num(void)
|
||||||
|
|
||||||
/* set up default */
|
/* set up default */
|
||||||
max_cpu_num = 4096;
|
max_cpu_num = 4096;
|
||||||
|
max_present_cpu_num = 4096;
|
||||||
|
|
||||||
mnt = sysfs__mountpoint();
|
mnt = sysfs__mountpoint();
|
||||||
if (!mnt)
|
if (!mnt)
|
||||||
|
@ -455,6 +457,17 @@ static void set_max_cpu_num(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = get_max_num(path, &max_cpu_num);
|
ret = get_max_num(path, &max_cpu_num);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* get the highest present cpu number for a sparse allocation */
|
||||||
|
ret = snprintf(path, PATH_MAX, "%s/devices/system/cpu/present", mnt);
|
||||||
|
if (ret == PATH_MAX) {
|
||||||
|
pr_err("sysfs path crossed PATH_MAX(%d) size\n", PATH_MAX);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = get_max_num(path, &max_present_cpu_num);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -505,6 +518,15 @@ int cpu__max_cpu(void)
|
||||||
return max_cpu_num;
|
return max_cpu_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cpu__max_present_cpu(void)
|
||||||
|
{
|
||||||
|
if (unlikely(!max_present_cpu_num))
|
||||||
|
set_max_cpu_num();
|
||||||
|
|
||||||
|
return max_present_cpu_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int cpu__get_node(int cpu)
|
int cpu__get_node(int cpu)
|
||||||
{
|
{
|
||||||
if (unlikely(cpunode_map == NULL)) {
|
if (unlikely(cpunode_map == NULL)) {
|
||||||
|
|
|
@ -62,6 +62,7 @@ int cpu__setup_cpunode_map(void);
|
||||||
|
|
||||||
int cpu__max_node(void);
|
int cpu__max_node(void);
|
||||||
int cpu__max_cpu(void);
|
int cpu__max_cpu(void);
|
||||||
|
int cpu__max_present_cpu(void);
|
||||||
int cpu__get_node(int cpu);
|
int cpu__get_node(int cpu);
|
||||||
|
|
||||||
int cpu_map__build_map(struct cpu_map *cpus, struct cpu_map **res,
|
int cpu_map__build_map(struct cpu_map *cpus, struct cpu_map **res,
|
||||||
|
|
|
@ -203,11 +203,28 @@ int perf_debug_option(const char *str)
|
||||||
v = (v < 0) || (v > 10) ? 0 : v;
|
v = (v < 0) || (v > 10) ? 0 : v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quiet)
|
||||||
|
v = -1;
|
||||||
|
|
||||||
*var->ptr = v;
|
*var->ptr = v;
|
||||||
free(s);
|
free(s);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int perf_quiet_option(void)
|
||||||
|
{
|
||||||
|
struct debug_variable *var = &debug_variables[0];
|
||||||
|
|
||||||
|
/* disable all debug messages */
|
||||||
|
while (var->name) {
|
||||||
|
*var->ptr = -1;
|
||||||
|
var++;
|
||||||
|
}
|
||||||
|
|
||||||
|
quiet = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define DEBUG_WRAPPER(__n, __l) \
|
#define DEBUG_WRAPPER(__n, __l) \
|
||||||
static int pr_ ## __n ## _wrapper(const char *fmt, ...) \
|
static int pr_ ## __n ## _wrapper(const char *fmt, ...) \
|
||||||
{ \
|
{ \
|
||||||
|
|
|
@ -54,5 +54,6 @@ int veprintf(int level, int var, const char *fmt, va_list args);
|
||||||
|
|
||||||
int perf_debug_option(const char *str);
|
int perf_debug_option(const char *str);
|
||||||
void perf_debug_setup(void);
|
void perf_debug_setup(void);
|
||||||
|
int perf_quiet_option(void);
|
||||||
|
|
||||||
#endif /* __PERF_DEBUG_H */
|
#endif /* __PERF_DEBUG_H */
|
||||||
|
|
|
@ -1058,7 +1058,7 @@ int dso__name_len(const struct dso *dso)
|
||||||
{
|
{
|
||||||
if (!dso)
|
if (!dso)
|
||||||
return strlen("[unknown]");
|
return strlen("[unknown]");
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
return dso->long_name_len;
|
return dso->long_name_len;
|
||||||
|
|
||||||
return dso->short_name_len;
|
return dso->short_name_len;
|
||||||
|
|
|
@ -66,7 +66,7 @@ int perf_env__read_cpu_topology_map(struct perf_env *env)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (env->nr_cpus_avail == 0)
|
if (env->nr_cpus_avail == 0)
|
||||||
env->nr_cpus_avail = sysconf(_SC_NPROCESSORS_CONF);
|
env->nr_cpus_avail = cpu__max_present_cpu();
|
||||||
|
|
||||||
nr_cpus = env->nr_cpus_avail;
|
nr_cpus = env->nr_cpus_avail;
|
||||||
if (nr_cpus == -1)
|
if (nr_cpus == -1)
|
||||||
|
|
|
@ -295,11 +295,7 @@ static int write_nrcpus(int fd, struct perf_header *h __maybe_unused,
|
||||||
u32 nrc, nra;
|
u32 nrc, nra;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
nr = sysconf(_SC_NPROCESSORS_CONF);
|
nrc = cpu__max_present_cpu();
|
||||||
if (nr < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
nrc = (u32)(nr & UINT_MAX);
|
|
||||||
|
|
||||||
nr = sysconf(_SC_NPROCESSORS_ONLN);
|
nr = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
if (nr < 0)
|
if (nr < 0)
|
||||||
|
@ -505,24 +501,29 @@ static void free_cpu_topo(struct cpu_topo *tp)
|
||||||
|
|
||||||
static struct cpu_topo *build_cpu_topology(void)
|
static struct cpu_topo *build_cpu_topology(void)
|
||||||
{
|
{
|
||||||
struct cpu_topo *tp;
|
struct cpu_topo *tp = NULL;
|
||||||
void *addr;
|
void *addr;
|
||||||
u32 nr, i;
|
u32 nr, i;
|
||||||
size_t sz;
|
size_t sz;
|
||||||
long ncpus;
|
long ncpus;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
struct cpu_map *map;
|
||||||
|
|
||||||
ncpus = sysconf(_SC_NPROCESSORS_CONF);
|
ncpus = cpu__max_present_cpu();
|
||||||
if (ncpus < 0)
|
|
||||||
|
/* build online CPU map */
|
||||||
|
map = cpu_map__new(NULL);
|
||||||
|
if (map == NULL) {
|
||||||
|
pr_debug("failed to get system cpumap\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
nr = (u32)(ncpus & UINT_MAX);
|
nr = (u32)(ncpus & UINT_MAX);
|
||||||
|
|
||||||
sz = nr * sizeof(char *);
|
sz = nr * sizeof(char *);
|
||||||
|
|
||||||
addr = calloc(1, sizeof(*tp) + 2 * sz);
|
addr = calloc(1, sizeof(*tp) + 2 * sz);
|
||||||
if (!addr)
|
if (!addr)
|
||||||
return NULL;
|
goto out_free;
|
||||||
|
|
||||||
tp = addr;
|
tp = addr;
|
||||||
tp->cpu_nr = nr;
|
tp->cpu_nr = nr;
|
||||||
|
@ -532,10 +533,16 @@ static struct cpu_topo *build_cpu_topology(void)
|
||||||
tp->thread_siblings = addr;
|
tp->thread_siblings = addr;
|
||||||
|
|
||||||
for (i = 0; i < nr; i++) {
|
for (i = 0; i < nr; i++) {
|
||||||
|
if (!cpu_map__has(map, i))
|
||||||
|
continue;
|
||||||
|
|
||||||
ret = build_cpu_topo(tp, i);
|
ret = build_cpu_topo(tp, i);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_free:
|
||||||
|
cpu_map__put(map);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free_cpu_topo(tp);
|
free_cpu_topo(tp);
|
||||||
tp = NULL;
|
tp = NULL;
|
||||||
|
@ -1126,7 +1133,7 @@ static void print_cpu_topology(struct perf_header *ph, int fd __maybe_unused,
|
||||||
{
|
{
|
||||||
int nr, i;
|
int nr, i;
|
||||||
char *str;
|
char *str;
|
||||||
int cpu_nr = ph->env.nr_cpus_online;
|
int cpu_nr = ph->env.nr_cpus_avail;
|
||||||
|
|
||||||
nr = ph->env.nr_sibling_cores;
|
nr = ph->env.nr_sibling_cores;
|
||||||
str = ph->env.sibling_cores;
|
str = ph->env.sibling_cores;
|
||||||
|
@ -1781,7 +1788,7 @@ static int process_cpu_topology(struct perf_file_section *section,
|
||||||
u32 nr, i;
|
u32 nr, i;
|
||||||
char *str;
|
char *str;
|
||||||
struct strbuf sb;
|
struct strbuf sb;
|
||||||
int cpu_nr = ph->env.nr_cpus_online;
|
int cpu_nr = ph->env.nr_cpus_avail;
|
||||||
u64 size = 0;
|
u64 size = 0;
|
||||||
|
|
||||||
ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu));
|
ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu));
|
||||||
|
@ -1862,7 +1869,7 @@ static int process_cpu_topology(struct perf_file_section *section,
|
||||||
if (ph->needs_swap)
|
if (ph->needs_swap)
|
||||||
nr = bswap_32(nr);
|
nr = bswap_32(nr);
|
||||||
|
|
||||||
if (nr > (u32)cpu_nr) {
|
if (nr != (u32)-1 && nr > (u32)cpu_nr) {
|
||||||
pr_debug("socket_id number is too big."
|
pr_debug("socket_id number is too big."
|
||||||
"You may need to upgrade the perf tool.\n");
|
"You may need to upgrade the perf tool.\n");
|
||||||
goto free_cpu;
|
goto free_cpu;
|
||||||
|
|
|
@ -69,7 +69,7 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
|
||||||
*/
|
*/
|
||||||
if (h->ms.sym) {
|
if (h->ms.sym) {
|
||||||
symlen = h->ms.sym->namelen + 4;
|
symlen = h->ms.sym->namelen + 4;
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
||||||
hists__new_col_len(hists, HISTC_SYMBOL, symlen);
|
hists__new_col_len(hists, HISTC_SYMBOL, symlen);
|
||||||
} else {
|
} else {
|
||||||
|
@ -93,7 +93,7 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
|
||||||
if (h->branch_info) {
|
if (h->branch_info) {
|
||||||
if (h->branch_info->from.sym) {
|
if (h->branch_info->from.sym) {
|
||||||
symlen = (int)h->branch_info->from.sym->namelen + 4;
|
symlen = (int)h->branch_info->from.sym->namelen + 4;
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
||||||
hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen);
|
hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen);
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
|
||||||
|
|
||||||
if (h->branch_info->to.sym) {
|
if (h->branch_info->to.sym) {
|
||||||
symlen = (int)h->branch_info->to.sym->namelen + 4;
|
symlen = (int)h->branch_info->to.sym->namelen + 4;
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
symlen += BITS_PER_LONG / 4 + 2 + 3;
|
||||||
hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen);
|
hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen);
|
||||||
|
|
||||||
|
|
|
@ -2318,24 +2318,20 @@ int parse_events__is_hardcoded_term(struct parse_events_term *term)
|
||||||
return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
|
return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int new_term(struct parse_events_term **_term, int type_val,
|
static int new_term(struct parse_events_term **_term,
|
||||||
int type_term, char *config,
|
struct parse_events_term *temp,
|
||||||
char *str, u64 num, int err_term, int err_val)
|
char *str, u64 num)
|
||||||
{
|
{
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
term = zalloc(sizeof(*term));
|
term = malloc(sizeof(*term));
|
||||||
if (!term)
|
if (!term)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*term = *temp;
|
||||||
INIT_LIST_HEAD(&term->list);
|
INIT_LIST_HEAD(&term->list);
|
||||||
term->type_val = type_val;
|
|
||||||
term->type_term = type_term;
|
|
||||||
term->config = config;
|
|
||||||
term->err_term = err_term;
|
|
||||||
term->err_val = err_val;
|
|
||||||
|
|
||||||
switch (type_val) {
|
switch (term->type_val) {
|
||||||
case PARSE_EVENTS__TERM_TYPE_NUM:
|
case PARSE_EVENTS__TERM_TYPE_NUM:
|
||||||
term->val.num = num;
|
term->val.num = num;
|
||||||
break;
|
break;
|
||||||
|
@ -2353,15 +2349,22 @@ static int new_term(struct parse_events_term **_term, int type_val,
|
||||||
|
|
||||||
int parse_events_term__num(struct parse_events_term **term,
|
int parse_events_term__num(struct parse_events_term **term,
|
||||||
int type_term, char *config, u64 num,
|
int type_term, char *config, u64 num,
|
||||||
|
bool no_value,
|
||||||
void *loc_term_, void *loc_val_)
|
void *loc_term_, void *loc_val_)
|
||||||
{
|
{
|
||||||
YYLTYPE *loc_term = loc_term_;
|
YYLTYPE *loc_term = loc_term_;
|
||||||
YYLTYPE *loc_val = loc_val_;
|
YYLTYPE *loc_val = loc_val_;
|
||||||
|
|
||||||
return new_term(term, PARSE_EVENTS__TERM_TYPE_NUM, type_term,
|
struct parse_events_term temp = {
|
||||||
config, NULL, num,
|
.type_val = PARSE_EVENTS__TERM_TYPE_NUM,
|
||||||
loc_term ? loc_term->first_column : 0,
|
.type_term = type_term,
|
||||||
loc_val ? loc_val->first_column : 0);
|
.config = config,
|
||||||
|
.no_value = no_value,
|
||||||
|
.err_term = loc_term ? loc_term->first_column : 0,
|
||||||
|
.err_val = loc_val ? loc_val->first_column : 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new_term(term, &temp, NULL, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_events_term__str(struct parse_events_term **term,
|
int parse_events_term__str(struct parse_events_term **term,
|
||||||
|
@ -2371,37 +2374,45 @@ int parse_events_term__str(struct parse_events_term **term,
|
||||||
YYLTYPE *loc_term = loc_term_;
|
YYLTYPE *loc_term = loc_term_;
|
||||||
YYLTYPE *loc_val = loc_val_;
|
YYLTYPE *loc_val = loc_val_;
|
||||||
|
|
||||||
return new_term(term, PARSE_EVENTS__TERM_TYPE_STR, type_term,
|
struct parse_events_term temp = {
|
||||||
config, str, 0,
|
.type_val = PARSE_EVENTS__TERM_TYPE_STR,
|
||||||
loc_term ? loc_term->first_column : 0,
|
.type_term = type_term,
|
||||||
loc_val ? loc_val->first_column : 0);
|
.config = config,
|
||||||
|
.err_term = loc_term ? loc_term->first_column : 0,
|
||||||
|
.err_val = loc_val ? loc_val->first_column : 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new_term(term, &temp, str, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_events_term__sym_hw(struct parse_events_term **term,
|
int parse_events_term__sym_hw(struct parse_events_term **term,
|
||||||
char *config, unsigned idx)
|
char *config, unsigned idx)
|
||||||
{
|
{
|
||||||
struct event_symbol *sym;
|
struct event_symbol *sym;
|
||||||
|
struct parse_events_term temp = {
|
||||||
|
.type_val = PARSE_EVENTS__TERM_TYPE_STR,
|
||||||
|
.type_term = PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
|
.config = config ?: (char *) "event",
|
||||||
|
};
|
||||||
|
|
||||||
BUG_ON(idx >= PERF_COUNT_HW_MAX);
|
BUG_ON(idx >= PERF_COUNT_HW_MAX);
|
||||||
sym = &event_symbols_hw[idx];
|
sym = &event_symbols_hw[idx];
|
||||||
|
|
||||||
if (config)
|
return new_term(term, &temp, (char *) sym->symbol, 0);
|
||||||
return new_term(term, PARSE_EVENTS__TERM_TYPE_STR,
|
|
||||||
PARSE_EVENTS__TERM_TYPE_USER, config,
|
|
||||||
(char *) sym->symbol, 0, 0, 0);
|
|
||||||
else
|
|
||||||
return new_term(term, PARSE_EVENTS__TERM_TYPE_STR,
|
|
||||||
PARSE_EVENTS__TERM_TYPE_USER,
|
|
||||||
(char *) "event", (char *) sym->symbol,
|
|
||||||
0, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_events_term__clone(struct parse_events_term **new,
|
int parse_events_term__clone(struct parse_events_term **new,
|
||||||
struct parse_events_term *term)
|
struct parse_events_term *term)
|
||||||
{
|
{
|
||||||
return new_term(new, term->type_val, term->type_term, term->config,
|
struct parse_events_term temp = {
|
||||||
term->val.str, term->val.num,
|
.type_val = term->type_val,
|
||||||
term->err_term, term->err_val);
|
.type_term = term->type_term,
|
||||||
|
.config = term->config,
|
||||||
|
.err_term = term->err_term,
|
||||||
|
.err_val = term->err_val,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new_term(new, &temp, term->val.str, term->val.num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_events_terms__purge(struct list_head *terms)
|
void parse_events_terms__purge(struct list_head *terms)
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct parse_events_term {
|
||||||
int type_term;
|
int type_term;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
bool used;
|
bool used;
|
||||||
|
bool no_value;
|
||||||
|
|
||||||
/* error string indexes for within parsed string */
|
/* error string indexes for within parsed string */
|
||||||
int err_term;
|
int err_term;
|
||||||
|
@ -122,6 +123,7 @@ void parse_events__shrink_config_terms(void);
|
||||||
int parse_events__is_hardcoded_term(struct parse_events_term *term);
|
int parse_events__is_hardcoded_term(struct parse_events_term *term);
|
||||||
int parse_events_term__num(struct parse_events_term **term,
|
int parse_events_term__num(struct parse_events_term **term,
|
||||||
int type_term, char *config, u64 num,
|
int type_term, char *config, u64 num,
|
||||||
|
bool novalue,
|
||||||
void *loc_term, void *loc_val);
|
void *loc_term, void *loc_val);
|
||||||
int parse_events_term__str(struct parse_events_term **term,
|
int parse_events_term__str(struct parse_events_term **term,
|
||||||
int type_term, char *config, char *str,
|
int type_term, char *config, char *str,
|
||||||
|
|
|
@ -252,7 +252,7 @@ PE_KERNEL_PMU_EVENT sep_dc
|
||||||
if (!strcasecmp(alias->name, $1)) {
|
if (!strcasecmp(alias->name, $1)) {
|
||||||
ALLOC_LIST(head);
|
ALLOC_LIST(head);
|
||||||
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
$1, 1, &@1, NULL));
|
$1, 1, false, &@1, NULL));
|
||||||
list_add_tail(&term->list, head);
|
list_add_tail(&term->list, head);
|
||||||
|
|
||||||
if (!parse_events_add_pmu(data, list,
|
if (!parse_events_add_pmu(data, list,
|
||||||
|
@ -282,7 +282,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
|
||||||
|
|
||||||
ALLOC_LIST(head);
|
ALLOC_LIST(head);
|
||||||
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
&pmu_name, 1, &@1, NULL));
|
&pmu_name, 1, false, &@1, NULL));
|
||||||
list_add_tail(&term->list, head);
|
list_add_tail(&term->list, head);
|
||||||
|
|
||||||
ALLOC_LIST(list);
|
ALLOC_LIST(list);
|
||||||
|
@ -548,7 +548,7 @@ PE_NAME '=' PE_VALUE
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
$1, $3, &@1, &@3));
|
$1, $3, false, &@1, &@3));
|
||||||
$$ = term;
|
$$ = term;
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
|
@ -566,7 +566,7 @@ PE_NAME
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
$1, 1, &@1, NULL));
|
$1, 1, true, &@1, NULL));
|
||||||
$$ = term;
|
$$ = term;
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
|
@ -591,7 +591,7 @@ PE_TERM '=' PE_VALUE
|
||||||
{
|
{
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, &@1, &@3));
|
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3));
|
||||||
$$ = term;
|
$$ = term;
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
|
@ -599,7 +599,7 @@ PE_TERM
|
||||||
{
|
{
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, &@1, NULL));
|
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL));
|
||||||
$$ = term;
|
$$ = term;
|
||||||
}
|
}
|
||||||
|
|
|
|
||||||
|
@ -620,7 +620,7 @@ PE_NAME array '=' PE_VALUE
|
||||||
struct parse_events_term *term;
|
struct parse_events_term *term;
|
||||||
|
|
||||||
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||||
$1, $4, &@1, &@4));
|
$1, $4, false, &@1, &@4));
|
||||||
term->array = $2;
|
term->array = $2;
|
||||||
$$ = term;
|
$$ = term;
|
||||||
}
|
}
|
||||||
|
|
|
@ -745,7 +745,7 @@ static int pmu_resolve_param_term(struct parse_events_term *term,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
printf("Required parameter '%s' not specified\n", term->config);
|
printf("Required parameter '%s' not specified\n", term->config);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -803,7 +803,7 @@ static int pmu_config_term(struct list_head *formats,
|
||||||
|
|
||||||
format = pmu_find_format(formats, term->config);
|
format = pmu_find_format(formats, term->config);
|
||||||
if (!format) {
|
if (!format) {
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
printf("Invalid event/parameter '%s'\n", term->config);
|
printf("Invalid event/parameter '%s'\n", term->config);
|
||||||
if (err) {
|
if (err) {
|
||||||
char *pmu_term = pmu_formats_string(formats);
|
char *pmu_term = pmu_formats_string(formats);
|
||||||
|
@ -834,11 +834,20 @@ static int pmu_config_term(struct list_head *formats,
|
||||||
* Either directly use a numeric term, or try to translate string terms
|
* Either directly use a numeric term, or try to translate string terms
|
||||||
* using event parameters.
|
* using event parameters.
|
||||||
*/
|
*/
|
||||||
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
|
if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
|
||||||
|
if (term->no_value &&
|
||||||
|
bitmap_weight(format->bits, PERF_PMU_FORMAT_BITS) > 1) {
|
||||||
|
if (err) {
|
||||||
|
err->idx = term->err_val;
|
||||||
|
err->str = strdup("no value assigned for term");
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
val = term->val.num;
|
val = term->val.num;
|
||||||
else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
|
} else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
|
||||||
if (strcmp(term->val.str, "?")) {
|
if (strcmp(term->val.str, "?")) {
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
pr_info("Invalid sysfs entry %s=%s\n",
|
pr_info("Invalid sysfs entry %s=%s\n",
|
||||||
term->config, term->val.str);
|
term->config, term->val.str);
|
||||||
}
|
}
|
||||||
|
@ -1223,7 +1232,7 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
|
||||||
printf("%*s", 8, "[");
|
printf("%*s", 8, "[");
|
||||||
wordwrap(aliases[j].desc, 8, columns, 0);
|
wordwrap(aliases[j].desc, 8, columns, 0);
|
||||||
printf("]\n");
|
printf("]\n");
|
||||||
if (verbose)
|
if (verbose > 0)
|
||||||
printf("%*s%s/%s/\n", 8, "", aliases[j].pmu, aliases[j].str);
|
printf("%*s%s/%s/\n", 8, "", aliases[j].pmu, aliases[j].str);
|
||||||
} else
|
} else
|
||||||
printf(" %-50s [Kernel PMU event]\n", aliases[j].name);
|
printf(" %-50s [Kernel PMU event]\n", aliases[j].name);
|
||||||
|
|
|
@ -594,7 +594,7 @@ static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp,
|
||||||
pr_debug("try to find information at %" PRIx64 " in %s\n", addr,
|
pr_debug("try to find information at %" PRIx64 " in %s\n", addr,
|
||||||
tp->module ? : "kernel");
|
tp->module ? : "kernel");
|
||||||
|
|
||||||
dinfo = debuginfo_cache__open(tp->module, verbose == 0);
|
dinfo = debuginfo_cache__open(tp->module, verbose <= 0);
|
||||||
if (dinfo)
|
if (dinfo)
|
||||||
ret = debuginfo__find_probe_point(dinfo,
|
ret = debuginfo__find_probe_point(dinfo,
|
||||||
(unsigned long)addr, pp);
|
(unsigned long)addr, pp);
|
||||||
|
|
|
@ -369,10 +369,10 @@ static PyObject *python_process_callchain(struct perf_sample *sample,
|
||||||
if (node->map) {
|
if (node->map) {
|
||||||
struct map *map = node->map;
|
struct map *map = node->map;
|
||||||
const char *dsoname = "[unknown]";
|
const char *dsoname = "[unknown]";
|
||||||
if (map && map->dso && (map->dso->name || map->dso->long_name)) {
|
if (map && map->dso) {
|
||||||
if (symbol_conf.show_kernel_path && map->dso->long_name)
|
if (symbol_conf.show_kernel_path && map->dso->long_name)
|
||||||
dsoname = map->dso->long_name;
|
dsoname = map->dso->long_name;
|
||||||
else if (map->dso->name)
|
else
|
||||||
dsoname = map->dso->name;
|
dsoname = map->dso->name;
|
||||||
}
|
}
|
||||||
pydict_set_item_string_decref(pyelem, "dso",
|
pydict_set_item_string_decref(pyelem, "dso",
|
||||||
|
|
|
@ -932,7 +932,7 @@ static void branch_stack__printf(struct perf_sample *sample)
|
||||||
|
|
||||||
printf("..... %2"PRIu64": %016" PRIx64 " -> %016" PRIx64 " %hu cycles %s%s%s%s %x\n",
|
printf("..... %2"PRIu64": %016" PRIx64 " -> %016" PRIx64 " %hu cycles %s%s%s%s %x\n",
|
||||||
i, e->from, e->to,
|
i, e->from, e->to,
|
||||||
e->flags.cycles,
|
(unsigned short)e->flags.cycles,
|
||||||
e->flags.mispred ? "M" : " ",
|
e->flags.mispred ? "M" : " ",
|
||||||
e->flags.predicted ? "P" : " ",
|
e->flags.predicted ? "P" : " ",
|
||||||
e->flags.abort ? "A" : " ",
|
e->flags.abort ? "A" : " ",
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
#!/usr/bin/python2
|
#!/usr/bin/python2
|
||||||
|
|
||||||
from distutils.core import setup, Extension
|
|
||||||
from os import getenv
|
from os import getenv
|
||||||
|
|
||||||
|
cc = getenv("CC")
|
||||||
|
if cc == "clang":
|
||||||
|
from _sysconfigdata import build_time_vars
|
||||||
|
from re import sub
|
||||||
|
build_time_vars["CFLAGS"] = sub("-specs=[^ ]+", "", build_time_vars["CFLAGS"])
|
||||||
|
|
||||||
|
from distutils.core import setup, Extension
|
||||||
|
|
||||||
from distutils.command.build_ext import build_ext as _build_ext
|
from distutils.command.build_ext import build_ext as _build_ext
|
||||||
from distutils.command.install_lib import install_lib as _install_lib
|
from distutils.command.install_lib import install_lib as _install_lib
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ static int64_t _sort__dso_cmp(struct map *map_l, struct map *map_r)
|
||||||
if (!dso_l || !dso_r)
|
if (!dso_l || !dso_r)
|
||||||
return cmp_null(dso_r, dso_l);
|
return cmp_null(dso_r, dso_l);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
dso_name_l = dso_l->long_name;
|
dso_name_l = dso_l->long_name;
|
||||||
dso_name_r = dso_r->long_name;
|
dso_name_r = dso_r->long_name;
|
||||||
} else {
|
} else {
|
||||||
|
@ -172,8 +172,8 @@ static int _hist_entry__dso_snprintf(struct map *map, char *bf,
|
||||||
size_t size, unsigned int width)
|
size_t size, unsigned int width)
|
||||||
{
|
{
|
||||||
if (map && map->dso) {
|
if (map && map->dso) {
|
||||||
const char *dso_name = !verbose ? map->dso->short_name :
|
const char *dso_name = verbose > 0 ? map->dso->long_name :
|
||||||
map->dso->long_name;
|
map->dso->short_name;
|
||||||
return repsep_snprintf(bf, size, "%-*.*s", width, width, dso_name);
|
return repsep_snprintf(bf, size, "%-*.*s", width, width, dso_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ static int _hist_entry__sym_snprintf(struct map *map, struct symbol *sym,
|
||||||
{
|
{
|
||||||
size_t ret = 0;
|
size_t ret = 0;
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
char o = map ? dso__symtab_origin(map->dso) : '!';
|
char o = map ? dso__symtab_origin(map->dso) : '!';
|
||||||
ret += repsep_snprintf(bf, size, "%-#*llx %c ",
|
ret += repsep_snprintf(bf, size, "%-#*llx %c ",
|
||||||
BITS_PER_LONG / 4 + 2, ip, o);
|
BITS_PER_LONG / 4 + 2, ip, o);
|
||||||
|
|
|
@ -344,7 +344,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
update_stats(&ps->res_stats[i], count[i]);
|
update_stats(&ps->res_stats[i], count[i]);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose > 0) {
|
||||||
fprintf(config->output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
|
fprintf(config->output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
|
||||||
perf_evsel__name(counter), count[0], count[1], count[2]);
|
perf_evsel__name(counter), count[0], count[1], count[2]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,7 @@ static bool want_demangle(bool is_kernel_sym)
|
||||||
|
|
||||||
static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
|
static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
|
||||||
{
|
{
|
||||||
int demangle_flags = verbose ? (DMGL_PARAMS | DMGL_ANSI) : DMGL_NO_OPTS;
|
int demangle_flags = verbose > 0 ? (DMGL_PARAMS | DMGL_ANSI) : DMGL_NO_OPTS;
|
||||||
char *demangled = NULL;
|
char *demangled = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue