Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
authorIngo Molnar <mingo@elte.hu>
Fri, 28 May 2010 08:24:03 +0000 (10:24 +0200)
committerIngo Molnar <mingo@elte.hu>
Sat, 29 May 2010 09:30:30 +0000 (11:30 +0200)
kernel/trace/ring_buffer.c
kernel/trace/trace.c

index 7f6059c5aa94c772ba6ad9785c40838f96bbc77f..1da7b6ea8b85d70dde15b50369202cb68acab0bf 100644 (file)
@@ -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;
        }
@@ -3894,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.
                 */
@@ -3907,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);
 
index ba0ec81158b268fc1d0d0fd1314a04d796d838e1..95d0b1a28f93848a0ff5beaf667faeb9e4892062 100644 (file)
@@ -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)