diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
| -rw-r--r-- | kernel/trace/ring_buffer.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 1d0f6a8a0e5..49491fa7daa 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1075,6 +1075,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int nr_pages, int cpu)  	rb_init_page(bpage->page);  	INIT_LIST_HEAD(&cpu_buffer->reader_page->list); +	INIT_LIST_HEAD(&cpu_buffer->new_pages);  	ret = rb_allocate_pages(cpu_buffer, nr_pages);  	if (ret < 0) @@ -1346,10 +1347,9 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned int nr_pages)  			 * If something was added to this page, it was full  			 * since it is not the tail page. So we deduct the  			 * bytes consumed in ring buffer from here. -			 * No need to update overruns, since this page is -			 * deleted from ring buffer and its entries are -			 * already accounted for. +			 * Increment overrun to account for the lost events.  			 */ +			local_add(page_entries, &cpu_buffer->overrun);  			local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes);  		} @@ -3239,6 +3239,10 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)  	if (cpu_buffer->commit_page == cpu_buffer->reader_page)  		goto out; +	/* Don't bother swapping if the ring buffer is empty */ +	if (rb_num_of_entries(cpu_buffer) == 0) +		goto out; +  	/*  	 * Reset the reader page to size zero.  	 */  | 
