perf tools: Handle kernels that don't support attr.exclude_{guest,host}

Just fall back to resetting those fields, if set, warning the user that
that feature is not available.

If guest samples appear they will just be discarded because no struct
machine will be found and thus the event will be accounted as not
handled and dropped, see 0c095715.
Reported-by: default avatarNamhyung Kim <namhyung@gmail.com>
Tested-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Joerg Roedel <joerg.roedel@amd.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-vuwxig36mzprl5n7nzvnxxsh@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7e1ccd38
...@@ -205,6 +205,9 @@ static void perf_record__open(struct perf_record *rec) ...@@ -205,6 +205,9 @@ static void perf_record__open(struct perf_record *rec)
if (opts->group && pos != first) if (opts->group && pos != first)
group_fd = first->fd; group_fd = first->fd;
fallback_missing_features:
if (opts->exclude_guest_missing)
attr->exclude_guest = attr->exclude_host = 0;
retry_sample_id: retry_sample_id:
attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0; attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0;
try_again: try_again:
...@@ -218,7 +221,14 @@ static void perf_record__open(struct perf_record *rec) ...@@ -218,7 +221,14 @@ static void perf_record__open(struct perf_record *rec)
} else if (err == ENODEV && opts->cpu_list) { } else if (err == ENODEV && opts->cpu_list) {
die("No such device - did you specify" die("No such device - did you specify"
" an out-of-range profile CPU?\n"); " an out-of-range profile CPU?\n");
} else if (err == EINVAL && opts->sample_id_all_avail) { } else if (err == EINVAL) {
if (!opts->exclude_guest_missing &&
(attr->exclude_guest || attr->exclude_host)) {
pr_debug("Old kernel, cannot exclude "
"guest or host samples.\n");
opts->exclude_guest_missing = true;
goto fallback_missing_features;
} else if (opts->sample_id_all_avail) {
/* /*
* Old kernel, no attr->sample_id_type_all field * Old kernel, no attr->sample_id_type_all field
*/ */
...@@ -228,6 +238,7 @@ static void perf_record__open(struct perf_record *rec) ...@@ -228,6 +238,7 @@ static void perf_record__open(struct perf_record *rec)
goto retry_sample_id; goto retry_sample_id;
} }
}
/* /*
* If it's cycles then fall back to hrtimer * If it's cycles then fall back to hrtimer
......
...@@ -872,6 +872,9 @@ static void perf_top__start_counters(struct perf_top *top) ...@@ -872,6 +872,9 @@ static void perf_top__start_counters(struct perf_top *top)
attr->mmap = 1; attr->mmap = 1;
attr->comm = 1; attr->comm = 1;
attr->inherit = top->inherit; attr->inherit = top->inherit;
fallback_missing_features:
if (top->exclude_guest_missing)
attr->exclude_guest = attr->exclude_host = 0;
retry_sample_id: retry_sample_id:
attr->sample_id_all = top->sample_id_all_avail ? 1 : 0; attr->sample_id_all = top->sample_id_all_avail ? 1 : 0;
try_again: try_again:
...@@ -883,13 +886,21 @@ static void perf_top__start_counters(struct perf_top *top) ...@@ -883,13 +886,21 @@ static void perf_top__start_counters(struct perf_top *top)
if (err == EPERM || err == EACCES) { if (err == EPERM || err == EACCES) {
ui__error_paranoid(); ui__error_paranoid();
goto out_err; goto out_err;
} else if (err == EINVAL && top->sample_id_all_avail) { } else if (err == EINVAL) {
if (!top->exclude_guest_missing &&
(attr->exclude_guest || attr->exclude_host)) {
pr_debug("Old kernel, cannot exclude "
"guest or host samples.\n");
top->exclude_guest_missing = true;
goto fallback_missing_features;
} else if (top->sample_id_all_avail) {
/* /*
* Old kernel, no attr->sample_id_type_all field * Old kernel, no attr->sample_id_type_all field
*/ */
top->sample_id_all_avail = false; top->sample_id_all_avail = false;
goto retry_sample_id; goto retry_sample_id;
} }
}
/* /*
* If it's cycles then fall back to hrtimer * If it's cycles then fall back to hrtimer
* based cpu-clock-tick sw counter, which * based cpu-clock-tick sw counter, which
......
...@@ -199,6 +199,7 @@ struct perf_record_opts { ...@@ -199,6 +199,7 @@ struct perf_record_opts {
bool sample_address; bool sample_address;
bool sample_time; bool sample_time;
bool sample_id_all_avail; bool sample_id_all_avail;
bool exclude_guest_missing;
bool system_wide; bool system_wide;
bool period; bool period;
unsigned int freq; unsigned int freq;
......
...@@ -35,6 +35,7 @@ struct perf_top { ...@@ -35,6 +35,7 @@ struct perf_top {
bool inherit; bool inherit;
bool group; bool group;
bool sample_id_all_avail; bool sample_id_all_avail;
bool exclude_guest_missing;
bool dump_symtab; bool dump_symtab;
const char *cpu_list; const char *cpu_list;
struct hist_entry *sym_filter_entry; struct hist_entry *sym_filter_entry;
......
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