mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 20:24:12 +08:00
ring-buffer: Add a event_stamp to cpu_buffer for each level of nesting
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.399089673@goodmis.org Reviewed-by: Tom Zanussi <zanussi@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
e20044f7e9
commit
8672e4948d
@ -492,6 +492,8 @@ struct rb_time_struct {
|
|||||||
#endif
|
#endif
|
||||||
typedef struct rb_time_struct rb_time_t;
|
typedef struct rb_time_struct rb_time_t;
|
||||||
|
|
||||||
|
#define MAX_NEST 5
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* head_page == tail_page && head == tail then buffer is empty.
|
* head_page == tail_page && head == tail then buffer is empty.
|
||||||
*/
|
*/
|
||||||
@ -529,6 +531,7 @@ struct ring_buffer_per_cpu {
|
|||||||
unsigned long read_bytes;
|
unsigned long read_bytes;
|
||||||
rb_time_t write_stamp;
|
rb_time_t write_stamp;
|
||||||
rb_time_t before_stamp;
|
rb_time_t before_stamp;
|
||||||
|
u64 event_stamp[MAX_NEST];
|
||||||
u64 read_stamp;
|
u64 read_stamp;
|
||||||
/* ring buffer pages to update, > 0 to add, < 0 to remove */
|
/* ring buffer pages to update, > 0 to add, < 0 to remove */
|
||||||
long nr_pages_to_update;
|
long nr_pages_to_update;
|
||||||
@ -2715,6 +2718,10 @@ rb_update_event(struct ring_buffer_per_cpu *cpu_buffer,
|
|||||||
{
|
{
|
||||||
unsigned length = info->length;
|
unsigned length = info->length;
|
||||||
u64 delta = info->delta;
|
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
|
* 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)) {
|
info->after, ts)) {
|
||||||
/* Nothing came after this event between C and E */
|
/* Nothing came after this event between C and E */
|
||||||
info->delta = ts - info->after;
|
info->delta = ts - info->after;
|
||||||
info->ts = ts;
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Interrupted between C and E:
|
* Interrupted between C and E:
|
||||||
@ -3468,6 +3474,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
|||||||
*/
|
*/
|
||||||
info->delta = 0;
|
info->delta = 0;
|
||||||
}
|
}
|
||||||
|
info->ts = ts;
|
||||||
info->add_timestamp &= ~RB_ADD_STAMP_FORCE;
|
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->write_stamp, 0);
|
||||||
rb_time_set(&cpu_buffer->before_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->lost_events = 0;
|
||||||
cpu_buffer->last_overrun = 0;
|
cpu_buffer->last_overrun = 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user