aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-05-21 13:32:26 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-05-25 11:57:26 -0400
commit2711ca237a084286ea1c2dcf82ab2aadab23a00d (patch)
treea795fa0e31e8557befd803153a33827b1d0c8764
parentb3230c8b44da5838cf396942d5c1ab19f8e8f720 (diff)
ring-buffer: Move zeroing out excess in page to ring buffer code
Currently the trace splice code zeros out the excess bytes in the page before sending it off to userspace. This is to make sure userspace is not getting anything it should not be when reading the pages, because the excess data was never initialized to zero before writing (for perfomance reasons). But the splice code has no business in doing this work, it should be done by the ring buffer. With the latest changes for recording lost events, the splice code gets it wrong anyway. Move the zeroing out of excess bytes into the ring buffer code. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel/trace/ring_buffer.c11
-rw-r--r--kernel/trace/trace.c6
2 files changed, 9 insertions, 8 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index b0702ff78218..1da7b6ea8b85 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3902,12 +3902,12 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
3902 ret = read; 3902 ret = read;
3903 3903
3904 cpu_buffer->lost_events = 0; 3904 cpu_buffer->lost_events = 0;
3905
3906 commit = local_read(&bpage->commit);
3905 /* 3907 /*
3906 * Set a flag in the commit field if we lost events 3908 * Set a flag in the commit field if we lost events
3907 */ 3909 */
3908 if (missed_events) { 3910 if (missed_events) {
3909 commit = local_read(&bpage->commit);
3910
3911 /* If there is room at the end of the page to save the 3911 /* If there is room at the end of the page to save the
3912 * missed events, then record it there. 3912 * missed events, then record it there.
3913 */ 3913 */
@@ -3915,10 +3915,17 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
3915 memcpy(&bpage->data[commit], &missed_events, 3915 memcpy(&bpage->data[commit], &missed_events,
3916 sizeof(missed_events)); 3916 sizeof(missed_events));
3917 local_add(RB_MISSED_STORED, &bpage->commit); 3917 local_add(RB_MISSED_STORED, &bpage->commit);
3918 commit += sizeof(missed_events);
3918 } 3919 }
3919 local_add(RB_MISSED_EVENTS, &bpage->commit); 3920 local_add(RB_MISSED_EVENTS, &bpage->commit);
3920 } 3921 }
3921 3922
3923 /*
3924 * This page may be off to user land. Zero it out here.
3925 */
3926 if (commit < BUF_PAGE_SIZE)
3927 memset(&bpage->data[commit], 0, BUF_PAGE_SIZE - commit);
3928
3922 out_unlock: 3929 out_unlock:
3923 spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); 3930 spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
3924 3931
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index ba0ec81158b2..95d0b1a28f93 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3661,7 +3661,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
3661 size_t count, loff_t *ppos) 3661 size_t count, loff_t *ppos)
3662{ 3662{
3663 struct ftrace_buffer_info *info = filp->private_data; 3663 struct ftrace_buffer_info *info = filp->private_data;
3664 unsigned int pos;
3665 ssize_t ret; 3664 ssize_t ret;
3666 size_t size; 3665 size_t size;
3667 3666
@@ -3688,11 +3687,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
3688 if (ret < 0) 3687 if (ret < 0)
3689 return 0; 3688 return 0;
3690 3689
3691 pos = ring_buffer_page_len(info->spare);
3692
3693 if (pos < PAGE_SIZE)
3694 memset(info->spare + pos, 0, PAGE_SIZE - pos);
3695
3696read: 3690read:
3697 size = PAGE_SIZE - info->read; 3691 size = PAGE_SIZE - info->read;
3698 if (size > count) 3692 if (size > count)