From de91694d07debde8862d4c68abf9bd60f8dd9cea Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 10 May 2017 04:38:23 -0700 Subject: [PATCH 1/2] Newer perf tools keep adding new perf record generated events This keeps breaking autofdo. perf 4.7 always generates a TIME_CONV event which causes create_gcov to fail. This patch makes the perf parser ignore all the perf record generated events. To avoid this problem in the future I predicted the range beyond the current records. --- chromiumos-wide-profiling/kernel/perf_event.h | 23 ++++++++++++++++++- chromiumos-wide-profiling/perf_parser.cc | 3 +-- chromiumos-wide-profiling/perf_reader.cc | 6 +++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/chromiumos-wide-profiling/kernel/perf_event.h b/chromiumos-wide-profiling/kernel/perf_event.h index 06f6016..df50323 100644 --- a/chromiumos-wide-profiling/kernel/perf_event.h +++ b/chromiumos-wide-profiling/kernel/perf_event.h @@ -712,10 +712,31 @@ enum perf_event_type { */ PERF_RECORD_MMAP2 = 10, - PERF_RECORD_FINISHED_ROUND = 68, PERF_RECORD_MAX, /* non-ABI */ }; +enum perf_user_event_type { /* above any possible kernel type */ + PERF_RECORD_USER_TYPE_START = 64, + PERF_RECORD_HEADER_ATTR = 64, + PERF_RECORD_HEADER_EVENT_TYPE = 65, /* depreceated */ + PERF_RECORD_HEADER_TRACING_DATA = 66, + PERF_RECORD_HEADER_BUILD_ID = 67, + PERF_RECORD_FINISHED_ROUND = 68, + PERF_RECORD_ID_INDEX = 69, + PERF_RECORD_AUXTRACE_INFO = 70, + PERF_RECORD_AUXTRACE = 71, + PERF_RECORD_AUXTRACE_ERROR = 72, + PERF_RECORD_THREAD_MAP = 73, + PERF_RECORD_CPU_MAP = 74, + PERF_RECORD_STAT_CONFIG = 75, + PERF_RECORD_STAT = 76, + PERF_RECORD_STAT_ROUND = 77, + PERF_RECORD_EVENT_UPDATE = 78, + PERF_RECORD_TIME_CONV = 79, + /* Predicting the future */ + PERF_RECORD_HEADER_MAX = 100, +}; + #define PERF_MAX_STACK_DEPTH 127 enum perf_callchain_context { diff --git a/chromiumos-wide-profiling/perf_parser.cc b/chromiumos-wide-profiling/perf_parser.cc index 33ddbe2..910086e 100644 --- a/chromiumos-wide-profiling/perf_parser.cc +++ b/chromiumos-wide-profiling/perf_parser.cc @@ -181,8 +181,7 @@ bool PerfParser::ProcessEvents() { case PERF_RECORD_THROTTLE: case PERF_RECORD_UNTHROTTLE: case PERF_RECORD_READ: - case PERF_RECORD_MAX: - case PERF_RECORD_FINISHED_ROUND: + case PERF_RECORD_USER_TYPE_START ... PERF_RECORD_HEADER_MAX: VLOG(1) << "Parsed event type: " << event.header.type << ". Doing nothing."; break; diff --git a/chromiumos-wide-profiling/perf_reader.cc b/chromiumos-wide-profiling/perf_reader.cc index 6589dc5..3b2538c 100644 --- a/chromiumos-wide-profiling/perf_reader.cc +++ b/chromiumos-wide-profiling/perf_reader.cc @@ -995,6 +995,12 @@ bool PerfReader::IsSupportedEventType(uint32_t type) { bool PerfReader::ReadPerfSampleInfo(const event_t& event, struct perf_sample* sample) const { CHECK(sample); + unsigned type = event.header.type; + + /* Ignore events added by perf record */ + if (type >= PERF_RECORD_USER_TYPE_START && + type < PERF_RECORD_HEADER_MAX) + return true; if (!IsSupportedEventType(event.header.type)) { LOG(ERROR) << "Unsupported event type " << event.header.type; From baab2dcb7391d9aaa843bae18b781b3f8f8ed340 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 10 May 2017 04:40:17 -0700 Subject: [PATCH 2/2] Disabled predicted sanity check for Atom Older Atom CPUs don't have predicted/mispredicted bits in the LBR, so set neither predicted nor mispredicted. The perf reader has a sanity check that either of these bits have to be set. Just remove the check. --- chromiumos-wide-profiling/perf_parser.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/chromiumos-wide-profiling/perf_parser.cc b/chromiumos-wide-profiling/perf_parser.cc index 910086e..c9cc395 100644 --- a/chromiumos-wide-profiling/perf_parser.cc +++ b/chromiumos-wide-profiling/perf_parser.cc @@ -400,11 +400,7 @@ bool PerfParser::MapBranchStack(const uint32_t pid, parsed_entry.predicted = entry.flags.predicted; // Either predicted or mispredicted, not both. But don't use a CHECK here, // just exit gracefully because it's a minor issue. - if (entry.flags.predicted == entry.flags.mispred) { - LOG(ERROR) << "Branch stack entry predicted and mispred flags " - << "both have value " << entry.flags.mispred; - return false; - } + // We can't check this because Atom doesn't have predicted/mispredicted flags } return true;