diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 15:35:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-30 15:35:01 -0400 |
commit | bc7d352c5e76c74c628a39b99777a1bdddde5e81 (patch) | |
tree | 3cc0a80defb54d284e2a9a1e69b1224064921775 /kernel | |
parent | b3f2f6cd1ff935ecac9a5346904b899d7af689fe (diff) | |
parent | 92af1abde4f2d74c9e5f7b670a1971779ed0b051 (diff) |
Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
perf tui: Fix last use_browser problem related to .perfconfig
perf symbols: Add the build id cache to the vmlinux path
perf tui: Reset use_browser if stdout is not a tty
ring-buffer: Move zeroing out excess in page to ring buffer code
ring-buffer: Reset "real_end" when page is filled
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ring_buffer.c | 19 | ||||
-rw-r--r-- | kernel/trace/trace.c | 6 |
2 files changed, 17 insertions, 8 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 7f6059c5aa94..1da7b6ea8b85 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, | |||
1768 | * must fill the old tail_page with padding. | 1768 | * must fill the old tail_page with padding. |
1769 | */ | 1769 | */ |
1770 | if (tail >= BUF_PAGE_SIZE) { | 1770 | if (tail >= BUF_PAGE_SIZE) { |
1771 | /* | ||
1772 | * If the page was filled, then we still need | ||
1773 | * to update the real_end. Reset it to zero | ||
1774 | * and the reader will ignore it. | ||
1775 | */ | ||
1776 | if (tail == BUF_PAGE_SIZE) | ||
1777 | tail_page->real_end = 0; | ||
1778 | |||
1771 | local_sub(length, &tail_page->write); | 1779 | local_sub(length, &tail_page->write); |
1772 | return; | 1780 | return; |
1773 | } | 1781 | } |
@@ -3894,12 +3902,12 @@ int ring_buffer_read_page(struct ring_buffer *buffer, | |||
3894 | ret = read; | 3902 | ret = read; |
3895 | 3903 | ||
3896 | cpu_buffer->lost_events = 0; | 3904 | cpu_buffer->lost_events = 0; |
3905 | |||
3906 | commit = local_read(&bpage->commit); | ||
3897 | /* | 3907 | /* |
3898 | * Set a flag in the commit field if we lost events | 3908 | * Set a flag in the commit field if we lost events |
3899 | */ | 3909 | */ |
3900 | if (missed_events) { | 3910 | if (missed_events) { |
3901 | commit = local_read(&bpage->commit); | ||
3902 | |||
3903 | /* 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 |
3904 | * missed events, then record it there. | 3912 | * missed events, then record it there. |
3905 | */ | 3913 | */ |
@@ -3907,10 +3915,17 @@ int ring_buffer_read_page(struct ring_buffer *buffer, | |||
3907 | memcpy(&bpage->data[commit], &missed_events, | 3915 | memcpy(&bpage->data[commit], &missed_events, |
3908 | sizeof(missed_events)); | 3916 | sizeof(missed_events)); |
3909 | local_add(RB_MISSED_STORED, &bpage->commit); | 3917 | local_add(RB_MISSED_STORED, &bpage->commit); |
3918 | commit += sizeof(missed_events); | ||
3910 | } | 3919 | } |
3911 | local_add(RB_MISSED_EVENTS, &bpage->commit); | 3920 | local_add(RB_MISSED_EVENTS, &bpage->commit); |
3912 | } | 3921 | } |
3913 | 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 | |||
3914 | out_unlock: | 3929 | out_unlock: |
3915 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | 3930 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |
3916 | 3931 | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 55e48511d7c8..086d36316805 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -3666,7 +3666,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | |||
3666 | size_t count, loff_t *ppos) | 3666 | size_t count, loff_t *ppos) |
3667 | { | 3667 | { |
3668 | struct ftrace_buffer_info *info = filp->private_data; | 3668 | struct ftrace_buffer_info *info = filp->private_data; |
3669 | unsigned int pos; | ||
3670 | ssize_t ret; | 3669 | ssize_t ret; |
3671 | size_t size; | 3670 | size_t size; |
3672 | 3671 | ||
@@ -3693,11 +3692,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, | |||
3693 | if (ret < 0) | 3692 | if (ret < 0) |
3694 | return 0; | 3693 | return 0; |
3695 | 3694 | ||
3696 | pos = ring_buffer_page_len(info->spare); | ||
3697 | |||
3698 | if (pos < PAGE_SIZE) | ||
3699 | memset(info->spare + pos, 0, PAGE_SIZE - pos); | ||
3700 | |||
3701 | read: | 3695 | read: |
3702 | size = PAGE_SIZE - info->read; | 3696 | size = PAGE_SIZE - info->read; |
3703 | if (size > count) | 3697 | if (size > count) |