aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/ring_buffer.c39
1 files changed, 13 insertions, 26 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index c792ea893b01..342eacc4baa8 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -321,9 +321,10 @@ struct buffer_data_page {
321}; 321};
322 322
323struct buffer_page { 323struct buffer_page {
324 struct list_head list; /* list of buffer pages */
324 local_t write; /* index for next write */ 325 local_t write; /* index for next write */
325 unsigned read; /* index for next read */ 326 unsigned read; /* index for next read */
326 struct list_head list; /* list of free pages */ 327 local_t entries; /* entries on this page */
327 struct buffer_data_page *page; /* Actual data page */ 328 struct buffer_data_page *page; /* Actual data page */
328}; 329};
329 330
@@ -977,30 +978,6 @@ static inline unsigned rb_head_size(struct ring_buffer_per_cpu *cpu_buffer)
977 return rb_page_commit(cpu_buffer->head_page); 978 return rb_page_commit(cpu_buffer->head_page);
978} 979}
979 980
980/*
981 * When the tail hits the head and the buffer is in overwrite mode,
982 * the head jumps to the next page and all content on the previous
983 * page is discarded. But before doing so, we update the overrun
984 * variable of the buffer.
985 */
986static void rb_update_overflow(struct ring_buffer_per_cpu *cpu_buffer)
987{
988 struct ring_buffer_event *event;
989 unsigned long head;
990
991 for (head = 0; head < rb_head_size(cpu_buffer);
992 head += rb_event_length(event)) {
993
994 event = __rb_page_index(cpu_buffer->head_page, head);
995 if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
996 return;
997 /* Only count data entries */
998 if (event->type_len > RINGBUF_TYPE_DATA_TYPE_LEN_MAX)
999 continue;
1000 cpu_buffer->overrun++;
1001 }
1002}
1003
1004static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer, 981static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer,
1005 struct buffer_page **bpage) 982 struct buffer_page **bpage)
1006{ 983{
@@ -1253,7 +1230,8 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
1253 /* tail_page has not moved yet? */ 1230 /* tail_page has not moved yet? */
1254 if (tail_page == cpu_buffer->tail_page) { 1231 if (tail_page == cpu_buffer->tail_page) {
1255 /* count overflows */ 1232 /* count overflows */
1256 rb_update_overflow(cpu_buffer); 1233 cpu_buffer->overrun +=
1234 local_read(&head_page->entries);
1257 1235
1258 rb_inc_page(cpu_buffer, &head_page); 1236 rb_inc_page(cpu_buffer, &head_page);
1259 cpu_buffer->head_page = head_page; 1237 cpu_buffer->head_page = head_page;
@@ -1268,6 +1246,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
1268 */ 1246 */
1269 if (tail_page == cpu_buffer->tail_page) { 1247 if (tail_page == cpu_buffer->tail_page) {
1270 local_set(&next_page->write, 0); 1248 local_set(&next_page->write, 0);
1249 local_set(&next_page->entries, 0);
1271 local_set(&next_page->page->commit, 0); 1250 local_set(&next_page->page->commit, 0);
1272 cpu_buffer->tail_page = next_page; 1251 cpu_buffer->tail_page = next_page;
1273 1252
@@ -1313,6 +1292,10 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
1313 event = __rb_page_index(tail_page, tail); 1292 event = __rb_page_index(tail_page, tail);
1314 rb_update_event(event, type, length); 1293 rb_update_event(event, type, length);
1315 1294
1295 /* The passed in type is zero for DATA */
1296 if (likely(!type))
1297 local_inc(&tail_page->entries);
1298
1316 /* 1299 /*
1317 * If this is a commit and the tail is zero, then update 1300 * If this is a commit and the tail is zero, then update
1318 * this page's time stamp. 1301 * this page's time stamp.
@@ -2183,6 +2166,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
2183 cpu_buffer->reader_page->list.prev = reader->list.prev; 2166 cpu_buffer->reader_page->list.prev = reader->list.prev;
2184 2167
2185 local_set(&cpu_buffer->reader_page->write, 0); 2168 local_set(&cpu_buffer->reader_page->write, 0);
2169 local_set(&cpu_buffer->reader_page->entries, 0);
2186 local_set(&cpu_buffer->reader_page->page->commit, 0); 2170 local_set(&cpu_buffer->reader_page->page->commit, 0);
2187 2171
2188 /* Make the reader page now replace the head */ 2172 /* Make the reader page now replace the head */
@@ -2629,6 +2613,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
2629 cpu_buffer->head_page 2613 cpu_buffer->head_page
2630 = list_entry(cpu_buffer->pages.next, struct buffer_page, list); 2614 = list_entry(cpu_buffer->pages.next, struct buffer_page, list);
2631 local_set(&cpu_buffer->head_page->write, 0); 2615 local_set(&cpu_buffer->head_page->write, 0);
2616 local_set(&cpu_buffer->head_page->entries, 0);
2632 local_set(&cpu_buffer->head_page->page->commit, 0); 2617 local_set(&cpu_buffer->head_page->page->commit, 0);
2633 2618
2634 cpu_buffer->head_page->read = 0; 2619 cpu_buffer->head_page->read = 0;
@@ -2638,6 +2623,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
2638 2623
2639 INIT_LIST_HEAD(&cpu_buffer->reader_page->list); 2624 INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
2640 local_set(&cpu_buffer->reader_page->write, 0); 2625 local_set(&cpu_buffer->reader_page->write, 0);
2626 local_set(&cpu_buffer->reader_page->entries, 0);
2641 local_set(&cpu_buffer->reader_page->page->commit, 0); 2627 local_set(&cpu_buffer->reader_page->page->commit, 0);
2642 cpu_buffer->reader_page->read = 0; 2628 cpu_buffer->reader_page->read = 0;
2643 2629
@@ -2996,6 +2982,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
2996 bpage = reader->page; 2982 bpage = reader->page;
2997 reader->page = *data_page; 2983 reader->page = *data_page;
2998 local_set(&reader->write, 0); 2984 local_set(&reader->write, 0);
2985 local_set(&reader->entries, 0);
2999 reader->read = 0; 2986 reader->read = 0;
3000 *data_page = bpage; 2987 *data_page = bpage;
3001 2988