From: Steven Rostedt <[email protected]>

The testing for tracing was triggering a timestamp count issue that was
always off by one. This has been happening for some time but has never
been reported by anyone else. It was finally discovered to be an issue
with the "uptime" (jiffies) clock that happened to be traced and the
internal recursion caused the discrepancy. This would have been much
easier to solve if the clock function being used was displayed when the
error was detected.

Add the clock function to the error output.

Signed-off-by: Steven Rostedt (Google) <[email protected]>
---
 kernel/trace/ring_buffer.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 170170bd83bd..a99d1c7d180b 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -4435,18 +4435,20 @@ static void check_buffer(struct ring_buffer_per_cpu 
*cpu_buffer,
        ret = rb_read_data_buffer(bpage, tail, cpu_buffer->cpu, &ts, &delta);
        if (ret < 0) {
                if (delta < ts) {
-                       buffer_warn_return("[CPU: %d]ABSOLUTE TIME WENT 
BACKWARDS: last ts: %lld absolute ts: %lld\n",
-                                          cpu_buffer->cpu, ts, delta);
+                       buffer_warn_return("[CPU: %d]ABSOLUTE TIME WENT 
BACKWARDS: last ts: %lld absolute ts: %lld clock:%pS\n",
+                                          cpu_buffer->cpu, ts, delta,
+                                          cpu_buffer->buffer->clock);
                        goto out;
                }
        }
        if ((full && ts > info->ts) ||
            (!full && ts + info->delta != info->ts)) {
-               buffer_warn_return("[CPU: %d]TIME DOES NOT MATCH expected:%lld 
actual:%lld delta:%lld before:%lld after:%lld%s context:%s\n",
+               buffer_warn_return("[CPU: %d]TIME DOES NOT MATCH expected:%lld 
actual:%lld delta:%lld before:%lld after:%lld%s context:%s\ntrace clock:%pS",
                                   cpu_buffer->cpu,
                                   ts + info->delta, info->ts, info->delta,
                                   info->before, info->after,
-                                  full ? " (full)" : "", 
show_interrupt_level());
+                                  full ? " (full)" : "", 
show_interrupt_level(),
+                                  cpu_buffer->buffer->clock);
        }
 out:
        atomic_dec(this_cpu_ptr(&checking));
-- 
2.51.0


Reply via email to