Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f7f4185 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-fixes-for-linus' of...

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
parents 82cd19cd e1e35927
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -3853,6 +3853,13 @@ int ring_buffer_read_page(struct ring_buffer *buffer,


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


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


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