tracing: only add splice page if entries exist

The splice code allocates a page even when the ring buffer is empty.
It detects the ring buffer being empty when it it fails to copy
anything from the ring buffer into the page.

This patch adds a check to see if there is anything in the ring buffer
before allocating a page.

Thanks to logdev for letting me trace the tracer to find this.

[ Impact: speed up due to removing unnecessary allocation ]

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Steven Rostedt 2009-04-29 00:23:13 -04:00 committed by Steven Rostedt
parent 5beae6efd1
commit 93459c6cb9
1 changed files with 6 additions and 2 deletions

View File

@ -3508,7 +3508,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
.spd_release = buffer_spd_release, .spd_release = buffer_spd_release,
}; };
struct buffer_ref *ref; struct buffer_ref *ref;
int size, i; int entries, size, i;
size_t ret; size_t ret;
if (*ppos & (PAGE_SIZE - 1)) { if (*ppos & (PAGE_SIZE - 1)) {
@ -3523,7 +3523,9 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
len &= PAGE_MASK; len &= PAGE_MASK;
} }
for (i = 0; i < PIPE_BUFFERS && len; i++, len -= PAGE_SIZE) { entries = ring_buffer_entries_cpu(info->tr->buffer, info->cpu);
for (i = 0; i < PIPE_BUFFERS && len && entries; i++, len -= PAGE_SIZE) {
struct page *page; struct page *page;
int r; int r;
@ -3564,6 +3566,8 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
spd.partial[i].private = (unsigned long)ref; spd.partial[i].private = (unsigned long)ref;
spd.nr_pages++; spd.nr_pages++;
*ppos += PAGE_SIZE; *ppos += PAGE_SIZE;
entries = ring_buffer_entries_cpu(info->tr->buffer, info->cpu);
} }
spd.nr_pages = i; spd.nr_pages = i;