* [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes
@ 2010-05-25 16:12 Steven Rostedt
2010-05-25 16:13 ` [PATCH 1/2] ring-buffer: Reset "real_end" when page is filled Steven Rostedt
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Steven Rostedt @ 2010-05-25 16:12 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker
Ingo,
Please pull the latest tip/perf/core tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
tip/perf/core
Steven Rostedt (2):
ring-buffer: Reset "real_end" when page is filled
ring-buffer: Move zeroing out excess in page to ring buffer code
----
kernel/trace/ring_buffer.c | 19 +++++++++++++++++--
kernel/trace/trace.c | 6 ------
2 files changed, 17 insertions(+), 8 deletions(-)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] ring-buffer: Reset "real_end" when page is filled
2010-05-25 16:12 [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Steven Rostedt
@ 2010-05-25 16:13 ` Steven Rostedt
2010-05-25 16:13 ` [PATCH 2/2] ring-buffer: Move zeroing out excess in page to ring buffer code Steven Rostedt
2010-05-28 8:36 ` [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Ingo Molnar
2 siblings, 0 replies; 4+ messages in thread
From: Steven Rostedt @ 2010-05-25 16:13 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker
[-- Attachment #1: 0001-ring-buffer-Reset-real_end-when-page-is-filled.patch --]
[-- Type: text/plain, Size: 1361 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
The code to store the "lost events" requires knowing the real end
of the page. Since the 'commit' includes the padding at the end of
a page a "real_end" variable was used to keep track of the end not
including the padding.
If events were lost, the reader can place the count of events in
the padded area if there is enough room.
The bug this patch fixes is that when we fill the page we do not
reset the real_end variable, and if the writer had wrapped a few
times, the real_end would be incorrect.
This patch simply resets the real_end if the page was filled.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/ring_buffer.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 7f6059c..b0702ff 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -1768,6 +1768,14 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer,
* must fill the old tail_page with padding.
*/
if (tail >= BUF_PAGE_SIZE) {
+ /*
+ * If the page was filled, then we still need
+ * to update the real_end. Reset it to zero
+ * and the reader will ignore it.
+ */
+ if (tail == BUF_PAGE_SIZE)
+ tail_page->real_end = 0;
+
local_sub(length, &tail_page->write);
return;
}
--
1.7.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] ring-buffer: Move zeroing out excess in page to ring buffer code
2010-05-25 16:12 [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Steven Rostedt
2010-05-25 16:13 ` [PATCH 1/2] ring-buffer: Reset "real_end" when page is filled Steven Rostedt
@ 2010-05-25 16:13 ` Steven Rostedt
2010-05-28 8:36 ` [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Ingo Molnar
2 siblings, 0 replies; 4+ messages in thread
From: Steven Rostedt @ 2010-05-25 16:13 UTC (permalink / raw)
To: linux-kernel; +Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker
[-- Attachment #1: 0002-ring-buffer-Move-zeroing-out-excess-in-page-to-ring-.patch --]
[-- Type: text/plain, Size: 2574 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
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>
---
kernel/trace/ring_buffer.c | 11 +++++++++--
kernel/trace/trace.c | 6 ------
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index b0702ff..1da7b6e 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,
ret = read;
cpu_buffer->lost_events = 0;
+
+ commit = local_read(&bpage->commit);
/*
* Set a flag in the commit field if we lost events
*/
if (missed_events) {
- commit = local_read(&bpage->commit);
-
/* If there is room at the end of the page to save the
* missed events, then record it there.
*/
@@ -3915,10 +3915,17 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
memcpy(&bpage->data[commit], &missed_events,
sizeof(missed_events));
local_add(RB_MISSED_STORED, &bpage->commit);
+ commit += sizeof(missed_events);
}
local_add(RB_MISSED_EVENTS, &bpage->commit);
}
+ /*
+ * This page may be off to user land. Zero it out here.
+ */
+ if (commit < BUF_PAGE_SIZE)
+ memset(&bpage->data[commit], 0, BUF_PAGE_SIZE - commit);
+
out_unlock:
spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index ba0ec81..95d0b1a 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3661,7 +3661,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
size_t count, loff_t *ppos)
{
struct ftrace_buffer_info *info = filp->private_data;
- unsigned int pos;
ssize_t ret;
size_t size;
@@ -3688,11 +3687,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
if (ret < 0)
return 0;
- pos = ring_buffer_page_len(info->spare);
-
- if (pos < PAGE_SIZE)
- memset(info->spare + pos, 0, PAGE_SIZE - pos);
-
read:
size = PAGE_SIZE - info->read;
if (size > count)
--
1.7.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes
2010-05-25 16:12 [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Steven Rostedt
2010-05-25 16:13 ` [PATCH 1/2] ring-buffer: Reset "real_end" when page is filled Steven Rostedt
2010-05-25 16:13 ` [PATCH 2/2] ring-buffer: Move zeroing out excess in page to ring buffer code Steven Rostedt
@ 2010-05-28 8:36 ` Ingo Molnar
2 siblings, 0 replies; 4+ messages in thread
From: Ingo Molnar @ 2010-05-28 8:36 UTC (permalink / raw)
To: Steven Rostedt; +Cc: linux-kernel, Andrew Morton, Frederic Weisbecker
* Steven Rostedt <rostedt@goodmis.org> wrote:
> Ingo,
>
> Please pull the latest tip/perf/core tree, which can be found at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
> tip/perf/core
>
>
> Steven Rostedt (2):
> ring-buffer: Reset "real_end" when page is filled
> ring-buffer: Move zeroing out excess in page to ring buffer code
>
> ----
> kernel/trace/ring_buffer.c | 19 +++++++++++++++++--
> kernel/trace/trace.c | 6 ------
> 2 files changed, 17 insertions(+), 8 deletions(-)
Pulled, thanks a lot Steve!
Ingo
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-28 8:36 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-25 16:12 [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Steven Rostedt
2010-05-25 16:13 ` [PATCH 1/2] ring-buffer: Reset "real_end" when page is filled Steven Rostedt
2010-05-25 16:13 ` [PATCH 2/2] ring-buffer: Move zeroing out excess in page to ring buffer code Steven Rostedt
2010-05-28 8:36 ` [PATCH 0/2] [GIT PULL] ring-buffer: Some minor fixes for the latest changes Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome