aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-10-04 02:00:58 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-14 04:39:18 -0400
commit6f807acd27734197b11d42829d3cbb9c0937b572 (patch)
tree3587f14a894f05a607cc71fd1ee4e63a3eb3b679 /kernel/trace
parent097d036a2f25eecc42435c57e010aaf4a2eed2d9 (diff)
ring-buffer: move page indexes into page headers
Remove the global head and tail indexes and move them into the page header. Each page will now keep track of where the last write and read was made. We also rename the head and tail to read and write for better clarification. This patch is needed for future enhancements to move the ring buffer to a lockless solution. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/ring_buffer.c75
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)
117struct buffer_page { 117struct 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
567static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer) 566static 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
575static inline int rb_null_event(struct ring_buffer_event *event) 575static 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
580static inline void *rb_page_index(struct buffer_page *page, unsigned index) 580static 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)
585static inline struct ring_buffer_event * 585static inline struct ring_buffer_event *
586rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer) 586rb_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
592static inline struct ring_buffer_event *
593rb_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
592static inline struct ring_buffer_event * 599static inline struct ring_buffer_event *
593rb_iter_head_event(struct ring_buffer_iter *iter) 600rb_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
641static void rb_reset_head_page(struct ring_buffer_per_cpu *cpu_buffer) 647static 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
646static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) 652static 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
652static inline void rb_inc_iter(struct ring_buffer_iter *iter) 658static 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