diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
-rw-r--r-- | kernel/trace/ring_buffer.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index e06cde093f76..9ab18995ff1e 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -4404,8 +4404,13 @@ void ring_buffer_free_read_page(struct ring_buffer *buffer, int cpu, void *data) | |||
4404 | { | 4404 | { |
4405 | struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; | 4405 | struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; |
4406 | struct buffer_data_page *bpage = data; | 4406 | struct buffer_data_page *bpage = data; |
4407 | struct page *page = virt_to_page(bpage); | ||
4407 | unsigned long flags; | 4408 | unsigned long flags; |
4408 | 4409 | ||
4410 | /* If the page is still in use someplace else, we can't reuse it */ | ||
4411 | if (page_ref_count(page) > 1) | ||
4412 | goto out; | ||
4413 | |||
4409 | local_irq_save(flags); | 4414 | local_irq_save(flags); |
4410 | arch_spin_lock(&cpu_buffer->lock); | 4415 | arch_spin_lock(&cpu_buffer->lock); |
4411 | 4416 | ||
@@ -4417,6 +4422,7 @@ void ring_buffer_free_read_page(struct ring_buffer *buffer, int cpu, void *data) | |||
4417 | arch_spin_unlock(&cpu_buffer->lock); | 4422 | arch_spin_unlock(&cpu_buffer->lock); |
4418 | local_irq_restore(flags); | 4423 | local_irq_restore(flags); |
4419 | 4424 | ||
4425 | out: | ||
4420 | free_page((unsigned long)bpage); | 4426 | free_page((unsigned long)bpage); |
4421 | } | 4427 | } |
4422 | EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); | 4428 | EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); |