Skip to content

Commit 3301afb

Browse files
rostedtgregkh
authored andcommitted
ring-buffer: Force before_stamp and write_stamp to be different on discard
commit 6f6be60 upstream. Part of the logic of the new time stamp code depends on the before_stamp and the write_stamp to be different if the write_stamp does not match the last event on the buffer, as it will be used to calculate the delta of the next event written on the buffer. The discard logic depends on this, as the next event to come in needs to inject a full timestamp as it can not rely on the last event timestamp in the buffer because it is unknown due to events after it being discarded. But by changing the write_stamp back to the time before it, it forces the next event to use a full time stamp, instead of relying on it. The issue came when a full time stamp was used for the event, and rb_time_delta() returns zero in that case. The update to the write_stamp (which subtracts delta) made it not change. Then when the event is removed from the buffer, because the before_stamp and write_stamp still match, the next event written would calculate its delta from the write_stamp, but that would be wrong as the write_stamp is of the time of the event that was discarded. In the case that the delta change being made to write_stamp is zero, set the before_stamp to zero as well, and this will force the next event to inject a full timestamp and not use the current write_stamp. Cc: stable@vger.kernel.org Fixes: a389d86 ("ring-buffer: Have nested events still record running time stamp") Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent c6e5800 commit 3301afb

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

kernel/trace/ring_buffer.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,6 +2836,17 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
28362836
write_stamp, write_stamp - delta))
28372837
return 0;
28382838

2839+
/*
2840+
* It's possible that the event time delta is zero
2841+
* (has the same time stamp as the previous event)
2842+
* in which case write_stamp and before_stamp could
2843+
* be the same. In such a case, force before_stamp
2844+
* to be different than write_stamp. It doesn't
2845+
* matter what it is, as long as its different.
2846+
*/
2847+
if (!delta)
2848+
rb_time_set(&cpu_buffer->before_stamp, 0);
2849+
28392850
/*
28402851
* If an event were to come in now, it would see that the
28412852
* write_stamp and the before_stamp are different, and assume

0 commit comments

Comments
 (0)