From: "Steven Rostedt (VMware)" <rost...@goodmis.org>

Add a place to save the current event time stamp for each level of nesting.
This will be used to retrieve the time stamp of the current event before it
is committed.

Link: https://lkml.kernel.org/r/20210316164113.399089...@goodmis.org

Reviewed-by: Tom Zanussi <zanu...@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org>
---
 kernel/trace/ring_buffer.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 941ac2021b97..470d97169081 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -492,6 +492,8 @@ struct rb_time_struct {
 #endif
 typedef struct rb_time_struct rb_time_t;
 
+#define MAX_NEST       5
+
 /*
  * head_page == tail_page && head == tail then buffer is empty.
  */
@@ -529,6 +531,7 @@ struct ring_buffer_per_cpu {
        unsigned long                   read_bytes;
        rb_time_t                       write_stamp;
        rb_time_t                       before_stamp;
+       u64                             event_stamp[MAX_NEST];
        u64                             read_stamp;
        /* ring buffer pages to update, > 0 to add, < 0 to remove */
        long                            nr_pages_to_update;
@@ -2715,6 +2718,10 @@ rb_update_event(struct ring_buffer_per_cpu *cpu_buffer,
 {
        unsigned length = info->length;
        u64 delta = info->delta;
+       unsigned int nest = local_read(&cpu_buffer->committing) - 1;
+
+       if (nest < MAX_NEST)
+               cpu_buffer->event_stamp[nest] = info->ts;
 
        /*
         * If we need to add a timestamp, then we
@@ -3456,7 +3463,6 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
                                    info->after, ts)) {
                        /* Nothing came after this event between C and E */
                        info->delta = ts - info->after;
-                       info->ts = ts;
                } else {
                        /*
                         * Interrupted between C and E:
@@ -3468,6 +3474,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
                         */
                        info->delta = 0;
                }
+               info->ts = ts;
                info->add_timestamp &= ~RB_ADD_STAMP_FORCE;
        }
 
@@ -5026,6 +5033,8 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
        rb_time_set(&cpu_buffer->write_stamp, 0);
        rb_time_set(&cpu_buffer->before_stamp, 0);
 
+       memset(cpu_buffer->event_stamp, 0, sizeof(cpu_buffer->event_stamp));
+
        cpu_buffer->lost_events = 0;
        cpu_buffer->last_overrun = 0;
 
-- 
2.30.1


Reply via email to