perf fixes
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
HEAD: b7c924274c456499264d1cfa3d44063bb11eb5db Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
It contains three cherry-picked fixes from perf/core, which turned out to be more urgent than we originally thought.
Thanks,
Ingo
------------------>
Arnaldo Carvalho de Melo (1):
perf tools: Handle kernels that don't support attr.exclude_{guest,host}David Ahern (1):
perf record: No build id option fails
Joerg Roedel (1):
perf tools: Change perf_guest default back to false
tools/perf/builtin-record.c | 33 ++++++++++++++++++++++----------- tools/perf/builtin-top.c | 23 +++++++++++++++++------ tools/perf/perf.h | 1 + tools/perf/util/top.h | 1 + tools/perf/util/util.c | 2 +- 5 files changed, 42 insertions(+), 18 deletions(-)
tools/perf/builtin-record.c +22 -11
@@ -204,6 +204,9 @@ static void perf_record__open(struct perf_record *rec)if (opts->group && pos != first) group_fd = first->fd; +fallback_missing_features: +if (opts->exclude_guest_missing) + attr->exclude_guest = attr->exclude_host =0 ; retry_sample_id: attr->sample_id_all = opts->sample_id_all_avail ?1 :0 ; try_again:
@@ -217,15 +220,23 @@ try_again: }else if (err ==ENODEV && opts->cpu_list) {die ("No such device - did you specify" " an out-of-range profile CPU?\n" ); - }else if (err ==EINVAL && opts->sample_id_all_avail) { -/* -* Old kernel, no attr->sample_id_type_all field -*/ - opts->sample_id_all_avail = false; -if (!opts->sample_time && !opts->raw_samples && !time_needed) - attr->sample_type &= ~PERF_SAMPLE_TIME ; - - goto retry_sample_id; + }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 +*/ + opts->sample_id_all_avail = false; +if (!opts->sample_time && !opts->raw_samples && !time_needed) + attr->sample_type &= ~PERF_SAMPLE_TIME ; + + goto retry_sample_id; + } }/*
@@ -503,9 +514,9 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)return err; } -if (!!rec->no_buildid +if (!rec->no_buildid && !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" );return -1 ; }
tools/perf/builtin-top.c +17 -6
@@ -857,6 +857,9 @@ static void perf_top__start_counters(struct perf_top *top) attr->mmap =1 ; attr->comm =1 ; attr->inherit = top->inherit; +fallback_missing_features: +if (top->exclude_guest_missing) + attr->exclude_guest = attr->exclude_host =0 ; retry_sample_id: attr->sample_id_all = top->sample_id_all_avail ?1 :0 ; try_again:
@@ -868,12 +871,20 @@ try_again:if (err ==EPERM || err ==EACCES ) {ui__error_paranoid (); goto out_err; - }else if (err ==EINVAL && top->sample_id_all_avail) { -/* -* Old kernel, no attr->sample_id_type_all field -*/ - top->sample_id_all_avail = false; - goto retry_sample_id; + }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 +*/ + top->sample_id_all_avail = false; + goto retry_sample_id; + } }/* * If it's cycles then fall back to hrtimer
tools/perf/perf.h +1 -0
@@ -199,6 +199,7 @@ struct perf_record_opts {bool sample_address;bool sample_time;bool sample_id_all_avail; +bool exclude_guest_missing;bool system_wide;bool period;unsigned int freq;
tools/perf/util/top.h +1 -0
@@ -34,6 +34,7 @@ struct perf_top {bool inherit;bool group;bool sample_id_all_avail; +bool exclude_guest_missing;bool dump_symtab;const char *cpu_list;struct hist_entry *sym_filter_entry;
tools/perf/util/util.c +1 -1
@@ -6,7 +6,7 @@* XXX We need to find a better place for these things... */ bool perf_host = true; -bool perf_guest = true; +bool perf_guest = false;void event_attr_init (struct perf_event_attr *attr) {