ring-buffer: Incorporate absolute timestamp into add_timestamp logic

Instead of calling out the absolute test for each time to check if the
ring buffer wants absolute time stamps for all its recording, incorporate it
with the add_timestamp field and turn it into flags for faster processing
between wanting a absolute tag and needing to force one.

Link: http://lkml.kernel.org/r/20200629025259.154892368@goodmis.org

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Steven Rostedt (VMware) 2020-06-28 22:52:26 -04:00
parent a389d86f7f
commit 7c4b4a5164

View File

@ -422,13 +422,15 @@ struct rb_event_info {
/* /*
* Used for the add_timestamp * Used for the add_timestamp
* NONE * NONE
* NORMAL - may be for either time extend or absolute * EXTEND - wants a time extend
* ABSOLUTE - the buffer requests all events to have absolute time stamps
* FORCE - force a full time stamp. * FORCE - force a full time stamp.
*/ */
enum { enum {
RB_ADD_STAMP_NONE, RB_ADD_STAMP_NONE = 0,
RB_ADD_STAMP_NORMAL, RB_ADD_STAMP_EXTEND = BIT(1),
RB_ADD_STAMP_FORCE RB_ADD_STAMP_ABSOLUTE = BIT(2),
RB_ADD_STAMP_FORCE = BIT(3)
}; };
/* /*
* Used for which event context the event is in. * Used for which event context the event is in.
@ -2434,8 +2436,8 @@ rb_update_event(struct ring_buffer_per_cpu *cpu_buffer,
* add it to the start of the reserved space. * add it to the start of the reserved space.
*/ */
if (unlikely(info->add_timestamp)) { if (unlikely(info->add_timestamp)) {
bool abs = info->add_timestamp == RB_ADD_STAMP_FORCE || bool abs = info->add_timestamp &
ring_buffer_time_stamp_abs(cpu_buffer->buffer); (RB_ADD_STAMP_FORCE | RB_ADD_STAMP_ABSOLUTE);
event = rb_add_time_stamp(event, abs ? info->delta : delta, abs); event = rb_add_time_stamp(event, abs ? info->delta : delta, abs);
length -= RB_LEN_TIME_EXTEND; length -= RB_LEN_TIME_EXTEND;
@ -2884,7 +2886,7 @@ int ring_buffer_unlock_commit(struct trace_buffer *buffer,
EXPORT_SYMBOL_GPL(ring_buffer_unlock_commit); EXPORT_SYMBOL_GPL(ring_buffer_unlock_commit);
static noinline void static noinline void
rb_handle_timestamp(struct ring_buffer_per_cpu *cpu_buffer, rb_check_timestamp(struct ring_buffer_per_cpu *cpu_buffer,
struct rb_event_info *info) struct rb_event_info *info)
{ {
WARN_ONCE(info->delta > (1ULL << 59), WARN_ONCE(info->delta > (1ULL << 59),
@ -2897,7 +2899,6 @@ rb_handle_timestamp(struct ring_buffer_per_cpu *cpu_buffer,
"please switch to the trace global clock:\n" "please switch to the trace global clock:\n"
" echo global > /sys/kernel/debug/tracing/trace_clock\n" " echo global > /sys/kernel/debug/tracing/trace_clock\n"
"or add trace_clock=global to the kernel command line\n"); "or add trace_clock=global to the kernel command line\n");
info->add_timestamp = RB_ADD_STAMP_NORMAL;
} }
static struct ring_buffer_event * static struct ring_buffer_event *
@ -2908,7 +2909,6 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
struct buffer_page *tail_page; struct buffer_page *tail_page;
unsigned long tail, write, w; unsigned long tail, write, w;
u64 before, after; u64 before, after;
bool abs = false;
/* Don't let the compiler play games with cpu_buffer->tail_page */ /* Don't let the compiler play games with cpu_buffer->tail_page */
tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page); tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page);
@ -2922,20 +2922,23 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
if (ring_buffer_time_stamp_abs(cpu_buffer->buffer)) { if (ring_buffer_time_stamp_abs(cpu_buffer->buffer)) {
info->delta = info->ts; info->delta = info->ts;
abs = true; info->add_timestamp = RB_ADD_STAMP_ABSOLUTE;
} else { } else {
info->delta = info->ts - after; info->delta = info->ts - after;
} }
if (unlikely(test_time_stamp(info->delta))) if (unlikely(test_time_stamp(info->delta))) {
rb_handle_timestamp(cpu_buffer, info); rb_check_timestamp(cpu_buffer, info);
info->add_timestamp |= RB_ADD_STAMP_EXTEND;
}
/* /*
* If interrupting an event time update, we may need an absolute timestamp. * If interrupting an event time update, we may need an absolute timestamp.
* Don't bother if this is the start of a new page (w == 0). * Don't bother if this is the start of a new page (w == 0).
*/ */
if (unlikely(before != after && w)) if (unlikely(before != after && w))
info->add_timestamp = RB_ADD_STAMP_FORCE; info->add_timestamp |= RB_ADD_STAMP_FORCE | RB_ADD_STAMP_EXTEND;
/* /*
* If the time delta since the last event is too big to * If the time delta since the last event is too big to
* hold in the time field of the event, then we append a * hold in the time field of the event, then we append a
@ -2972,7 +2975,8 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
/*D*/ local64_set(&cpu_buffer->write_stamp, info->ts); /*D*/ local64_set(&cpu_buffer->write_stamp, info->ts);
barrier(); barrier();
/*E*/ save_before = local64_read(&cpu_buffer->before_stamp); /*E*/ save_before = local64_read(&cpu_buffer->before_stamp);
if (likely(info->add_timestamp != RB_ADD_STAMP_FORCE)) if (likely(!(info->add_timestamp &
(RB_ADD_STAMP_FORCE | RB_ADD_STAMP_ABSOLUTE))))
/* This did not interrupt any time update */ /* This did not interrupt any time update */
info->delta = info->ts - after; info->delta = info->ts - after;
else else
@ -3015,15 +3019,15 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
*/ */
info->delta = 0; info->delta = 0;
} }
if (info->add_timestamp == RB_ADD_STAMP_FORCE) info->add_timestamp &= ~RB_ADD_STAMP_FORCE;
info->add_timestamp = RB_ADD_STAMP_NORMAL;
} }
/* /*
* If this is the first commit on the page, then it has the same * If this is the first commit on the page, then it has the same
* timestamp as the page itself. * timestamp as the page itself.
*/ */
if (unlikely(!tail && info->add_timestamp != RB_ADD_STAMP_FORCE && !abs)) if (unlikely(!tail && !(info->add_timestamp &
(RB_ADD_STAMP_FORCE | RB_ADD_STAMP_ABSOLUTE))))
info->delta = 0; info->delta = 0;
/* We reserved something on the buffer */ /* We reserved something on the buffer */