Skip to content

Commit 6f7f418

Browse files
committed
Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: ring_buffer: Off-by-one and duplicate events in ring_buffer_read_page
2 parents 82cd19c + e1e3592 commit 6f7f418

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

kernel/trace/ring_buffer.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3853,6 +3853,13 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
38533853

38543854
/* Need to copy one event at a time */
38553855
do {
3856+
/* We need the size of one event, because
3857+
* rb_advance_reader only advances by one event,
3858+
* whereas rb_event_ts_length may include the size of
3859+
* one or two events.
3860+
* We have already ensured there's enough space if this
3861+
* is a time extend. */
3862+
size = rb_event_length(event);
38563863
memcpy(bpage->data + pos, rpage->data + rpos, size);
38573864

38583865
len -= size;
@@ -3867,7 +3874,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
38673874
event = rb_reader_event(cpu_buffer);
38683875
/* Always keep the time extend and data together */
38693876
size = rb_event_ts_length(event);
3870-
} while (len > size);
3877+
} while (len >= size);
38713878

38723879
/* update bpage */
38733880
local_set(&bpage->commit, pos);

0 commit comments

Comments
 (0)