diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
| -rw-r--r-- | kernel/trace/ring_buffer.c | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 75f1d05ea82d..9c6045a27ba3 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1887,12 +1887,6 @@ rb_event_index(struct ring_buffer_event *event)  	return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE;  } -static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) -{ -	cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp; -	cpu_buffer->reader_page->read = 0; -} -  static void rb_inc_iter(struct ring_buffer_iter *iter)  {  	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; @@ -2803,8 +2797,11 @@ rb_reserve_next_event(struct ring_buffer *buffer,  	event = __rb_reserve_next(cpu_buffer, &info); -	if (unlikely(PTR_ERR(event) == -EAGAIN)) +	if (unlikely(PTR_ERR(event) == -EAGAIN)) { +		if (info.add_timestamp) +			info.length -= RB_LEN_TIME_EXTEND;  		goto again; +	}  	if (!event)  		goto out_fail; @@ -3626,7 +3623,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)  	/* Finally update the reader page to the new head */  	cpu_buffer->reader_page = reader; -	rb_reset_reader_page(cpu_buffer); +	cpu_buffer->reader_page->read = 0;  	if (overwrite != cpu_buffer->last_overrun) {  		cpu_buffer->lost_events = overwrite - cpu_buffer->last_overrun; @@ -3636,6 +3633,10 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)  	goto again;   out: +	/* Update the read_stamp on the first event */ +	if (reader && reader->read == 0) +		cpu_buffer->read_stamp = reader->page->time_stamp; +  	arch_spin_unlock(&cpu_buffer->lock);  	local_irq_restore(flags);  | 
