diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ring_buffer.c | 298 | ||||
-rw-r--r-- | kernel/trace/trace.c | 113 |
2 files changed, 247 insertions, 164 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 8e7392fd0db9..9631abf2ae29 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -161,8 +161,10 @@ struct ring_buffer_per_cpu { | |||
161 | struct list_head pages; | 161 | struct list_head pages; |
162 | unsigned long head; /* read from head */ | 162 | unsigned long head; /* read from head */ |
163 | unsigned long tail; /* write to tail */ | 163 | unsigned long tail; /* write to tail */ |
164 | unsigned long reader; | ||
164 | struct buffer_page *head_page; | 165 | struct buffer_page *head_page; |
165 | struct buffer_page *tail_page; | 166 | struct buffer_page *tail_page; |
167 | struct buffer_page *reader_page; | ||
166 | unsigned long overrun; | 168 | unsigned long overrun; |
167 | unsigned long entries; | 169 | unsigned long entries; |
168 | u64 write_stamp; | 170 | u64 write_stamp; |
@@ -260,6 +262,7 @@ static struct ring_buffer_per_cpu * | |||
260 | rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) | 262 | rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) |
261 | { | 263 | { |
262 | struct ring_buffer_per_cpu *cpu_buffer; | 264 | struct ring_buffer_per_cpu *cpu_buffer; |
265 | unsigned long addr; | ||
263 | int ret; | 266 | int ret; |
264 | 267 | ||
265 | cpu_buffer = kzalloc_node(ALIGN(sizeof(*cpu_buffer), cache_line_size()), | 268 | cpu_buffer = kzalloc_node(ALIGN(sizeof(*cpu_buffer), cache_line_size()), |
@@ -272,9 +275,16 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) | |||
272 | spin_lock_init(&cpu_buffer->lock); | 275 | spin_lock_init(&cpu_buffer->lock); |
273 | INIT_LIST_HEAD(&cpu_buffer->pages); | 276 | INIT_LIST_HEAD(&cpu_buffer->pages); |
274 | 277 | ||
278 | addr = __get_free_page(GFP_KERNEL); | ||
279 | if (!addr) | ||
280 | goto fail_free_buffer; | ||
281 | cpu_buffer->reader_page = (struct buffer_page *)virt_to_page(addr); | ||
282 | INIT_LIST_HEAD(&cpu_buffer->reader_page->list); | ||
283 | cpu_buffer->reader_page->size = 0; | ||
284 | |||
275 | ret = rb_allocate_pages(cpu_buffer, buffer->pages); | 285 | ret = rb_allocate_pages(cpu_buffer, buffer->pages); |
276 | if (ret < 0) | 286 | if (ret < 0) |
277 | goto fail_free_buffer; | 287 | goto fail_free_reader; |
278 | 288 | ||
279 | cpu_buffer->head_page | 289 | cpu_buffer->head_page |
280 | = list_entry(cpu_buffer->pages.next, struct buffer_page, list); | 290 | = list_entry(cpu_buffer->pages.next, struct buffer_page, list); |
@@ -283,6 +293,9 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) | |||
283 | 293 | ||
284 | return cpu_buffer; | 294 | return cpu_buffer; |
285 | 295 | ||
296 | fail_free_reader: | ||
297 | free_buffer_page(cpu_buffer->reader_page); | ||
298 | |||
286 | fail_free_buffer: | 299 | fail_free_buffer: |
287 | kfree(cpu_buffer); | 300 | kfree(cpu_buffer); |
288 | return NULL; | 301 | return NULL; |
@@ -293,6 +306,9 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer) | |||
293 | struct list_head *head = &cpu_buffer->pages; | 306 | struct list_head *head = &cpu_buffer->pages; |
294 | struct buffer_page *page, *tmp; | 307 | struct buffer_page *page, *tmp; |
295 | 308 | ||
309 | list_del_init(&cpu_buffer->reader_page->list); | ||
310 | free_buffer_page(cpu_buffer->reader_page); | ||
311 | |||
296 | list_for_each_entry_safe(page, tmp, head, list) { | 312 | list_for_each_entry_safe(page, tmp, head, list) { |
297 | list_del_init(&page->list); | 313 | list_del_init(&page->list); |
298 | free_buffer_page(page); | 314 | free_buffer_page(page); |
@@ -538,8 +554,10 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
538 | 554 | ||
539 | static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer) | 555 | static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer) |
540 | { | 556 | { |
541 | return cpu_buffer->head_page == cpu_buffer->tail_page && | 557 | return (cpu_buffer->reader == cpu_buffer->reader_page->size && |
542 | cpu_buffer->head == cpu_buffer->tail; | 558 | (cpu_buffer->tail_page == cpu_buffer->reader_page || |
559 | (cpu_buffer->tail_page == cpu_buffer->head_page && | ||
560 | cpu_buffer->head == cpu_buffer->tail))); | ||
543 | } | 561 | } |
544 | 562 | ||
545 | static inline int rb_null_event(struct ring_buffer_event *event) | 563 | static inline int rb_null_event(struct ring_buffer_event *event) |
@@ -555,10 +573,10 @@ static inline void *rb_page_index(struct buffer_page *page, unsigned index) | |||
555 | } | 573 | } |
556 | 574 | ||
557 | static inline struct ring_buffer_event * | 575 | static inline struct ring_buffer_event * |
558 | rb_head_event(struct ring_buffer_per_cpu *cpu_buffer) | 576 | rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer) |
559 | { | 577 | { |
560 | return rb_page_index(cpu_buffer->head_page, | 578 | return rb_page_index(cpu_buffer->reader_page, |
561 | cpu_buffer->head); | 579 | cpu_buffer->reader); |
562 | } | 580 | } |
563 | 581 | ||
564 | static inline struct ring_buffer_event * | 582 | static inline struct ring_buffer_event * |
@@ -610,15 +628,32 @@ rb_add_stamp(struct ring_buffer_per_cpu *cpu_buffer, u64 *ts) | |||
610 | cpu_buffer->write_stamp = *ts; | 628 | cpu_buffer->write_stamp = *ts; |
611 | } | 629 | } |
612 | 630 | ||
613 | static void rb_reset_read_page(struct ring_buffer_per_cpu *cpu_buffer) | 631 | static void rb_reset_head_page(struct ring_buffer_per_cpu *cpu_buffer) |
614 | { | 632 | { |
615 | cpu_buffer->read_stamp = cpu_buffer->head_page->time_stamp; | ||
616 | cpu_buffer->head = 0; | 633 | cpu_buffer->head = 0; |
617 | } | 634 | } |
618 | 635 | ||
619 | static void | 636 | static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) |
620 | rb_reset_iter_read_page(struct ring_buffer_iter *iter) | ||
621 | { | 637 | { |
638 | cpu_buffer->read_stamp = cpu_buffer->reader_page->time_stamp; | ||
639 | cpu_buffer->reader = 0; | ||
640 | } | ||
641 | |||
642 | static inline void rb_inc_iter(struct ring_buffer_iter *iter) | ||
643 | { | ||
644 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; | ||
645 | |||
646 | /* | ||
647 | * The iterator could be on the reader page (it starts there). | ||
648 | * But the head could have moved, since the reader was | ||
649 | * found. Check for this case and assign the iterator | ||
650 | * to the head page instead of next. | ||
651 | */ | ||
652 | if (iter->head_page == cpu_buffer->reader_page) | ||
653 | iter->head_page = cpu_buffer->head_page; | ||
654 | else | ||
655 | rb_inc_page(cpu_buffer, &iter->head_page); | ||
656 | |||
622 | iter->read_stamp = iter->head_page->time_stamp; | 657 | iter->read_stamp = iter->head_page->time_stamp; |
623 | iter->head = 0; | 658 | iter->head = 0; |
624 | } | 659 | } |
@@ -693,30 +728,39 @@ static struct ring_buffer_event * | |||
693 | __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | 728 | __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, |
694 | unsigned type, unsigned long length, u64 *ts) | 729 | unsigned type, unsigned long length, u64 *ts) |
695 | { | 730 | { |
696 | struct buffer_page *head_page, *tail_page; | 731 | struct buffer_page *tail_page, *head_page, *reader_page; |
697 | unsigned long tail; | 732 | unsigned long tail; |
698 | struct ring_buffer *buffer = cpu_buffer->buffer; | 733 | struct ring_buffer *buffer = cpu_buffer->buffer; |
699 | struct ring_buffer_event *event; | 734 | struct ring_buffer_event *event; |
700 | 735 | ||
736 | /* No locking needed for tail page */ | ||
701 | tail_page = cpu_buffer->tail_page; | 737 | tail_page = cpu_buffer->tail_page; |
702 | head_page = cpu_buffer->head_page; | ||
703 | tail = cpu_buffer->tail; | 738 | tail = cpu_buffer->tail; |
704 | 739 | ||
705 | if (tail + length > BUF_PAGE_SIZE) { | 740 | if (tail + length > BUF_PAGE_SIZE) { |
706 | struct buffer_page *next_page = tail_page; | 741 | struct buffer_page *next_page = tail_page; |
707 | 742 | ||
743 | spin_lock(&cpu_buffer->lock); | ||
708 | rb_inc_page(cpu_buffer, &next_page); | 744 | rb_inc_page(cpu_buffer, &next_page); |
709 | 745 | ||
746 | head_page = cpu_buffer->head_page; | ||
747 | reader_page = cpu_buffer->reader_page; | ||
748 | |||
749 | /* we grabbed the lock before incrementing */ | ||
750 | WARN_ON(next_page == reader_page); | ||
751 | |||
710 | if (next_page == head_page) { | 752 | if (next_page == head_page) { |
711 | if (!(buffer->flags & RB_FL_OVERWRITE)) | 753 | if (!(buffer->flags & RB_FL_OVERWRITE)) { |
754 | spin_unlock(&cpu_buffer->lock); | ||
712 | return NULL; | 755 | return NULL; |
756 | } | ||
713 | 757 | ||
714 | /* count overflows */ | 758 | /* count overflows */ |
715 | rb_update_overflow(cpu_buffer); | 759 | rb_update_overflow(cpu_buffer); |
716 | 760 | ||
717 | rb_inc_page(cpu_buffer, &head_page); | 761 | rb_inc_page(cpu_buffer, &head_page); |
718 | cpu_buffer->head_page = head_page; | 762 | cpu_buffer->head_page = head_page; |
719 | rb_reset_read_page(cpu_buffer); | 763 | rb_reset_head_page(cpu_buffer); |
720 | } | 764 | } |
721 | 765 | ||
722 | if (tail != BUF_PAGE_SIZE) { | 766 | if (tail != BUF_PAGE_SIZE) { |
@@ -732,6 +776,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, | |||
732 | cpu_buffer->tail_page = tail_page; | 776 | cpu_buffer->tail_page = tail_page; |
733 | cpu_buffer->tail = tail; | 777 | cpu_buffer->tail = tail; |
734 | rb_add_stamp(cpu_buffer, ts); | 778 | rb_add_stamp(cpu_buffer, ts); |
779 | spin_unlock(&cpu_buffer->lock); | ||
735 | } | 780 | } |
736 | 781 | ||
737 | BUG_ON(tail + length > BUF_PAGE_SIZE); | 782 | BUG_ON(tail + length > BUF_PAGE_SIZE); |
@@ -802,7 +847,9 @@ rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer, | |||
802 | return NULL; | 847 | return NULL; |
803 | } | 848 | } |
804 | } else { | 849 | } else { |
850 | spin_lock(&cpu_buffer->lock); | ||
805 | rb_add_stamp(cpu_buffer, &ts); | 851 | rb_add_stamp(cpu_buffer, &ts); |
852 | spin_unlock(&cpu_buffer->lock); | ||
806 | delta = 0; | 853 | delta = 0; |
807 | } | 854 | } |
808 | 855 | ||
@@ -851,13 +898,12 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
851 | cpu = raw_smp_processor_id(); | 898 | cpu = raw_smp_processor_id(); |
852 | 899 | ||
853 | if (!cpu_isset(cpu, buffer->cpumask)) | 900 | if (!cpu_isset(cpu, buffer->cpumask)) |
854 | goto out_irq; | 901 | goto out; |
855 | 902 | ||
856 | cpu_buffer = buffer->buffers[cpu]; | 903 | cpu_buffer = buffer->buffers[cpu]; |
857 | spin_lock(&cpu_buffer->lock); | ||
858 | 904 | ||
859 | if (atomic_read(&cpu_buffer->record_disabled)) | 905 | if (atomic_read(&cpu_buffer->record_disabled)) |
860 | goto no_record; | 906 | goto out; |
861 | 907 | ||
862 | length = rb_calculate_event_length(length); | 908 | length = rb_calculate_event_length(length); |
863 | if (length > BUF_PAGE_SIZE) | 909 | if (length > BUF_PAGE_SIZE) |
@@ -865,13 +911,11 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, | |||
865 | 911 | ||
866 | event = rb_reserve_next_event(cpu_buffer, RINGBUF_TYPE_DATA, length); | 912 | event = rb_reserve_next_event(cpu_buffer, RINGBUF_TYPE_DATA, length); |
867 | if (!event) | 913 | if (!event) |
868 | goto no_record; | 914 | goto out; |
869 | 915 | ||
870 | return event; | 916 | return event; |
871 | 917 | ||
872 | no_record: | 918 | out: |
873 | spin_unlock(&cpu_buffer->lock); | ||
874 | out_irq: | ||
875 | local_irq_restore(*flags); | 919 | local_irq_restore(*flags); |
876 | return NULL; | 920 | return NULL; |
877 | } | 921 | } |
@@ -904,11 +948,8 @@ int ring_buffer_unlock_commit(struct ring_buffer *buffer, | |||
904 | 948 | ||
905 | cpu_buffer = buffer->buffers[cpu]; | 949 | cpu_buffer = buffer->buffers[cpu]; |
906 | 950 | ||
907 | assert_spin_locked(&cpu_buffer->lock); | ||
908 | |||
909 | rb_commit(cpu_buffer, event); | 951 | rb_commit(cpu_buffer, event); |
910 | 952 | ||
911 | spin_unlock(&cpu_buffer->lock); | ||
912 | local_irq_restore(flags); | 953 | local_irq_restore(flags); |
913 | 954 | ||
914 | return 0; | 955 | return 0; |
@@ -945,10 +986,9 @@ int ring_buffer_write(struct ring_buffer *buffer, | |||
945 | cpu = raw_smp_processor_id(); | 986 | cpu = raw_smp_processor_id(); |
946 | 987 | ||
947 | if (!cpu_isset(cpu, buffer->cpumask)) | 988 | if (!cpu_isset(cpu, buffer->cpumask)) |
948 | goto out_irq; | 989 | goto out; |
949 | 990 | ||
950 | cpu_buffer = buffer->buffers[cpu]; | 991 | cpu_buffer = buffer->buffers[cpu]; |
951 | spin_lock(&cpu_buffer->lock); | ||
952 | 992 | ||
953 | if (atomic_read(&cpu_buffer->record_disabled)) | 993 | if (atomic_read(&cpu_buffer->record_disabled)) |
954 | goto out; | 994 | goto out; |
@@ -967,56 +1007,12 @@ int ring_buffer_write(struct ring_buffer *buffer, | |||
967 | 1007 | ||
968 | ret = 0; | 1008 | ret = 0; |
969 | out: | 1009 | out: |
970 | spin_unlock(&cpu_buffer->lock); | ||
971 | out_irq: | ||
972 | local_irq_restore(flags); | 1010 | local_irq_restore(flags); |
973 | 1011 | ||
974 | return ret; | 1012 | return ret; |
975 | } | 1013 | } |
976 | 1014 | ||
977 | /** | 1015 | /** |
978 | * ring_buffer_lock - lock the ring buffer | ||
979 | * @buffer: The ring buffer to lock | ||
980 | * @flags: The place to store the interrupt flags | ||
981 | * | ||
982 | * This locks all the per CPU buffers. | ||
983 | * | ||
984 | * Must be unlocked by ring_buffer_unlock. | ||
985 | */ | ||
986 | void ring_buffer_lock(struct ring_buffer *buffer, unsigned long *flags) | ||
987 | { | ||
988 | struct ring_buffer_per_cpu *cpu_buffer; | ||
989 | int cpu; | ||
990 | |||
991 | local_irq_save(*flags); | ||
992 | |||
993 | for_each_buffer_cpu(buffer, cpu) { | ||
994 | cpu_buffer = buffer->buffers[cpu]; | ||
995 | spin_lock(&cpu_buffer->lock); | ||
996 | } | ||
997 | } | ||
998 | |||
999 | /** | ||
1000 | * ring_buffer_unlock - unlock a locked buffer | ||
1001 | * @buffer: The locked buffer to unlock | ||
1002 | * @flags: The interrupt flags received by ring_buffer_lock | ||
1003 | */ | ||
1004 | void ring_buffer_unlock(struct ring_buffer *buffer, unsigned long flags) | ||
1005 | { | ||
1006 | struct ring_buffer_per_cpu *cpu_buffer; | ||
1007 | int cpu; | ||
1008 | |||
1009 | for (cpu = buffer->cpus - 1; cpu >= 0; cpu--) { | ||
1010 | if (!cpu_isset(cpu, buffer->cpumask)) | ||
1011 | continue; | ||
1012 | cpu_buffer = buffer->buffers[cpu]; | ||
1013 | spin_unlock(&cpu_buffer->lock); | ||
1014 | } | ||
1015 | |||
1016 | local_irq_restore(flags); | ||
1017 | } | ||
1018 | |||
1019 | /** | ||
1020 | * ring_buffer_record_disable - stop all writes into the buffer | 1016 | * ring_buffer_record_disable - stop all writes into the buffer |
1021 | * @buffer: The ring buffer to stop writes to. | 1017 | * @buffer: The ring buffer to stop writes to. |
1022 | * | 1018 | * |
@@ -1169,9 +1165,18 @@ void ring_buffer_iter_reset(struct ring_buffer_iter *iter) | |||
1169 | { | 1165 | { |
1170 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; | 1166 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; |
1171 | 1167 | ||
1172 | iter->head_page = cpu_buffer->head_page; | 1168 | /* Iterator usage is expected to have record disabled */ |
1173 | iter->head = cpu_buffer->head; | 1169 | if (list_empty(&cpu_buffer->reader_page->list)) { |
1174 | rb_reset_iter_read_page(iter); | 1170 | iter->head_page = cpu_buffer->head_page; |
1171 | iter->head = cpu_buffer->head; | ||
1172 | } else { | ||
1173 | iter->head_page = cpu_buffer->reader_page; | ||
1174 | iter->head = cpu_buffer->reader; | ||
1175 | } | ||
1176 | if (iter->head) | ||
1177 | iter->read_stamp = cpu_buffer->read_stamp; | ||
1178 | else | ||
1179 | iter->read_stamp = iter->head_page->time_stamp; | ||
1175 | } | 1180 | } |
1176 | 1181 | ||
1177 | /** | 1182 | /** |
@@ -1250,43 +1255,84 @@ rb_update_iter_read_stamp(struct ring_buffer_iter *iter, | |||
1250 | return; | 1255 | return; |
1251 | } | 1256 | } |
1252 | 1257 | ||
1253 | static void rb_advance_head(struct ring_buffer_per_cpu *cpu_buffer) | 1258 | static struct buffer_page * |
1259 | rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | ||
1254 | { | 1260 | { |
1255 | struct ring_buffer_event *event; | 1261 | struct buffer_page *reader = NULL; |
1256 | unsigned length; | 1262 | unsigned long flags; |
1263 | |||
1264 | spin_lock_irqsave(&cpu_buffer->lock, flags); | ||
1265 | |||
1266 | again: | ||
1267 | reader = cpu_buffer->reader_page; | ||
1268 | |||
1269 | /* If there's more to read, return this page */ | ||
1270 | if (cpu_buffer->reader < reader->size) | ||
1271 | goto out; | ||
1272 | |||
1273 | /* Never should we have an index greater than the size */ | ||
1274 | WARN_ON(cpu_buffer->reader > reader->size); | ||
1275 | |||
1276 | /* check if we caught up to the tail */ | ||
1277 | reader = NULL; | ||
1278 | if (cpu_buffer->tail_page == cpu_buffer->reader_page) | ||
1279 | goto out; | ||
1257 | 1280 | ||
1258 | /* | 1281 | /* |
1259 | * Check if we are at the end of the buffer. | 1282 | * Splice the empty reader page into the list around the head. |
1283 | * Reset the reader page to size zero. | ||
1260 | */ | 1284 | */ |
1261 | if (cpu_buffer->head >= cpu_buffer->head_page->size) { | ||
1262 | BUG_ON(cpu_buffer->head_page == cpu_buffer->tail_page); | ||
1263 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); | ||
1264 | rb_reset_read_page(cpu_buffer); | ||
1265 | return; | ||
1266 | } | ||
1267 | 1285 | ||
1268 | event = rb_head_event(cpu_buffer); | 1286 | reader = cpu_buffer->head_page; |
1287 | cpu_buffer->reader_page->list.next = reader->list.next; | ||
1288 | cpu_buffer->reader_page->list.prev = reader->list.prev; | ||
1289 | cpu_buffer->reader_page->size = 0; | ||
1269 | 1290 | ||
1270 | if (event->type == RINGBUF_TYPE_DATA) | 1291 | /* Make the reader page now replace the head */ |
1271 | cpu_buffer->entries--; | 1292 | reader->list.prev->next = &cpu_buffer->reader_page->list; |
1272 | 1293 | reader->list.next->prev = &cpu_buffer->reader_page->list; | |
1273 | length = rb_event_length(event); | ||
1274 | 1294 | ||
1275 | /* | 1295 | /* |
1276 | * This should not be called to advance the header if we are | 1296 | * If the tail is on the reader, then we must set the head |
1277 | * at the tail of the buffer. | 1297 | * to the inserted page, otherwise we set it one before. |
1278 | */ | 1298 | */ |
1279 | BUG_ON((cpu_buffer->head_page == cpu_buffer->tail_page) && | 1299 | cpu_buffer->head_page = cpu_buffer->reader_page; |
1280 | (cpu_buffer->head + length > cpu_buffer->tail)); | ||
1281 | 1300 | ||
1282 | rb_update_read_stamp(cpu_buffer, event); | 1301 | if (cpu_buffer->tail_page != reader) |
1302 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); | ||
1303 | |||
1304 | /* Finally update the reader page to the new head */ | ||
1305 | cpu_buffer->reader_page = reader; | ||
1306 | rb_reset_reader_page(cpu_buffer); | ||
1307 | |||
1308 | goto again; | ||
1309 | |||
1310 | out: | ||
1311 | spin_unlock_irqrestore(&cpu_buffer->lock, flags); | ||
1312 | |||
1313 | return reader; | ||
1314 | } | ||
1315 | |||
1316 | static void rb_advance_reader(struct ring_buffer_per_cpu *cpu_buffer) | ||
1317 | { | ||
1318 | struct ring_buffer_event *event; | ||
1319 | struct buffer_page *reader; | ||
1320 | unsigned length; | ||
1321 | |||
1322 | reader = rb_get_reader_page(cpu_buffer); | ||
1283 | 1323 | ||
1284 | cpu_buffer->head += length; | 1324 | /* This function should not be called when buffer is empty */ |
1325 | BUG_ON(!reader); | ||
1285 | 1326 | ||
1286 | /* check for end of page */ | 1327 | event = rb_reader_event(cpu_buffer); |
1287 | if ((cpu_buffer->head >= cpu_buffer->head_page->size) && | 1328 | |
1288 | (cpu_buffer->head_page != cpu_buffer->tail_page)) | 1329 | if (event->type == RINGBUF_TYPE_DATA) |
1289 | rb_advance_head(cpu_buffer); | 1330 | cpu_buffer->entries--; |
1331 | |||
1332 | rb_update_read_stamp(cpu_buffer, event); | ||
1333 | |||
1334 | length = rb_event_length(event); | ||
1335 | cpu_buffer->reader += length; | ||
1290 | } | 1336 | } |
1291 | 1337 | ||
1292 | static void rb_advance_iter(struct ring_buffer_iter *iter) | 1338 | static void rb_advance_iter(struct ring_buffer_iter *iter) |
@@ -1304,8 +1350,7 @@ static void rb_advance_iter(struct ring_buffer_iter *iter) | |||
1304 | */ | 1350 | */ |
1305 | if (iter->head >= iter->head_page->size) { | 1351 | if (iter->head >= iter->head_page->size) { |
1306 | BUG_ON(iter->head_page == cpu_buffer->tail_page); | 1352 | BUG_ON(iter->head_page == cpu_buffer->tail_page); |
1307 | rb_inc_page(cpu_buffer, &iter->head_page); | 1353 | rb_inc_iter(iter); |
1308 | rb_reset_iter_read_page(iter); | ||
1309 | return; | 1354 | return; |
1310 | } | 1355 | } |
1311 | 1356 | ||
@@ -1344,6 +1389,7 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
1344 | { | 1389 | { |
1345 | struct ring_buffer_per_cpu *cpu_buffer; | 1390 | struct ring_buffer_per_cpu *cpu_buffer; |
1346 | struct ring_buffer_event *event; | 1391 | struct ring_buffer_event *event; |
1392 | struct buffer_page *reader; | ||
1347 | 1393 | ||
1348 | if (!cpu_isset(cpu, buffer->cpumask)) | 1394 | if (!cpu_isset(cpu, buffer->cpumask)) |
1349 | return NULL; | 1395 | return NULL; |
@@ -1351,25 +1397,26 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
1351 | cpu_buffer = buffer->buffers[cpu]; | 1397 | cpu_buffer = buffer->buffers[cpu]; |
1352 | 1398 | ||
1353 | again: | 1399 | again: |
1354 | if (rb_per_cpu_empty(cpu_buffer)) | 1400 | reader = rb_get_reader_page(cpu_buffer); |
1401 | if (!reader) | ||
1355 | return NULL; | 1402 | return NULL; |
1356 | 1403 | ||
1357 | event = rb_head_event(cpu_buffer); | 1404 | event = rb_reader_event(cpu_buffer); |
1358 | 1405 | ||
1359 | switch (event->type) { | 1406 | switch (event->type) { |
1360 | case RINGBUF_TYPE_PADDING: | 1407 | case RINGBUF_TYPE_PADDING: |
1361 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); | 1408 | WARN_ON(1); |
1362 | rb_reset_read_page(cpu_buffer); | 1409 | rb_advance_reader(cpu_buffer); |
1363 | goto again; | 1410 | return NULL; |
1364 | 1411 | ||
1365 | case RINGBUF_TYPE_TIME_EXTEND: | 1412 | case RINGBUF_TYPE_TIME_EXTEND: |
1366 | /* Internal data, OK to advance */ | 1413 | /* Internal data, OK to advance */ |
1367 | rb_advance_head(cpu_buffer); | 1414 | rb_advance_reader(cpu_buffer); |
1368 | goto again; | 1415 | goto again; |
1369 | 1416 | ||
1370 | case RINGBUF_TYPE_TIME_STAMP: | 1417 | case RINGBUF_TYPE_TIME_STAMP: |
1371 | /* FIXME: not implemented */ | 1418 | /* FIXME: not implemented */ |
1372 | rb_advance_head(cpu_buffer); | 1419 | rb_advance_reader(cpu_buffer); |
1373 | goto again; | 1420 | goto again; |
1374 | 1421 | ||
1375 | case RINGBUF_TYPE_DATA: | 1422 | case RINGBUF_TYPE_DATA: |
@@ -1415,8 +1462,7 @@ ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts) | |||
1415 | 1462 | ||
1416 | switch (event->type) { | 1463 | switch (event->type) { |
1417 | case RINGBUF_TYPE_PADDING: | 1464 | case RINGBUF_TYPE_PADDING: |
1418 | rb_inc_page(cpu_buffer, &iter->head_page); | 1465 | rb_inc_iter(iter); |
1419 | rb_reset_iter_read_page(iter); | ||
1420 | goto again; | 1466 | goto again; |
1421 | 1467 | ||
1422 | case RINGBUF_TYPE_TIME_EXTEND: | 1468 | case RINGBUF_TYPE_TIME_EXTEND: |
@@ -1465,7 +1511,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts) | |||
1465 | return NULL; | 1511 | return NULL; |
1466 | 1512 | ||
1467 | cpu_buffer = buffer->buffers[cpu]; | 1513 | cpu_buffer = buffer->buffers[cpu]; |
1468 | rb_advance_head(cpu_buffer); | 1514 | rb_advance_reader(cpu_buffer); |
1469 | 1515 | ||
1470 | return event; | 1516 | return event; |
1471 | } | 1517 | } |
@@ -1487,6 +1533,7 @@ ring_buffer_read_start(struct ring_buffer *buffer, int cpu) | |||
1487 | { | 1533 | { |
1488 | struct ring_buffer_per_cpu *cpu_buffer; | 1534 | struct ring_buffer_per_cpu *cpu_buffer; |
1489 | struct ring_buffer_iter *iter; | 1535 | struct ring_buffer_iter *iter; |
1536 | unsigned long flags; | ||
1490 | 1537 | ||
1491 | if (!cpu_isset(cpu, buffer->cpumask)) | 1538 | if (!cpu_isset(cpu, buffer->cpumask)) |
1492 | return NULL; | 1539 | return NULL; |
@@ -1502,11 +1549,9 @@ ring_buffer_read_start(struct ring_buffer *buffer, int cpu) | |||
1502 | atomic_inc(&cpu_buffer->record_disabled); | 1549 | atomic_inc(&cpu_buffer->record_disabled); |
1503 | synchronize_sched(); | 1550 | synchronize_sched(); |
1504 | 1551 | ||
1505 | spin_lock(&cpu_buffer->lock); | 1552 | spin_lock_irqsave(&cpu_buffer->lock, flags); |
1506 | iter->head = cpu_buffer->head; | 1553 | ring_buffer_iter_reset(iter); |
1507 | iter->head_page = cpu_buffer->head_page; | 1554 | spin_unlock_irqrestore(&cpu_buffer->lock, flags); |
1508 | rb_reset_iter_read_page(iter); | ||
1509 | spin_unlock(&cpu_buffer->lock); | ||
1510 | 1555 | ||
1511 | return iter; | 1556 | return iter; |
1512 | } | 1557 | } |
@@ -1562,10 +1607,14 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) | |||
1562 | { | 1607 | { |
1563 | cpu_buffer->head_page | 1608 | cpu_buffer->head_page |
1564 | = list_entry(cpu_buffer->pages.next, struct buffer_page, list); | 1609 | = list_entry(cpu_buffer->pages.next, struct buffer_page, list); |
1565 | cpu_buffer->tail_page | 1610 | cpu_buffer->head_page->size = 0; |
1566 | = list_entry(cpu_buffer->pages.next, struct buffer_page, list); | 1611 | cpu_buffer->tail_page = cpu_buffer->head_page; |
1612 | cpu_buffer->tail_page->size = 0; | ||
1613 | INIT_LIST_HEAD(&cpu_buffer->reader_page->list); | ||
1614 | cpu_buffer->reader_page->size = 0; | ||
1615 | |||
1616 | cpu_buffer->head = cpu_buffer->tail = cpu_buffer->reader = 0; | ||
1567 | 1617 | ||
1568 | cpu_buffer->head = cpu_buffer->tail = 0; | ||
1569 | cpu_buffer->overrun = 0; | 1618 | cpu_buffer->overrun = 0; |
1570 | cpu_buffer->entries = 0; | 1619 | cpu_buffer->entries = 0; |
1571 | } | 1620 | } |
@@ -1583,13 +1632,11 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu) | |||
1583 | if (!cpu_isset(cpu, buffer->cpumask)) | 1632 | if (!cpu_isset(cpu, buffer->cpumask)) |
1584 | return; | 1633 | return; |
1585 | 1634 | ||
1586 | local_irq_save(flags); | 1635 | spin_lock_irqsave(&cpu_buffer->lock, flags); |
1587 | spin_lock(&cpu_buffer->lock); | ||
1588 | 1636 | ||
1589 | rb_reset_cpu(cpu_buffer); | 1637 | rb_reset_cpu(cpu_buffer); |
1590 | 1638 | ||
1591 | spin_unlock(&cpu_buffer->lock); | 1639 | spin_unlock_irqrestore(&cpu_buffer->lock, flags); |
1592 | local_irq_restore(flags); | ||
1593 | } | 1640 | } |
1594 | 1641 | ||
1595 | /** | 1642 | /** |
@@ -1598,15 +1645,10 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu) | |||
1598 | */ | 1645 | */ |
1599 | void ring_buffer_reset(struct ring_buffer *buffer) | 1646 | void ring_buffer_reset(struct ring_buffer *buffer) |
1600 | { | 1647 | { |
1601 | unsigned long flags; | ||
1602 | int cpu; | 1648 | int cpu; |
1603 | 1649 | ||
1604 | ring_buffer_lock(buffer, &flags); | ||
1605 | |||
1606 | for_each_buffer_cpu(buffer, cpu) | 1650 | for_each_buffer_cpu(buffer, cpu) |
1607 | rb_reset_cpu(buffer->buffers[cpu]); | 1651 | ring_buffer_reset_cpu(buffer, cpu); |
1608 | |||
1609 | ring_buffer_unlock(buffer, flags); | ||
1610 | } | 1652 | } |
1611 | 1653 | ||
1612 | /** | 1654 | /** |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 6a1c76bb56ba..b542f8837801 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -42,6 +42,20 @@ | |||
42 | unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX; | 42 | unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX; |
43 | unsigned long __read_mostly tracing_thresh; | 43 | unsigned long __read_mostly tracing_thresh; |
44 | 44 | ||
45 | static DEFINE_PER_CPU(local_t, ftrace_cpu_disabled); | ||
46 | |||
47 | static inline void ftrace_disable_cpu(void) | ||
48 | { | ||
49 | preempt_disable(); | ||
50 | local_inc(&__get_cpu_var(ftrace_cpu_disabled)); | ||
51 | } | ||
52 | |||
53 | static inline void ftrace_enable_cpu(void) | ||
54 | { | ||
55 | local_dec(&__get_cpu_var(ftrace_cpu_disabled)); | ||
56 | preempt_enable(); | ||
57 | } | ||
58 | |||
45 | static cpumask_t __read_mostly tracing_buffer_mask; | 59 | static cpumask_t __read_mostly tracing_buffer_mask; |
46 | 60 | ||
47 | #define for_each_tracing_cpu(cpu) \ | 61 | #define for_each_tracing_cpu(cpu) \ |
@@ -406,7 +420,9 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
406 | tr->buffer = max_tr.buffer; | 420 | tr->buffer = max_tr.buffer; |
407 | max_tr.buffer = buf; | 421 | max_tr.buffer = buf; |
408 | 422 | ||
423 | ftrace_disable_cpu(); | ||
409 | ring_buffer_reset(tr->buffer); | 424 | ring_buffer_reset(tr->buffer); |
425 | ftrace_enable_cpu(); | ||
410 | 426 | ||
411 | __update_max_tr(tr, tsk, cpu); | 427 | __update_max_tr(tr, tsk, cpu); |
412 | __raw_spin_unlock(&ftrace_max_lock); | 428 | __raw_spin_unlock(&ftrace_max_lock); |
@@ -428,9 +444,13 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
428 | WARN_ON_ONCE(!irqs_disabled()); | 444 | WARN_ON_ONCE(!irqs_disabled()); |
429 | __raw_spin_lock(&ftrace_max_lock); | 445 | __raw_spin_lock(&ftrace_max_lock); |
430 | 446 | ||
447 | ftrace_disable_cpu(); | ||
448 | |||
431 | ring_buffer_reset(max_tr.buffer); | 449 | ring_buffer_reset(max_tr.buffer); |
432 | ret = ring_buffer_swap_cpu(max_tr.buffer, tr->buffer, cpu); | 450 | ret = ring_buffer_swap_cpu(max_tr.buffer, tr->buffer, cpu); |
433 | 451 | ||
452 | ftrace_enable_cpu(); | ||
453 | |||
434 | WARN_ON_ONCE(ret); | 454 | WARN_ON_ONCE(ret); |
435 | 455 | ||
436 | __update_max_tr(tr, tsk, cpu); | 456 | __update_max_tr(tr, tsk, cpu); |
@@ -543,7 +563,9 @@ void unregister_tracer(struct tracer *type) | |||
543 | 563 | ||
544 | void tracing_reset(struct trace_array *tr, int cpu) | 564 | void tracing_reset(struct trace_array *tr, int cpu) |
545 | { | 565 | { |
566 | ftrace_disable_cpu(); | ||
546 | ring_buffer_reset_cpu(tr->buffer, cpu); | 567 | ring_buffer_reset_cpu(tr->buffer, cpu); |
568 | ftrace_enable_cpu(); | ||
547 | } | 569 | } |
548 | 570 | ||
549 | #define SAVED_CMDLINES 128 | 571 | #define SAVED_CMDLINES 128 |
@@ -654,6 +676,10 @@ trace_function(struct trace_array *tr, struct trace_array_cpu *data, | |||
654 | struct ftrace_entry *entry; | 676 | struct ftrace_entry *entry; |
655 | unsigned long irq_flags; | 677 | unsigned long irq_flags; |
656 | 678 | ||
679 | /* If we are reading the ring buffer, don't trace */ | ||
680 | if (unlikely(local_read(&__get_cpu_var(ftrace_cpu_disabled)))) | ||
681 | return; | ||
682 | |||
657 | event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), | 683 | event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), |
658 | &irq_flags); | 684 | &irq_flags); |
659 | if (!event) | 685 | if (!event) |
@@ -870,8 +896,14 @@ enum trace_file_type { | |||
870 | 896 | ||
871 | static void trace_iterator_increment(struct trace_iterator *iter, int cpu) | 897 | static void trace_iterator_increment(struct trace_iterator *iter, int cpu) |
872 | { | 898 | { |
899 | /* Don't allow ftrace to trace into the ring buffers */ | ||
900 | ftrace_disable_cpu(); | ||
901 | |||
873 | iter->idx++; | 902 | iter->idx++; |
874 | ring_buffer_read(iter->buffer_iter[iter->cpu], NULL); | 903 | if (iter->buffer_iter[iter->cpu]) |
904 | ring_buffer_read(iter->buffer_iter[iter->cpu], NULL); | ||
905 | |||
906 | ftrace_enable_cpu(); | ||
875 | } | 907 | } |
876 | 908 | ||
877 | static struct trace_entry * | 909 | static struct trace_entry * |
@@ -880,9 +912,19 @@ peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts) | |||
880 | struct ring_buffer_event *event; | 912 | struct ring_buffer_event *event; |
881 | struct ring_buffer_iter *buf_iter = iter->buffer_iter[cpu]; | 913 | struct ring_buffer_iter *buf_iter = iter->buffer_iter[cpu]; |
882 | 914 | ||
883 | event = ring_buffer_iter_peek(buf_iter, ts); | 915 | /* Don't allow ftrace to trace into the ring buffers */ |
916 | ftrace_disable_cpu(); | ||
917 | |||
918 | if (buf_iter) | ||
919 | event = ring_buffer_iter_peek(buf_iter, ts); | ||
920 | else | ||
921 | event = ring_buffer_peek(iter->tr->buffer, cpu, ts); | ||
922 | |||
923 | ftrace_enable_cpu(); | ||
924 | |||
884 | return event ? ring_buffer_event_data(event) : NULL; | 925 | return event ? ring_buffer_event_data(event) : NULL; |
885 | } | 926 | } |
927 | |||
886 | static struct trace_entry * | 928 | static struct trace_entry * |
887 | __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts) | 929 | __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts) |
888 | { | 930 | { |
@@ -938,7 +980,10 @@ static void *find_next_entry_inc(struct trace_iterator *iter) | |||
938 | 980 | ||
939 | static void trace_consume(struct trace_iterator *iter) | 981 | static void trace_consume(struct trace_iterator *iter) |
940 | { | 982 | { |
983 | /* Don't allow ftrace to trace into the ring buffers */ | ||
984 | ftrace_disable_cpu(); | ||
941 | ring_buffer_consume(iter->tr->buffer, iter->cpu, &iter->ts); | 985 | ring_buffer_consume(iter->tr->buffer, iter->cpu, &iter->ts); |
986 | ftrace_enable_cpu(); | ||
942 | } | 987 | } |
943 | 988 | ||
944 | static void *s_next(struct seq_file *m, void *v, loff_t *pos) | 989 | static void *s_next(struct seq_file *m, void *v, loff_t *pos) |
@@ -991,10 +1036,14 @@ static void *s_start(struct seq_file *m, loff_t *pos) | |||
991 | iter->cpu = 0; | 1036 | iter->cpu = 0; |
992 | iter->idx = -1; | 1037 | iter->idx = -1; |
993 | 1038 | ||
1039 | ftrace_disable_cpu(); | ||
1040 | |||
994 | for_each_tracing_cpu(cpu) { | 1041 | for_each_tracing_cpu(cpu) { |
995 | ring_buffer_iter_reset(iter->buffer_iter[cpu]); | 1042 | ring_buffer_iter_reset(iter->buffer_iter[cpu]); |
996 | } | 1043 | } |
997 | 1044 | ||
1045 | ftrace_enable_cpu(); | ||
1046 | |||
998 | for (p = iter; p && l < *pos; p = s_next(m, p, &l)) | 1047 | for (p = iter; p && l < *pos; p = s_next(m, p, &l)) |
999 | ; | 1048 | ; |
1000 | 1049 | ||
@@ -1242,7 +1291,16 @@ void trace_seq_print_cont(struct trace_seq *s, struct trace_iterator *iter) | |||
1242 | cont = (struct trace_field_cont *)ent; | 1291 | cont = (struct trace_field_cont *)ent; |
1243 | if (ok) | 1292 | if (ok) |
1244 | ok = (trace_seq_printf(s, "%s", cont->buf) > 0); | 1293 | ok = (trace_seq_printf(s, "%s", cont->buf) > 0); |
1245 | ring_buffer_read(iter->buffer_iter[iter->cpu], NULL); | 1294 | |
1295 | ftrace_disable_cpu(); | ||
1296 | |||
1297 | if (iter->buffer_iter[iter->cpu]) | ||
1298 | ring_buffer_read(iter->buffer_iter[iter->cpu], NULL); | ||
1299 | else | ||
1300 | ring_buffer_consume(iter->tr->buffer, iter->cpu, NULL); | ||
1301 | |||
1302 | ftrace_enable_cpu(); | ||
1303 | |||
1246 | ent = peek_next_entry(iter, iter->cpu, NULL); | 1304 | ent = peek_next_entry(iter, iter->cpu, NULL); |
1247 | } while (ent && ent->type == TRACE_CONT); | 1305 | } while (ent && ent->type == TRACE_CONT); |
1248 | 1306 | ||
@@ -1683,9 +1741,15 @@ static int trace_empty(struct trace_iterator *iter) | |||
1683 | int cpu; | 1741 | int cpu; |
1684 | 1742 | ||
1685 | for_each_tracing_cpu(cpu) { | 1743 | for_each_tracing_cpu(cpu) { |
1686 | if (!ring_buffer_iter_empty(iter->buffer_iter[cpu])) | 1744 | if (iter->buffer_iter[cpu]) { |
1687 | return 0; | 1745 | if (!ring_buffer_iter_empty(iter->buffer_iter[cpu])) |
1746 | return 0; | ||
1747 | } else { | ||
1748 | if (!ring_buffer_empty_cpu(iter->tr->buffer, cpu)) | ||
1749 | return 0; | ||
1750 | } | ||
1688 | } | 1751 | } |
1752 | |||
1689 | return TRACE_TYPE_HANDLED; | 1753 | return TRACE_TYPE_HANDLED; |
1690 | } | 1754 | } |
1691 | 1755 | ||
@@ -1776,8 +1840,10 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) | |||
1776 | iter->pos = -1; | 1840 | iter->pos = -1; |
1777 | 1841 | ||
1778 | for_each_tracing_cpu(cpu) { | 1842 | for_each_tracing_cpu(cpu) { |
1843 | |||
1779 | iter->buffer_iter[cpu] = | 1844 | iter->buffer_iter[cpu] = |
1780 | ring_buffer_read_start(iter->tr->buffer, cpu); | 1845 | ring_buffer_read_start(iter->tr->buffer, cpu); |
1846 | |||
1781 | if (!iter->buffer_iter[cpu]) | 1847 | if (!iter->buffer_iter[cpu]) |
1782 | goto fail_buffer; | 1848 | goto fail_buffer; |
1783 | } | 1849 | } |
@@ -2341,7 +2407,6 @@ static atomic_t tracing_reader; | |||
2341 | static int tracing_open_pipe(struct inode *inode, struct file *filp) | 2407 | static int tracing_open_pipe(struct inode *inode, struct file *filp) |
2342 | { | 2408 | { |
2343 | struct trace_iterator *iter; | 2409 | struct trace_iterator *iter; |
2344 | int cpu; | ||
2345 | 2410 | ||
2346 | if (tracing_disabled) | 2411 | if (tracing_disabled) |
2347 | return -ENODEV; | 2412 | return -ENODEV; |
@@ -2362,38 +2427,17 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp) | |||
2362 | iter->trace = current_trace; | 2427 | iter->trace = current_trace; |
2363 | filp->private_data = iter; | 2428 | filp->private_data = iter; |
2364 | 2429 | ||
2365 | for_each_tracing_cpu(cpu) { | ||
2366 | iter->buffer_iter[cpu] = | ||
2367 | ring_buffer_read_start(iter->tr->buffer, cpu); | ||
2368 | if (!iter->buffer_iter[cpu]) | ||
2369 | goto fail_buffer; | ||
2370 | } | ||
2371 | |||
2372 | if (iter->trace->pipe_open) | 2430 | if (iter->trace->pipe_open) |
2373 | iter->trace->pipe_open(iter); | 2431 | iter->trace->pipe_open(iter); |
2374 | mutex_unlock(&trace_types_lock); | 2432 | mutex_unlock(&trace_types_lock); |
2375 | 2433 | ||
2376 | return 0; | 2434 | return 0; |
2377 | |||
2378 | fail_buffer: | ||
2379 | for_each_tracing_cpu(cpu) { | ||
2380 | if (iter->buffer_iter[cpu]) | ||
2381 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | ||
2382 | } | ||
2383 | mutex_unlock(&trace_types_lock); | ||
2384 | |||
2385 | return -ENOMEM; | ||
2386 | } | 2435 | } |
2387 | 2436 | ||
2388 | static int tracing_release_pipe(struct inode *inode, struct file *file) | 2437 | static int tracing_release_pipe(struct inode *inode, struct file *file) |
2389 | { | 2438 | { |
2390 | struct trace_iterator *iter = file->private_data; | 2439 | struct trace_iterator *iter = file->private_data; |
2391 | int cpu; | ||
2392 | 2440 | ||
2393 | for_each_tracing_cpu(cpu) { | ||
2394 | if (iter->buffer_iter[cpu]) | ||
2395 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | ||
2396 | } | ||
2397 | kfree(iter); | 2441 | kfree(iter); |
2398 | atomic_dec(&tracing_reader); | 2442 | atomic_dec(&tracing_reader); |
2399 | 2443 | ||
@@ -2429,7 +2473,6 @@ tracing_read_pipe(struct file *filp, char __user *ubuf, | |||
2429 | size_t cnt, loff_t *ppos) | 2473 | size_t cnt, loff_t *ppos) |
2430 | { | 2474 | { |
2431 | struct trace_iterator *iter = filp->private_data; | 2475 | struct trace_iterator *iter = filp->private_data; |
2432 | unsigned long flags; | ||
2433 | #ifdef CONFIG_FTRACE | 2476 | #ifdef CONFIG_FTRACE |
2434 | int ftrace_save; | 2477 | int ftrace_save; |
2435 | #endif | 2478 | #endif |
@@ -2528,7 +2571,6 @@ waitagain: | |||
2528 | ftrace_enabled = 0; | 2571 | ftrace_enabled = 0; |
2529 | #endif | 2572 | #endif |
2530 | smp_wmb(); | 2573 | smp_wmb(); |
2531 | ring_buffer_lock(iter->tr->buffer, &flags); | ||
2532 | 2574 | ||
2533 | while (find_next_entry_inc(iter) != NULL) { | 2575 | while (find_next_entry_inc(iter) != NULL) { |
2534 | enum print_line_t ret; | 2576 | enum print_line_t ret; |
@@ -2547,7 +2589,6 @@ waitagain: | |||
2547 | break; | 2589 | break; |
2548 | } | 2590 | } |
2549 | 2591 | ||
2550 | ring_buffer_unlock(iter->tr->buffer, flags); | ||
2551 | #ifdef CONFIG_FTRACE | 2592 | #ifdef CONFIG_FTRACE |
2552 | ftrace_enabled = ftrace_save; | 2593 | ftrace_enabled = ftrace_save; |
2553 | #endif | 2594 | #endif |
@@ -3010,8 +3051,8 @@ void ftrace_dump(void) | |||
3010 | static struct trace_iterator iter; | 3051 | static struct trace_iterator iter; |
3011 | static cpumask_t mask; | 3052 | static cpumask_t mask; |
3012 | static int dump_ran; | 3053 | static int dump_ran; |
3013 | unsigned long flags, irq_flags; | 3054 | unsigned long flags; |
3014 | int cnt = 0; | 3055 | int cnt = 0, cpu; |
3015 | 3056 | ||
3016 | /* only one dump */ | 3057 | /* only one dump */ |
3017 | spin_lock_irqsave(&ftrace_dump_lock, flags); | 3058 | spin_lock_irqsave(&ftrace_dump_lock, flags); |
@@ -3023,6 +3064,10 @@ void ftrace_dump(void) | |||
3023 | /* No turning back! */ | 3064 | /* No turning back! */ |
3024 | ftrace_kill_atomic(); | 3065 | ftrace_kill_atomic(); |
3025 | 3066 | ||
3067 | for_each_tracing_cpu(cpu) { | ||
3068 | atomic_inc(&global_trace.data[cpu]->disabled); | ||
3069 | } | ||
3070 | |||
3026 | printk(KERN_TRACE "Dumping ftrace buffer:\n"); | 3071 | printk(KERN_TRACE "Dumping ftrace buffer:\n"); |
3027 | 3072 | ||
3028 | iter.tr = &global_trace; | 3073 | iter.tr = &global_trace; |
@@ -3037,8 +3082,6 @@ void ftrace_dump(void) | |||
3037 | 3082 | ||
3038 | cpus_clear(mask); | 3083 | cpus_clear(mask); |
3039 | 3084 | ||
3040 | ring_buffer_lock(iter.tr->buffer, &irq_flags); | ||
3041 | |||
3042 | while (!trace_empty(&iter)) { | 3085 | while (!trace_empty(&iter)) { |
3043 | 3086 | ||
3044 | if (!cnt) | 3087 | if (!cnt) |
@@ -3066,8 +3109,6 @@ void ftrace_dump(void) | |||
3066 | else | 3109 | else |
3067 | printk(KERN_TRACE "---------------------------------\n"); | 3110 | printk(KERN_TRACE "---------------------------------\n"); |
3068 | 3111 | ||
3069 | ring_buffer_unlock(iter.tr->buffer, irq_flags); | ||
3070 | |||
3071 | out: | 3112 | out: |
3072 | spin_unlock_irqrestore(&ftrace_dump_lock, flags); | 3113 | spin_unlock_irqrestore(&ftrace_dump_lock, flags); |
3073 | } | 3114 | } |