|
@@ -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,
|
|
|
|
- unsigned type, unsigned long length, u64 *ts)
|
|
|
|
|
|
+rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
|
|
|
|
+ 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;
|
|
|
|
- unsigned long tail, write;
|
|
|
|
|
|
+ struct buffer_page *next_page, *head_page, *reader_page;
|
|
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;
|
|
-
|
|
|
|
- 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:
|
|
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
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)
|