diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
| -rw-r--r-- | kernel/trace/ring_buffer.c | 23 | 
1 files changed, 16 insertions, 7 deletions
| diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index a9d9760dc7b6..bd38c5cfd8ad 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -168,7 +168,13 @@ rb_event_length(struct ring_buffer_event *event)   */  unsigned ring_buffer_event_length(struct ring_buffer_event *event)  { -	return rb_event_length(event); +	unsigned length = rb_event_length(event); +	if (event->type != RINGBUF_TYPE_DATA) +		return length; +	length -= RB_EVNT_HDR_SIZE; +	if (length > RB_MAX_SMALL_DATA + sizeof(event->array[0])) +                length -= sizeof(event->array[0]); +	return length;  }  EXPORT_SYMBOL_GPL(ring_buffer_event_length); @@ -240,7 +246,7 @@ static inline int test_time_stamp(u64 delta)  	return 0;  } -#define BUF_PAGE_SIZE (PAGE_SIZE - sizeof(struct buffer_data_page)) +#define BUF_PAGE_SIZE (PAGE_SIZE - offsetof(struct buffer_data_page, data))  /*   * head_page == tail_page && head == tail then buffer is empty. @@ -1019,12 +1025,8 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,  		}  		if (next_page == head_page) { -			if (!(buffer->flags & RB_FL_OVERWRITE)) { -				/* reset write */ -				if (tail <= BUF_PAGE_SIZE) -					local_set(&tail_page->write, tail); +			if (!(buffer->flags & RB_FL_OVERWRITE))  				goto out_unlock; -			}  			/* tail_page has not moved yet? */  			if (tail_page == cpu_buffer->tail_page) { @@ -1099,6 +1101,10 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,  	return event;   out_unlock: +	/* reset write */ +	if (tail <= BUF_PAGE_SIZE) +		local_set(&tail_page->write, tail); +  	__raw_spin_unlock(&cpu_buffer->lock);  	local_irq_restore(flags);  	return NULL; @@ -2168,6 +2174,9 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)  	cpu_buffer->overrun = 0;  	cpu_buffer->entries = 0; + +	cpu_buffer->write_stamp = 0; +	cpu_buffer->read_stamp = 0;  }  /** | 
