diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 4d5ce7f6c578..8a3decf9b70b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -5884,7 +5884,8 @@ int ring_buffer_read_page(struct trace_buffer *buffer, * Otherwise, we can simply swap the page with the one passed in. */ if (read || (len < (commit - read)) || - cpu_buffer->reader_page == cpu_buffer->commit_page) { + cpu_buffer->reader_page == cpu_buffer->commit_page || + unlikely(has_ext_writer(buffer))) { struct buffer_data_page *rpage = cpu_buffer->reader_page->page; unsigned int rpos = read; unsigned int pos = 0; @@ -5949,21 +5950,14 @@ int ring_buffer_read_page(struct trace_buffer *buffer, cpu_buffer->read += rb_page_entries(reader); cpu_buffer->read_bytes += BUF_PAGE_SIZE; - if (unlikely(has_ext_writer(buffer))) { - u64 commit = local_read(&reader->page->commit); - - memcpy(bpage, reader->page, - BUF_PAGE_HDR_SIZE + commit); - } else { - /* swap the pages */ - rb_init_page(bpage); - bpage = reader->page; - reader->page = *data_page; - local_set(&reader->write, 0); - local_set(&reader->entries, 0); - reader->read = 0; - *data_page = bpage; - } + /* swap the pages */ + rb_init_page(bpage); + bpage = reader->page; + reader->page = *data_page; + local_set(&reader->write, 0); + local_set(&reader->entries, 0); + reader->read = 0; + *data_page = bpage; /* * Use the real_end for the data size,