diff options
| -rw-r--r-- | kernel/trace/ring_buffer.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index edefe3b2801b..503b630e0bda 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -464,6 +464,8 @@ struct ring_buffer_iter { | |||
| 464 | struct ring_buffer_per_cpu *cpu_buffer; | 464 | struct ring_buffer_per_cpu *cpu_buffer; |
| 465 | unsigned long head; | 465 | unsigned long head; |
| 466 | struct buffer_page *head_page; | 466 | struct buffer_page *head_page; |
| 467 | struct buffer_page *cache_reader_page; | ||
| 468 | unsigned long cache_read; | ||
| 467 | u64 read_stamp; | 469 | u64 read_stamp; |
| 468 | }; | 470 | }; |
| 469 | 471 | ||
| @@ -2716,6 +2718,8 @@ static void rb_iter_reset(struct ring_buffer_iter *iter) | |||
| 2716 | iter->read_stamp = cpu_buffer->read_stamp; | 2718 | iter->read_stamp = cpu_buffer->read_stamp; |
| 2717 | else | 2719 | else |
| 2718 | iter->read_stamp = iter->head_page->page->time_stamp; | 2720 | iter->read_stamp = iter->head_page->page->time_stamp; |
| 2721 | iter->cache_reader_page = cpu_buffer->reader_page; | ||
| 2722 | iter->cache_read = cpu_buffer->read; | ||
| 2719 | } | 2723 | } |
| 2720 | 2724 | ||
| 2721 | /** | 2725 | /** |
| @@ -3066,6 +3070,15 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts) | |||
| 3066 | cpu_buffer = iter->cpu_buffer; | 3070 | cpu_buffer = iter->cpu_buffer; |
| 3067 | buffer = cpu_buffer->buffer; | 3071 | buffer = cpu_buffer->buffer; |
| 3068 | 3072 | ||
| 3073 | /* | ||
| 3074 | * Check if someone performed a consuming read to | ||
| 3075 | * the buffer. A consuming read invalidates the iterator | ||
| 3076 | * and we need to reset the iterator in this case. | ||
| 3077 | */ | ||
| 3078 | if (unlikely(iter->cache_read != cpu_buffer->read || | ||
| 3079 | iter->cache_reader_page != cpu_buffer->reader_page)) | ||
| 3080 | rb_iter_reset(iter); | ||
| 3081 | |||
| 3069 | again: | 3082 | again: |
| 3070 | /* | 3083 | /* |
| 3071 | * We repeat when a timestamp is encountered. | 3084 | * We repeat when a timestamp is encountered. |
