Commit 4b6ac811 authored by Andi Kleen's avatar Andi Kleen Committed by Arnaldo Carvalho de Melo

perf script: Handle missing fields with -F +..

When using -F + syntax to add a field the existing defaults are
currently all marked user_set. This can cause errors when some field is
missing in the perf.data

This patch tracks the actually user set fields separately, so that we don't
error out in this case.

Before:

  % perf record true
  % perf script -F +metric
  Samples for 'cycles:ppp' event do not have CPU attribute set. Cannot print 'cpu' field.
  %

After:

  5 perf record true
  % perf script -F +metric
              perf 28936 278636.237688:          1 cycles:ppp:  ffffffff8117da99 perf_event_exec+0x59 (/lib/modules/4.20.0-odilo/build/vmlinux)
  ...
  %
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20190224153722.27020-2-andi@firstfloor.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent eb617670
...@@ -149,6 +149,7 @@ static struct { ...@@ -149,6 +149,7 @@ static struct {
unsigned int print_ip_opts; unsigned int print_ip_opts;
u64 fields; u64 fields;
u64 invalid_fields; u64 invalid_fields;
u64 user_set_fields;
} output[OUTPUT_TYPE_MAX] = { } output[OUTPUT_TYPE_MAX] = {
[PERF_TYPE_HARDWARE] = { [PERF_TYPE_HARDWARE] = {
...@@ -345,7 +346,7 @@ static int perf_evsel__do_check_stype(struct perf_evsel *evsel, ...@@ -345,7 +346,7 @@ static int perf_evsel__do_check_stype(struct perf_evsel *evsel,
if (attr->sample_type & sample_type) if (attr->sample_type & sample_type)
return 0; return 0;
if (output[type].user_set) { if (output[type].user_set_fields & field) {
if (allow_user_set) if (allow_user_set)
return 0; return 0;
evname = perf_evsel__name(evsel); evname = perf_evsel__name(evsel);
...@@ -2632,10 +2633,13 @@ static int parse_output_fields(const struct option *opt __maybe_unused, ...@@ -2632,10 +2633,13 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
pr_warning("\'%s\' not valid for %s events. Ignoring.\n", pr_warning("\'%s\' not valid for %s events. Ignoring.\n",
all_output_options[i].str, event_type(j)); all_output_options[i].str, event_type(j));
} else { } else {
if (change == REMOVE) if (change == REMOVE) {
output[j].fields &= ~all_output_options[i].field; output[j].fields &= ~all_output_options[i].field;
else output[j].user_set_fields &= ~all_output_options[i].field;
} else {
output[j].fields |= all_output_options[i].field; output[j].fields |= all_output_options[i].field;
output[j].user_set_fields |= all_output_options[i].field;
}
output[j].user_set = true; output[j].user_set = true;
output[j].wildcard_set = true; output[j].wildcard_set = true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment