提交 c2f1cead 编写于 作者: A Andi Kleen 提交者: Arnaldo Carvalho de Melo

perf record: Fix -c/-F options for cpu event aliases

The Intel PMU event aliases have a implicit period= specifier to set the
default period.

Unfortunately this breaks overriding these periods with -c or -F,
because the alias terms look like they are user specified to the
internal parser, and user specified event qualifiers override the
command line options.

Track that they are coming from aliases by adding a "weak" state to the
term. Any weak terms don't override command line options.

I only did it for -c/-F for now, I think that's the only case that's
broken currently.

Before:

$ perf record -c 1000 -vv -e uops_issued.any
...
  { sample_period, sample_freq }   2000003

After:

$ perf record -c 1000 -vv -e uops_issued.any
...
  { sample_period, sample_freq }   1000
Signed-off-by: NAndi Kleen <ak@linux.intel.com>
Acked-by: NJiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20171020202755.21410-2-andi@firstfloor.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 1873b710
...@@ -733,12 +733,16 @@ static void apply_config_terms(struct perf_evsel *evsel, ...@@ -733,12 +733,16 @@ static void apply_config_terms(struct perf_evsel *evsel,
list_for_each_entry(term, config_terms, list) { list_for_each_entry(term, config_terms, list) {
switch (term->type) { switch (term->type) {
case PERF_EVSEL__CONFIG_TERM_PERIOD: case PERF_EVSEL__CONFIG_TERM_PERIOD:
attr->sample_period = term->val.period; if (!(term->weak && opts->user_interval != ULLONG_MAX)) {
attr->freq = 0; attr->sample_period = term->val.period;
attr->freq = 0;
}
break; break;
case PERF_EVSEL__CONFIG_TERM_FREQ: case PERF_EVSEL__CONFIG_TERM_FREQ:
attr->sample_freq = term->val.freq; if (!(term->weak && opts->user_freq != UINT_MAX)) {
attr->freq = 1; attr->sample_freq = term->val.freq;
attr->freq = 1;
}
break; break;
case PERF_EVSEL__CONFIG_TERM_TIME: case PERF_EVSEL__CONFIG_TERM_TIME:
if (term->val.time) if (term->val.time)
......
...@@ -67,6 +67,7 @@ struct perf_evsel_config_term { ...@@ -67,6 +67,7 @@ struct perf_evsel_config_term {
bool overwrite; bool overwrite;
char *branch; char *branch;
} val; } val;
bool weak;
}; };
struct perf_stat_evsel; struct perf_stat_evsel;
......
...@@ -1116,6 +1116,7 @@ do { \ ...@@ -1116,6 +1116,7 @@ do { \
INIT_LIST_HEAD(&__t->list); \ INIT_LIST_HEAD(&__t->list); \
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \ __t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
__t->val.__name = __val; \ __t->val.__name = __val; \
__t->weak = term->weak; \
list_add_tail(&__t->list, head_terms); \ list_add_tail(&__t->list, head_terms); \
} while (0) } while (0)
...@@ -2410,6 +2411,7 @@ static int new_term(struct parse_events_term **_term, ...@@ -2410,6 +2411,7 @@ static int new_term(struct parse_events_term **_term,
*term = *temp; *term = *temp;
INIT_LIST_HEAD(&term->list); INIT_LIST_HEAD(&term->list);
term->weak = false;
switch (term->type_val) { switch (term->type_val) {
case PARSE_EVENTS__TERM_TYPE_NUM: case PARSE_EVENTS__TERM_TYPE_NUM:
......
...@@ -101,6 +101,9 @@ struct parse_events_term { ...@@ -101,6 +101,9 @@ struct parse_events_term {
/* error string indexes for within parsed string */ /* error string indexes for within parsed string */
int err_term; int err_term;
int err_val; int err_val;
/* Coming from implicit alias */
bool weak;
}; };
struct parse_events_error { struct parse_events_error {
......
...@@ -405,6 +405,11 @@ static int pmu_alias_terms(struct perf_pmu_alias *alias, ...@@ -405,6 +405,11 @@ static int pmu_alias_terms(struct perf_pmu_alias *alias,
parse_events_terms__purge(&list); parse_events_terms__purge(&list);
return ret; return ret;
} }
/*
* Weak terms don't override command line options,
* which we don't want for implicit terms in aliases.
*/
cloned->weak = true;
list_add_tail(&cloned->list, &list); list_add_tail(&cloned->list, &list);
} }
list_splice(&list, terms); list_splice(&list, terms);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册