diff options
| -rw-r--r-- | kernel/trace/ring_buffer.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index d673ef03d16d..e0573c523b5c 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -1599,6 +1599,29 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, | |||
| 1599 | } | 1599 | } |
| 1600 | 1600 | ||
| 1601 | out: | 1601 | out: |
| 1602 | /* | ||
| 1603 | * The ring buffer resize can happen with the ring buffer | ||
| 1604 | * enabled, so that the update disturbs the tracing as little | ||
| 1605 | * as possible. But if the buffer is disabled, we do not need | ||
| 1606 | * to worry about that, and we can take the time to verify | ||
| 1607 | * that the buffer is not corrupt. | ||
| 1608 | */ | ||
| 1609 | if (atomic_read(&buffer->record_disabled)) { | ||
| 1610 | atomic_inc(&buffer->record_disabled); | ||
| 1611 | /* | ||
| 1612 | * Even though the buffer was disabled, we must make sure | ||
| 1613 | * that it is truly disabled before calling rb_check_pages. | ||
| 1614 | * There could have been a race between checking | ||
| 1615 | * record_disable and incrementing it. | ||
| 1616 | */ | ||
| 1617 | synchronize_sched(); | ||
| 1618 | for_each_buffer_cpu(buffer, cpu) { | ||
| 1619 | cpu_buffer = buffer->buffers[cpu]; | ||
| 1620 | rb_check_pages(cpu_buffer); | ||
| 1621 | } | ||
| 1622 | atomic_dec(&buffer->record_disabled); | ||
| 1623 | } | ||
| 1624 | |||
| 1602 | mutex_unlock(&buffer->mutex); | 1625 | mutex_unlock(&buffer->mutex); |
| 1603 | return size; | 1626 | return size; |
| 1604 | 1627 | ||
| @@ -3750,6 +3773,12 @@ ring_buffer_read_finish(struct ring_buffer_iter *iter) | |||
| 3750 | { | 3773 | { |
| 3751 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; | 3774 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; |
| 3752 | 3775 | ||
| 3776 | /* | ||
| 3777 | * Ring buffer is disabled from recording, here's a good place | ||
| 3778 | * to check the integrity of the ring buffer. | ||
| 3779 | */ | ||
| 3780 | rb_check_pages(cpu_buffer); | ||
| 3781 | |||
| 3753 | atomic_dec(&cpu_buffer->record_disabled); | 3782 | atomic_dec(&cpu_buffer->record_disabled); |
| 3754 | atomic_dec(&cpu_buffer->buffer->resize_disabled); | 3783 | atomic_dec(&cpu_buffer->buffer->resize_disabled); |
| 3755 | kfree(iter); | 3784 | kfree(iter); |
