Skip to content

Commit abc9b56

Browse files
Steven RostedtIngo Molnar
authored andcommitted
ring-buffer: move some metadata into buffer page
Impact: get ready for splice changes This patch moves the commit and timestamp into the beginning of each data page of the buffer. This change will allow the page to be moved to another location (disk, network, etc) and still have information in the page to be able to read it. Signed-off-by: Steven Rostedt <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
1 parent a5e2588 commit abc9b56

File tree

1 file changed

+36
-27
lines changed

1 file changed

+36
-27
lines changed

kernel/trace/ring_buffer.c

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -195,20 +195,24 @@ void *ring_buffer_event_data(struct ring_buffer_event *event)
195195
#define TS_MASK ((1ULL << TS_SHIFT) - 1)
196196
#define TS_DELTA_TEST (~TS_MASK)
197197

198-
/*
199-
* This hack stolen from mm/slob.c.
200-
* We can store per page timing information in the page frame of the page.
201-
* Thanks to Peter Zijlstra for suggesting this idea.
202-
*/
203-
struct buffer_page {
198+
struct buffer_data_page {
204199
u64 time_stamp; /* page time stamp */
205-
local_t write; /* index for next write */
206200
local_t commit; /* write commited index */
201+
unsigned char data[]; /* data of buffer page */
202+
};
203+
204+
struct buffer_page {
205+
local_t write; /* index for next write */
207206
unsigned read; /* index for next read */
208207
struct list_head list; /* list of free pages */
209-
void *page; /* Actual data page */
208+
struct buffer_data_page *page; /* Actual data page */
210209
};
211210

211+
static void rb_init_page(struct buffer_data_page *page)
212+
{
213+
local_set(&page->commit, 0);
214+
}
215+
212216
/*
213217
* Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
214218
* this issue out.
@@ -230,7 +234,7 @@ static inline int test_time_stamp(u64 delta)
230234
return 0;
231235
}
232236

233-
#define BUF_PAGE_SIZE PAGE_SIZE
237+
#define BUF_PAGE_SIZE (PAGE_SIZE - sizeof(struct buffer_data_page))
234238

235239
/*
236240
* head_page == tail_page && head == tail then buffer is empty.
@@ -333,6 +337,7 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
333337
if (!addr)
334338
goto free_pages;
335339
page->page = (void *)addr;
340+
rb_init_page(page->page);
336341
}
337342

338343
list_splice(&pages, head);
@@ -378,6 +383,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
378383
if (!addr)
379384
goto fail_free_reader;
380385
page->page = (void *)addr;
386+
rb_init_page(page->page);
381387

382388
INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
383389

@@ -647,6 +653,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
647653
if (!addr)
648654
goto free_pages;
649655
page->page = (void *)addr;
656+
rb_init_page(page->page);
650657
}
651658
}
652659

@@ -682,7 +689,7 @@ static inline int rb_null_event(struct ring_buffer_event *event)
682689

683690
static inline void *__rb_page_index(struct buffer_page *page, unsigned index)
684691
{
685-
return page->page + index;
692+
return page->page->data + index;
686693
}
687694

688695
static inline struct ring_buffer_event *
@@ -712,7 +719,7 @@ static inline unsigned rb_page_write(struct buffer_page *bpage)
712719

713720
static inline unsigned rb_page_commit(struct buffer_page *bpage)
714721
{
715-
return local_read(&bpage->commit);
722+
return local_read(&bpage->page->commit);
716723
}
717724

718725
/* Size is determined by what has been commited */
@@ -804,14 +811,15 @@ rb_set_commit_event(struct ring_buffer_per_cpu *cpu_buffer,
804811
if (RB_WARN_ON(cpu_buffer,
805812
cpu_buffer->commit_page == cpu_buffer->tail_page))
806813
return;
807-
cpu_buffer->commit_page->commit =
814+
cpu_buffer->commit_page->page->commit =
808815
cpu_buffer->commit_page->write;
809816
rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
810-
cpu_buffer->write_stamp = cpu_buffer->commit_page->time_stamp;
817+
cpu_buffer->write_stamp =
818+
cpu_buffer->commit_page->page->time_stamp;
811819
}
812820

813821
/* Now set the commit to the event's index */
814-
local_set(&cpu_buffer->commit_page->commit, index);
822+
local_set(&cpu_buffer->commit_page->page->commit, index);
815823
}
816824

817825
static inline void
@@ -826,24 +834,25 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
826834
* assign the commit to the tail.
827835
*/
828836
while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
829-
cpu_buffer->commit_page->commit =
837+
cpu_buffer->commit_page->page->commit =
830838
cpu_buffer->commit_page->write;
831839
rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
832-
cpu_buffer->write_stamp = cpu_buffer->commit_page->time_stamp;
840+
cpu_buffer->write_stamp =
841+
cpu_buffer->commit_page->page->time_stamp;
833842
/* add barrier to keep gcc from optimizing too much */
834843
barrier();
835844
}
836845
while (rb_commit_index(cpu_buffer) !=
837846
rb_page_write(cpu_buffer->commit_page)) {
838-
cpu_buffer->commit_page->commit =
847+
cpu_buffer->commit_page->page->commit =
839848
cpu_buffer->commit_page->write;
840849
barrier();
841850
}
842851
}
843852

844853
static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
845854
{
846-
cpu_buffer->read_stamp = cpu_buffer->reader_page->time_stamp;
855+
cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp;
847856
cpu_buffer->reader_page->read = 0;
848857
}
849858

@@ -862,7 +871,7 @@ static inline void rb_inc_iter(struct ring_buffer_iter *iter)
862871
else
863872
rb_inc_page(cpu_buffer, &iter->head_page);
864873

865-
iter->read_stamp = iter->head_page->time_stamp;
874+
iter->read_stamp = iter->head_page->page->time_stamp;
866875
iter->head = 0;
867876
}
868877

@@ -998,12 +1007,12 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
9981007
*/
9991008
if (tail_page == cpu_buffer->tail_page) {
10001009
local_set(&next_page->write, 0);
1001-
local_set(&next_page->commit, 0);
1010+
local_set(&next_page->page->commit, 0);
10021011
cpu_buffer->tail_page = next_page;
10031012

10041013
/* reread the time stamp */
10051014
*ts = ring_buffer_time_stamp(cpu_buffer->cpu);
1006-
cpu_buffer->tail_page->time_stamp = *ts;
1015+
cpu_buffer->tail_page->page->time_stamp = *ts;
10071016
}
10081017

10091018
/*
@@ -1048,7 +1057,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
10481057
* this page's time stamp.
10491058
*/
10501059
if (!tail && rb_is_commit(cpu_buffer, event))
1051-
cpu_buffer->commit_page->time_stamp = *ts;
1060+
cpu_buffer->commit_page->page->time_stamp = *ts;
10521061

10531062
return event;
10541063

@@ -1099,7 +1108,7 @@ rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
10991108
event->time_delta = *delta & TS_MASK;
11001109
event->array[0] = *delta >> TS_SHIFT;
11011110
} else {
1102-
cpu_buffer->commit_page->time_stamp = *ts;
1111+
cpu_buffer->commit_page->page->time_stamp = *ts;
11031112
event->time_delta = 0;
11041113
event->array[0] = 0;
11051114
}
@@ -1552,7 +1561,7 @@ static void rb_iter_reset(struct ring_buffer_iter *iter)
15521561
if (iter->head)
15531562
iter->read_stamp = cpu_buffer->read_stamp;
15541563
else
1555-
iter->read_stamp = iter->head_page->time_stamp;
1564+
iter->read_stamp = iter->head_page->page->time_stamp;
15561565
}
15571566

15581567
/**
@@ -1696,7 +1705,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
16961705
cpu_buffer->reader_page->list.prev = reader->list.prev;
16971706

16981707
local_set(&cpu_buffer->reader_page->write, 0);
1699-
local_set(&cpu_buffer->reader_page->commit, 0);
1708+
local_set(&cpu_buffer->reader_page->page->commit, 0);
17001709

17011710
/* Make the reader page now replace the head */
17021711
reader->list.prev->next = &cpu_buffer->reader_page->list;
@@ -2088,7 +2097,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
20882097
cpu_buffer->head_page
20892098
= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
20902099
local_set(&cpu_buffer->head_page->write, 0);
2091-
local_set(&cpu_buffer->head_page->commit, 0);
2100+
local_set(&cpu_buffer->head_page->page->commit, 0);
20922101

20932102
cpu_buffer->head_page->read = 0;
20942103

@@ -2097,7 +2106,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
20972106

20982107
INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
20992108
local_set(&cpu_buffer->reader_page->write, 0);
2100-
local_set(&cpu_buffer->reader_page->commit, 0);
2109+
local_set(&cpu_buffer->reader_page->page->commit, 0);
21012110
cpu_buffer->reader_page->read = 0;
21022111

21032112
cpu_buffer->overrun = 0;

0 commit comments

Comments
 (0)