diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ring_buffer.c | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 6b8dac02364f..09d4f0d879a7 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -117,6 +117,8 @@ void *ring_buffer_event_data(struct ring_buffer_event *event) | |||
117 | struct buffer_page { | 117 | struct buffer_page { |
118 | u64 time_stamp; /* page time stamp */ | 118 | u64 time_stamp; /* page time stamp */ |
119 | unsigned size; /* size of page data */ | 119 | unsigned size; /* size of page data */ |
120 | unsigned write; /* index for next write */ | ||
121 | unsigned read; /* index for next read */ | ||
120 | struct list_head list; /* list of free pages */ | 122 | struct list_head list; /* list of free pages */ |
121 | void *page; /* Actual data page */ | 123 | void *page; /* Actual data page */ |
122 | }; | 124 | }; |
@@ -153,11 +155,8 @@ struct ring_buffer_per_cpu { | |||
153 | spinlock_t lock; | 155 | spinlock_t lock; |
154 | struct lock_class_key lock_key; | 156 | struct lock_class_key lock_key; |
155 | struct list_head pages; | 157 | struct list_head pages; |
156 | unsigned long head; /* read from head */ | 158 | struct buffer_page *head_page; /* read from head */ |
157 | unsigned long tail; /* write to tail */ | 159 | struct buffer_page *tail_page; /* write to tail */ |
158 | unsigned long reader; | ||
159 | struct buffer_page *head_page; | ||
160 | struct buffer_page *tail_page; | ||
161 | struct buffer_page *reader_page; | 160 | struct buffer_page *reader_page; |
162 | unsigned long overrun; | 161 | unsigned long overrun; |
163 | unsigned long entries; | 162 | unsigned long entries; |
@@ -566,10 +565,11 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
566 | 565 | ||
567 | static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer) | 566 | static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer) |
568 | { | 567 | { |
569 | return (cpu_buffer->reader == cpu_buffer->reader_page->size && | 568 | return cpu_buffer->reader_page->read == cpu_buffer->reader_page->size && |
570 | (cpu_buffer->tail_page == cpu_buffer->reader_page || | 569 | (cpu_buffer->tail_page == cpu_buffer->reader_page || |
571 | (cpu_buffer->tail_page == cpu_buffer->head_page && | 570 | (cpu_buffer->tail_page == cpu_buffer->head_page && |
572 | cpu_buffer->head == cpu_buffer->tail))); | 571 | cpu_buffer->head_page->read == |
572 | cpu_buffer->tail_page->write)); | ||
573 | } | 573 | } |
574 | 574 | ||
575 | static inline int rb_null_event(struct ring_buffer_event *event) | 575 | static inline int rb_null_event(struct ring_buffer_event *event) |
@@ -577,7 +577,7 @@ static inline int rb_null_event(struct ring_buffer_event *event) | |||
577 | return event->type == RINGBUF_TYPE_PADDING; | 577 | return event->type == RINGBUF_TYPE_PADDING; |
578 | } | 578 | } |
579 | 579 | ||
580 | static inline void *rb_page_index(struct buffer_page *page, unsigned index) | 580 | static inline void *__rb_page_index(struct buffer_page *page, unsigned index) |
581 | { | 581 | { |
582 | return page->page + index; | 582 | return page->page + index; |
583 | } | 583 | } |
@@ -585,15 +585,21 @@ static inline void *rb_page_index(struct buffer_page *page, unsigned index) | |||
585 | static inline struct ring_buffer_event * | 585 | static inline struct ring_buffer_event * |
586 | rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer) | 586 | rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer) |
587 | { | 587 | { |
588 | return rb_page_index(cpu_buffer->reader_page, | 588 | return __rb_page_index(cpu_buffer->reader_page, |
589 | cpu_buffer->reader); | 589 | cpu_buffer->reader_page->read); |
590 | } | ||
591 | |||
592 | static inline struct ring_buffer_event * | ||
593 | rb_head_event(struct ring_buffer_per_cpu *cpu_buffer) | ||
594 | { | ||
595 | return __rb_page_index(cpu_buffer->head_page, | ||
596 | cpu_buffer->head_page->read); | ||
590 | } | 597 | } |
591 | 598 | ||
592 | static inline struct ring_buffer_event * | 599 | static inline struct ring_buffer_event * |
593 | rb_iter_head_event(struct ring_buffer_iter *iter) | 600 | rb_iter_head_event(struct ring_buffer_iter *iter) |
594 | { | 601 | { |
595 | return rb_page_index(iter->head_page, | 602 | return __rb_page_index(iter->head_page, iter->head); |
596 | iter->head); | ||
597 | } | 603 | } |
598 | 604 | ||
599 | /* | 605 | /* |
@@ -610,7 +616,7 @@ static void rb_update_overflow(struct ring_buffer_per_cpu *cpu_buffer) | |||
610 | for (head = 0; head < rb_head_size(cpu_buffer); | 616 | for (head = 0; head < rb_head_size(cpu_buffer); |
611 | head += rb_event_length(event)) { | 617 | head += rb_event_length(event)) { |
612 | 618 | ||
613 | event = rb_page_index(cpu_buffer->head_page, head); | 619 | event = __rb_page_index(cpu_buffer->head_page, head); |
614 | BUG_ON(rb_null_event(event)); | 620 | BUG_ON(rb_null_event(event)); |
615 | /* Only count data entries */ | 621 | /* Only count data entries */ |
616 | if (event->type != RINGBUF_TYPE_DATA) | 622 | if (event->type != RINGBUF_TYPE_DATA) |
@@ -640,13 +646,13 @@ rb_add_stamp(struct ring_buffer_per_cpu *cpu_buffer, u64 *ts) | |||
640 | 646 | ||
641 | static void rb_reset_head_page(struct ring_buffer_per_cpu *cpu_buffer) | 647 | static void rb_reset_head_page(struct ring_buffer_per_cpu *cpu_buffer) |
642 | { | 648 | { |
643 | cpu_buffer->head = 0; | 649 | cpu_buffer->head_page->read = 0; |
644 | } | 650 | } |
645 | 651 | ||
646 | static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | 652 | static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) |
647 | { | 653 | { |
648 | cpu_buffer->read_stamp = cpu_buffer->reader_page->time_stamp; | 654 | cpu_buffer->read_stamp = cpu_buffer->reader_page->time_stamp; |
649 | cpu_buffer->reader = 0; | 655 | cpu_buffer->reader_page->read = 0; |
650 | } | 656 | } |
651 | 657 | ||
652 | static inline void rb_inc_iter(struct ring_buffer_iter *iter) | 658 | static inline void rb_inc_iter(struct ring_buffer_iter *iter) |
@@ -743,9 +749,8 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | |||
743 | struct ring_buffer *buffer = cpu_buffer->buffer; | 749 | struct ring_buffer *buffer = cpu_buffer->buffer; |
744 | struct ring_buffer_event *event; | 750 | struct ring_buffer_event *event; |
745 | 751 | ||
746 | /* No locking needed for tail page */ | ||
747 | tail_page = cpu_buffer->tail_page; | 752 | tail_page = cpu_buffer->tail_page; |
748 | tail = cpu_buffer->tail; | 753 | tail = cpu_buffer->tail_page->write; |
749 | 754 | ||
750 | if (tail + length > BUF_PAGE_SIZE) { | 755 | if (tail + length > BUF_PAGE_SIZE) { |
751 | struct buffer_page *next_page = tail_page; | 756 | struct buffer_page *next_page = tail_page; |
@@ -774,7 +779,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | |||
774 | } | 779 | } |
775 | 780 | ||
776 | if (tail != BUF_PAGE_SIZE) { | 781 | if (tail != BUF_PAGE_SIZE) { |
777 | event = rb_page_index(tail_page, tail); | 782 | event = __rb_page_index(tail_page, tail); |
778 | /* page padding */ | 783 | /* page padding */ |
779 | event->type = RINGBUF_TYPE_PADDING; | 784 | event->type = RINGBUF_TYPE_PADDING; |
780 | } | 785 | } |
@@ -784,14 +789,14 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | |||
784 | tail_page->size = 0; | 789 | tail_page->size = 0; |
785 | tail = 0; | 790 | tail = 0; |
786 | cpu_buffer->tail_page = tail_page; | 791 | cpu_buffer->tail_page = tail_page; |
787 | cpu_buffer->tail = tail; | 792 | cpu_buffer->tail_page->write = tail; |
788 | rb_add_stamp(cpu_buffer, ts); | 793 | rb_add_stamp(cpu_buffer, ts); |
789 | spin_unlock(&cpu_buffer->lock); | 794 | spin_unlock(&cpu_buffer->lock); |
790 | } | 795 | } |
791 | 796 | ||
792 | BUG_ON(tail + length > BUF_PAGE_SIZE); | 797 | BUG_ON(tail + length > BUF_PAGE_SIZE); |
793 | 798 | ||
794 | event = rb_page_index(tail_page, tail); | 799 | event = __rb_page_index(tail_page, tail); |
795 | rb_update_event(event, type, length); | 800 | rb_update_event(event, type, length); |
796 | 801 | ||
797 | return event; | 802 | return event; |
@@ -823,12 +828,12 @@ rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer, | |||
823 | return -1; | 828 | return -1; |
824 | 829 | ||
825 | /* check to see if we went to the next page */ | 830 | /* check to see if we went to the next page */ |
826 | if (cpu_buffer->tail) { | 831 | if (cpu_buffer->tail_page->write) { |
827 | /* Still on same page, update timestamp */ | 832 | /* Still on same page, update timestamp */ |
828 | event->time_delta = *delta & TS_MASK; | 833 | event->time_delta = *delta & TS_MASK; |
829 | event->array[0] = *delta >> TS_SHIFT; | 834 | event->array[0] = *delta >> TS_SHIFT; |
830 | /* commit the time event */ | 835 | /* commit the time event */ |
831 | cpu_buffer->tail += | 836 | cpu_buffer->tail_page->write += |
832 | rb_event_length(event); | 837 | rb_event_length(event); |
833 | cpu_buffer->write_stamp = *ts; | 838 | cpu_buffer->write_stamp = *ts; |
834 | *delta = 0; | 839 | *delta = 0; |
@@ -846,7 +851,7 @@ rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer, | |||
846 | 851 | ||
847 | ts = ring_buffer_time_stamp(cpu_buffer->cpu); | 852 | ts = ring_buffer_time_stamp(cpu_buffer->cpu); |
848 | 853 | ||
849 | if (cpu_buffer->tail) { | 854 | if (cpu_buffer->tail_page->write) { |
850 | delta = ts - cpu_buffer->write_stamp; | 855 | delta = ts - cpu_buffer->write_stamp; |
851 | 856 | ||
852 | if (test_time_stamp(delta)) { | 857 | if (test_time_stamp(delta)) { |
@@ -868,7 +873,7 @@ rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer, | |||
868 | return NULL; | 873 | return NULL; |
869 | 874 | ||
870 | /* If the reserve went to the next page, our delta is zero */ | 875 | /* If the reserve went to the next page, our delta is zero */ |
871 | if (!cpu_buffer->tail) | 876 | if (!cpu_buffer->tail_page->write) |
872 | delta = 0; | 877 | delta = 0; |
873 | 878 | ||
874 | event->time_delta = delta; | 879 | event->time_delta = delta; |
@@ -933,8 +938,8 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
933 | static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer, | 938 | static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer, |
934 | struct ring_buffer_event *event) | 939 | struct ring_buffer_event *event) |
935 | { | 940 | { |
936 | cpu_buffer->tail += rb_event_length(event); | 941 | cpu_buffer->tail_page->write += rb_event_length(event); |
937 | cpu_buffer->tail_page->size = cpu_buffer->tail; | 942 | cpu_buffer->tail_page->size = cpu_buffer->tail_page->write; |
938 | cpu_buffer->write_stamp += event->time_delta; | 943 | cpu_buffer->write_stamp += event->time_delta; |
939 | cpu_buffer->entries++; | 944 | cpu_buffer->entries++; |
940 | } | 945 | } |
@@ -1178,10 +1183,10 @@ void ring_buffer_iter_reset(struct ring_buffer_iter *iter) | |||
1178 | /* Iterator usage is expected to have record disabled */ | 1183 | /* Iterator usage is expected to have record disabled */ |
1179 | if (list_empty(&cpu_buffer->reader_page->list)) { | 1184 | if (list_empty(&cpu_buffer->reader_page->list)) { |
1180 | iter->head_page = cpu_buffer->head_page; | 1185 | iter->head_page = cpu_buffer->head_page; |
1181 | iter->head = cpu_buffer->head; | 1186 | iter->head = cpu_buffer->head_page->read; |
1182 | } else { | 1187 | } else { |
1183 | iter->head_page = cpu_buffer->reader_page; | 1188 | iter->head_page = cpu_buffer->reader_page; |
1184 | iter->head = cpu_buffer->reader; | 1189 | iter->head = cpu_buffer->reader_page->read; |
1185 | } | 1190 | } |
1186 | if (iter->head) | 1191 | if (iter->head) |
1187 | iter->read_stamp = cpu_buffer->read_stamp; | 1192 | iter->read_stamp = cpu_buffer->read_stamp; |
@@ -1200,7 +1205,7 @@ int ring_buffer_iter_empty(struct ring_buffer_iter *iter) | |||
1200 | cpu_buffer = iter->cpu_buffer; | 1205 | cpu_buffer = iter->cpu_buffer; |
1201 | 1206 | ||
1202 | return iter->head_page == cpu_buffer->tail_page && | 1207 | return iter->head_page == cpu_buffer->tail_page && |
1203 | iter->head == cpu_buffer->tail; | 1208 | iter->head == cpu_buffer->tail_page->write; |
1204 | } | 1209 | } |
1205 | 1210 | ||
1206 | static void | 1211 | static void |
@@ -1277,11 +1282,11 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
1277 | reader = cpu_buffer->reader_page; | 1282 | reader = cpu_buffer->reader_page; |
1278 | 1283 | ||
1279 | /* If there's more to read, return this page */ | 1284 | /* If there's more to read, return this page */ |
1280 | if (cpu_buffer->reader < reader->size) | 1285 | if (cpu_buffer->reader_page->read < reader->size) |
1281 | goto out; | 1286 | goto out; |
1282 | 1287 | ||
1283 | /* Never should we have an index greater than the size */ | 1288 | /* Never should we have an index greater than the size */ |
1284 | WARN_ON(cpu_buffer->reader > reader->size); | 1289 | WARN_ON(cpu_buffer->reader_page->read > reader->size); |
1285 | 1290 | ||
1286 | /* check if we caught up to the tail */ | 1291 | /* check if we caught up to the tail */ |
1287 | reader = NULL; | 1292 | reader = NULL; |
@@ -1342,7 +1347,7 @@ static void rb_advance_reader(struct ring_buffer_per_cpu *cpu_buffer) | |||
1342 | rb_update_read_stamp(cpu_buffer, event); | 1347 | rb_update_read_stamp(cpu_buffer, event); |
1343 | 1348 | ||
1344 | length = rb_event_length(event); | 1349 | length = rb_event_length(event); |
1345 | cpu_buffer->reader += length; | 1350 | cpu_buffer->reader_page->read += length; |
1346 | } | 1351 | } |
1347 | 1352 | ||
1348 | static void rb_advance_iter(struct ring_buffer_iter *iter) | 1353 | static void rb_advance_iter(struct ring_buffer_iter *iter) |
@@ -1373,7 +1378,7 @@ static void rb_advance_iter(struct ring_buffer_iter *iter) | |||
1373 | * at the tail of the buffer. | 1378 | * at the tail of the buffer. |
1374 | */ | 1379 | */ |
1375 | BUG_ON((iter->head_page == cpu_buffer->tail_page) && | 1380 | BUG_ON((iter->head_page == cpu_buffer->tail_page) && |
1376 | (iter->head + length > cpu_buffer->tail)); | 1381 | (iter->head + length > cpu_buffer->tail_page->write)); |
1377 | 1382 | ||
1378 | rb_update_iter_read_stamp(iter, event); | 1383 | rb_update_iter_read_stamp(iter, event); |
1379 | 1384 | ||
@@ -1623,7 +1628,9 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) | |||
1623 | INIT_LIST_HEAD(&cpu_buffer->reader_page->list); | 1628 | INIT_LIST_HEAD(&cpu_buffer->reader_page->list); |
1624 | cpu_buffer->reader_page->size = 0; | 1629 | cpu_buffer->reader_page->size = 0; |
1625 | 1630 | ||
1626 | cpu_buffer->head = cpu_buffer->tail = cpu_buffer->reader = 0; | 1631 | cpu_buffer->head_page->read = 0; |
1632 | cpu_buffer->tail_page->write = 0; | ||
1633 | cpu_buffer->reader_page->read = 0; | ||
1627 | 1634 | ||
1628 | cpu_buffer->overrun = 0; | 1635 | cpu_buffer->overrun = 0; |
1629 | cpu_buffer->entries = 0; | 1636 | cpu_buffer->entries = 0; |