Commit b7c92427 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-urgent-for-mingo' of...

Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

Cherry picked fixes from perf/core, together with the kernel fix (1018faa6),
the sampling tools (top, record) are back working on AMD systems.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents 1018faa6 bc76efe6
...@@ -204,6 +204,9 @@ static void perf_record__open(struct perf_record *rec) ...@@ -204,6 +204,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:
...@@ -217,7 +220,14 @@ static void perf_record__open(struct perf_record *rec) ...@@ -217,7 +220,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
*/ */
...@@ -227,6 +237,7 @@ static void perf_record__open(struct perf_record *rec) ...@@ -227,6 +237,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
...@@ -503,9 +514,9 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv) ...@@ -503,9 +514,9 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
return err; return err;
} }
if (!!rec->no_buildid if (!rec->no_buildid
&& !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) { && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
pr_err("Couldn't generating buildids. " pr_err("Couldn't generate buildids. "
"Use --no-buildid to profile anyway.\n"); "Use --no-buildid to profile anyway.\n");
return -1; return -1;
} }
......
...@@ -857,6 +857,9 @@ static void perf_top__start_counters(struct perf_top *top) ...@@ -857,6 +857,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:
...@@ -868,13 +871,21 @@ static void perf_top__start_counters(struct perf_top *top) ...@@ -868,13 +871,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;
......
...@@ -34,6 +34,7 @@ struct perf_top { ...@@ -34,6 +34,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;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* XXX We need to find a better place for these things... * XXX We need to find a better place for these things...
*/ */
bool perf_host = true; bool perf_host = true;
bool perf_guest = true; bool perf_guest = false;
void event_attr_init(struct perf_event_attr *attr) void event_attr_init(struct perf_event_attr *attr)
{ {
......
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