Commit 071c830e authored by Jiri Olsa's avatar Jiri Olsa Committed by Luis Henriques

perf session: Do not fail on processing out of order event

commit f61ff6c0 upstream.

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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Acked-by: default avatarIngo 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
[zhangzhiqiang: backport to 3.10:
 - adjust context
 - commit f61ff6c0 struct events_stats was defined in tools/perf/util/event.h
   while 3.10 stable defined in tools/perf/util/hist.h.
 - 3.10 stable there is no pr_oe_time() which used for debug.
 - After the above adjustments, becomes same to the original patch:
   https://github.com/torvalds/linux/commit/f61ff6c06dc8f32c7036013ad802c899ec590607
]
Signed-off-by: default avatarZhiqiang Zhang <zhangzhiqiang.zhang@huawei.com>
[ luis: backported to 3.16: used zhangzhiqiang backport to 3.10 ]
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 342443e9
...@@ -47,6 +47,7 @@ struct events_stats { ...@@ -47,6 +47,7 @@ struct events_stats {
u32 nr_invalid_chains; u32 nr_invalid_chains;
u32 nr_unknown_id; u32 nr_unknown_id;
u32 nr_unprocessable_samples; u32 nr_unprocessable_samples;
u32 nr_unordered_events;
}; };
enum hist_column { enum hist_column {
......
...@@ -638,8 +638,7 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event, ...@@ -638,8 +638,7 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event,
return -ETIME; return -ETIME;
if (timestamp < s->ordered_samples.last_flush) { if (timestamp < s->ordered_samples.last_flush) {
printf("Warning: Timestamp below last timeslice flush\n"); s->stats.nr_unordered_events++;
return -EINVAL;
} }
if (!list_empty(sc)) { if (!list_empty(sc)) {
...@@ -1136,6 +1135,9 @@ static void perf_session__warn_about_errors(const struct perf_session *session, ...@@ -1136,6 +1135,9 @@ static void perf_session__warn_about_errors(const struct perf_session *session,
"Do you have a KVM guest running and not using 'perf kvm'?\n", "Do you have a KVM guest running and not using 'perf kvm'?\n",
session->stats.nr_unprocessable_samples); session->stats.nr_unprocessable_samples);
} }
if (session->stats.nr_unordered_events != 0)
ui__warning("%u out of order events recorded.\n", session->stats.nr_unordered_events);
} }
volatile int session_done; volatile int session_done;
......
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