ring-buffer: make moving the tail page a separate function
Ingo Molnar thought the code would be cleaner if we used a function call instead of a goto for moving the tail page. After implementing this, it seems that gcc still inlines the result and the output is pretty much the same. Since this is considered a cleaner approach, might as well implement it. [ Impact: code clean up ] Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt
parent
00c81a58c5
commit
6634ff26cc
@@ -1154,51 +1154,18 @@ static unsigned rb_calculate_event_length(unsigned length)
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct ring_buffer_event *
|
static struct ring_buffer_event *
|
||||||
__rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
|
||||||
unsigned type, unsigned long length, u64 *ts)
|
unsigned long length, unsigned long tail,
|
||||||
|
struct buffer_page *commit_page,
|
||||||
|
struct buffer_page *tail_page, u64 *ts)
|
||||||
{
|
{
|
||||||
struct buffer_page *tail_page, *head_page, *reader_page, *commit_page;
|
struct buffer_page *next_page, *head_page, *reader_page;
|
||||||
struct buffer_page *next_page;
|
|
||||||
unsigned long tail, write;
|
|
||||||
struct ring_buffer *buffer = cpu_buffer->buffer;
|
struct ring_buffer *buffer = cpu_buffer->buffer;
|
||||||
struct ring_buffer_event *event;
|
struct ring_buffer_event *event;
|
||||||
unsigned long flags;
|
|
||||||
bool lock_taken = false;
|
bool lock_taken = false;
|
||||||
|
unsigned long flags;
|
||||||
commit_page = cpu_buffer->commit_page;
|
|
||||||
/* we just need to protect against interrupts */
|
|
||||||
barrier();
|
|
||||||
tail_page = cpu_buffer->tail_page;
|
|
||||||
write = local_add_return(length, &tail_page->write);
|
|
||||||
tail = write - length;
|
|
||||||
|
|
||||||
/* See if we shot pass the end of this buffer page */
|
|
||||||
if (write > BUF_PAGE_SIZE)
|
|
||||||
goto next_page;
|
|
||||||
|
|
||||||
/* We reserved something on the buffer */
|
|
||||||
|
|
||||||
if (RB_WARN_ON(cpu_buffer, write > BUF_PAGE_SIZE))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
event = __rb_page_index(tail_page, tail);
|
|
||||||
rb_update_event(event, type, length);
|
|
||||||
|
|
||||||
/* The passed in type is zero for DATA */
|
|
||||||
if (likely(!type))
|
|
||||||
local_inc(&tail_page->entries);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this is a commit and the tail is zero, then update
|
|
||||||
* this page's time stamp.
|
|
||||||
*/
|
|
||||||
if (!tail && rb_is_commit(cpu_buffer, event))
|
|
||||||
cpu_buffer->commit_page->page->time_stamp = *ts;
|
|
||||||
|
|
||||||
return event;
|
|
||||||
|
|
||||||
next_page:
|
|
||||||
|
|
||||||
next_page = tail_page;
|
next_page = tail_page;
|
||||||
|
|
||||||
@@ -1318,6 +1285,48 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct ring_buffer_event *
|
||||||
|
__rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
|
||||||
|
unsigned type, unsigned long length, u64 *ts)
|
||||||
|
{
|
||||||
|
struct buffer_page *tail_page, *commit_page;
|
||||||
|
struct ring_buffer_event *event;
|
||||||
|
unsigned long tail, write;
|
||||||
|
|
||||||
|
commit_page = cpu_buffer->commit_page;
|
||||||
|
/* we just need to protect against interrupts */
|
||||||
|
barrier();
|
||||||
|
tail_page = cpu_buffer->tail_page;
|
||||||
|
write = local_add_return(length, &tail_page->write);
|
||||||
|
tail = write - length;
|
||||||
|
|
||||||
|
/* See if we shot pass the end of this buffer page */
|
||||||
|
if (write > BUF_PAGE_SIZE)
|
||||||
|
return rb_move_tail(cpu_buffer, length, tail,
|
||||||
|
commit_page, tail_page, ts);
|
||||||
|
|
||||||
|
/* We reserved something on the buffer */
|
||||||
|
|
||||||
|
if (RB_WARN_ON(cpu_buffer, write > BUF_PAGE_SIZE))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
event = __rb_page_index(tail_page, tail);
|
||||||
|
rb_update_event(event, type, length);
|
||||||
|
|
||||||
|
/* The passed in type is zero for DATA */
|
||||||
|
if (likely(!type))
|
||||||
|
local_inc(&tail_page->entries);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this is a commit and the tail is zero, then update
|
||||||
|
* this page's time stamp.
|
||||||
|
*/
|
||||||
|
if (!tail && rb_is_commit(cpu_buffer, event))
|
||||||
|
cpu_buffer->commit_page->page->time_stamp = *ts;
|
||||||
|
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
|
rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
|
||||||
u64 *ts, u64 *delta)
|
u64 *ts, u64 *delta)
|
||||||
|
Reference in New Issue
Block a user