aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2014-11-26 10:39:31 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-11-28 16:19:37 -0500
commitf61ff6c06dc8f32c7036013ad802c899ec590607 (patch)
treeff00e05038c6b3cbea03b2086cf23f365ae80f1e
parent7ddc6a2199f1da405a2fb68c40db8899b1a8cd87 (diff)
perf session: Do not fail on processing out of order event
Linus reported perf report command being interrupted due to processing of 'out of order' event, with following error: Timestamp below last timeslice flush 0x5733a8 [0x28]: failed to process type: 3 I could reproduce the issue and in my case it was caused by one CPU (mmap) being behind during record and userspace mmap reader seeing the data after other CPUs data were already stored. This is expected under some circumstances because we need to limit the number of events that we queue for reordering when we receive a PERF_RECORD_FINISHED_ROUND or when we force flush due to memory pressure. Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Ingo Molnar <mingo@kernel.org> Cc: Andi Kleen <ak@linux.intel.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Matt Fleming <matt.fleming@intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1417016371-30249-1-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/event.h1
-rw-r--r--tools/perf/util/session.c11
2 files changed, 6 insertions, 6 deletions
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 5699e7e2a790..50a7b115698c 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -214,6 +214,7 @@ struct events_stats {
214 u32 nr_invalid_chains; 214 u32 nr_invalid_chains;
215 u32 nr_unknown_id; 215 u32 nr_unknown_id;
216 u32 nr_unprocessable_samples; 216 u32 nr_unprocessable_samples;
217 u32 nr_unordered_events;
217}; 218};
218 219
219struct attr_event { 220struct attr_event {
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 6702ac28754b..80dbba095f30 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -521,15 +521,11 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event,
521 return -ETIME; 521 return -ETIME;
522 522
523 if (timestamp < oe->last_flush) { 523 if (timestamp < oe->last_flush) {
524 WARN_ONCE(1, "Timestamp below last timeslice flush\n"); 524 pr_oe_time(timestamp, "out of order event\n");
525
526 pr_oe_time(timestamp, "out of order event");
527 pr_oe_time(oe->last_flush, "last flush, last_flush_type %d\n", 525 pr_oe_time(oe->last_flush, "last flush, last_flush_type %d\n",
528 oe->last_flush_type); 526 oe->last_flush_type);
529 527
530 /* We could get out of order messages after forced flush. */ 528 s->stats.nr_unordered_events++;
531 if (oe->last_flush_type != OE_FLUSH__HALF)
532 return -EINVAL;
533 } 529 }
534 530
535 new = ordered_events__new(oe, timestamp, event); 531 new = ordered_events__new(oe, timestamp, event);
@@ -1057,6 +1053,9 @@ static void perf_session__warn_about_errors(const struct perf_session *session,
1057 "Do you have a KVM guest running and not using 'perf kvm'?\n", 1053 "Do you have a KVM guest running and not using 'perf kvm'?\n",
1058 session->stats.nr_unprocessable_samples); 1054 session->stats.nr_unprocessable_samples);
1059 } 1055 }
1056
1057 if (session->stats.nr_unordered_events != 0)
1058 ui__warning("%u out of order events recorded.\n", session->stats.nr_unordered_events);
1060} 1059}
1061 1060
1062volatile int session_done; 1061volatile int session_done;