diff options
| -rw-r--r-- | kernel/trace/ring_buffer.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 9ed509a015d..bd1c35a4fbc 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -3853,6 +3853,13 @@ int ring_buffer_read_page(struct ring_buffer *buffer, | |||
| 3853 | 3853 | ||
| 3854 | /* Need to copy one event at a time */ | 3854 | /* Need to copy one event at a time */ |
| 3855 | do { | 3855 | 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); | ||
| 3856 | memcpy(bpage->data + pos, rpage->data + rpos, size); | 3863 | memcpy(bpage->data + pos, rpage->data + rpos, size); |
| 3857 | 3864 | ||
| 3858 | len -= size; | 3865 | len -= size; |
| @@ -3867,7 +3874,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, | |||
| 3867 | event = rb_reader_event(cpu_buffer); | 3874 | event = rb_reader_event(cpu_buffer); |
| 3868 | /* Always keep the time extend and data together */ | 3875 | /* Always keep the time extend and data together */ |
| 3869 | size = rb_event_ts_length(event); | 3876 | size = rb_event_ts_length(event); |
| 3870 | } while (len > size); | 3877 | } while (len >= size); |
| 3871 | 3878 | ||
| 3872 | /* update bpage */ | 3879 | /* update bpage */ |
| 3873 | local_set(&bpage->commit, pos); | 3880 | local_set(&bpage->commit, pos); |
