Commit bc7d352c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'perf-fixes-for-linus' of...

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
parents b3f2f6cd 92af1abd
...@@ -1768,6 +1768,14 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, ...@@ -1768,6 +1768,14 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer,
* must fill the old tail_page with padding. * must fill the old tail_page with padding.
*/ */
if (tail >= BUF_PAGE_SIZE) { 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); local_sub(length, &tail_page->write);
return; return;
} }
...@@ -3894,12 +3902,12 @@ int ring_buffer_read_page(struct ring_buffer *buffer, ...@@ -3894,12 +3902,12 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
ret = read; ret = read;
cpu_buffer->lost_events = 0; cpu_buffer->lost_events = 0;
commit = local_read(&bpage->commit);
/* /*
* Set a flag in the commit field if we lost events * Set a flag in the commit field if we lost events
*/ */
if (missed_events) { if (missed_events) {
commit = local_read(&bpage->commit);
/* If there is room at the end of the page to save the /* If there is room at the end of the page to save the
* missed events, then record it there. * missed events, then record it there.
*/ */
...@@ -3907,10 +3915,17 @@ int ring_buffer_read_page(struct ring_buffer *buffer, ...@@ -3907,10 +3915,17 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
memcpy(&bpage->data[commit], &missed_events, memcpy(&bpage->data[commit], &missed_events,
sizeof(missed_events)); sizeof(missed_events));
local_add(RB_MISSED_STORED, &bpage->commit); local_add(RB_MISSED_STORED, &bpage->commit);
commit += sizeof(missed_events);
} }
local_add(RB_MISSED_EVENTS, &bpage->commit); 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: out_unlock:
spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
......
...@@ -3666,7 +3666,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, ...@@ -3666,7 +3666,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ftrace_buffer_info *info = filp->private_data; struct ftrace_buffer_info *info = filp->private_data;
unsigned int pos;
ssize_t ret; ssize_t ret;
size_t size; size_t size;
...@@ -3693,11 +3692,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, ...@@ -3693,11 +3692,6 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
if (ret < 0) if (ret < 0)
return 0; return 0;
pos = ring_buffer_page_len(info->spare);
if (pos < PAGE_SIZE)
memset(info->spare + pos, 0, PAGE_SIZE - pos);
read: read:
size = PAGE_SIZE - info->read; size = PAGE_SIZE - info->read;
if (size > count) if (size > count)
......
...@@ -343,7 +343,7 @@ static void hists__find_annotations(struct hists *self) ...@@ -343,7 +343,7 @@ static void hists__find_annotations(struct hists *self)
continue; continue;
} }
if (use_browser) { if (use_browser > 0) {
key = hist_entry__tui_annotate(he); key = hist_entry__tui_annotate(he);
if (is_exit_key(key)) if (is_exit_key(key))
break; break;
......
...@@ -1060,7 +1060,7 @@ static void event__process_sample(const event_t *self, ...@@ -1060,7 +1060,7 @@ static void event__process_sample(const event_t *self,
pr_err("Can't annotate %s", sym->name); pr_err("Can't annotate %s", sym->name);
if (sym_filter_entry->map->dso->origin == DSO__ORIG_KERNEL) { if (sym_filter_entry->map->dso->origin == DSO__ORIG_KERNEL) {
pr_err(": No vmlinux file was found in the path:\n"); pr_err(": No vmlinux file was found in the path:\n");
vmlinux_path__fprintf(stderr); machine__fprintf_vmlinux_path(machine, stderr);
} else } else
pr_err(".\n"); pr_err(".\n");
exit(1); exit(1);
......
...@@ -22,7 +22,7 @@ int eprintf(int level, const char *fmt, ...) ...@@ -22,7 +22,7 @@ int eprintf(int level, const char *fmt, ...)
if (verbose >= level) { if (verbose >= level) {
va_start(args, fmt); va_start(args, fmt);
if (use_browser) if (use_browser > 0)
ret = browser__show_help(fmt, args); ret = browser__show_help(fmt, args);
else else
ret = vfprintf(stderr, fmt, args); ret = vfprintf(stderr, fmt, args);
......
...@@ -1139,6 +1139,7 @@ void setup_browser(void) ...@@ -1139,6 +1139,7 @@ void setup_browser(void)
struct newtPercentTreeColors *c = &defaultPercentTreeColors; struct newtPercentTreeColors *c = &defaultPercentTreeColors;
if (!isatty(1) || !use_browser || dump_trace) { if (!isatty(1) || !use_browser || dump_trace) {
use_browser = 0;
setup_pager(); setup_pager();
return; return;
} }
......
...@@ -1695,9 +1695,20 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map, ...@@ -1695,9 +1695,20 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map,
symbol_filter_t filter) symbol_filter_t filter)
{ {
int i, err = 0; int i, err = 0;
char *filename;
pr_debug("Looking at the vmlinux_path (%d entries long)\n", pr_debug("Looking at the vmlinux_path (%d entries long)\n",
vmlinux_path__nr_entries); vmlinux_path__nr_entries + 1);
filename = dso__build_id_filename(self, NULL, 0);
if (filename != NULL) {
err = dso__load_vmlinux(self, map, filename, filter);
if (err > 0) {
dso__set_long_name(self, filename);
goto out;
}
free(filename);
}
for (i = 0; i < vmlinux_path__nr_entries; ++i) { for (i = 0; i < vmlinux_path__nr_entries; ++i) {
err = dso__load_vmlinux(self, map, vmlinux_path[i], filter); err = dso__load_vmlinux(self, map, vmlinux_path[i], filter);
...@@ -1706,7 +1717,7 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map, ...@@ -1706,7 +1717,7 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map,
break; break;
} }
} }
out:
return err; return err;
} }
...@@ -2102,13 +2113,21 @@ static int vmlinux_path__init(void) ...@@ -2102,13 +2113,21 @@ static int vmlinux_path__init(void)
return -1; return -1;
} }
size_t vmlinux_path__fprintf(FILE *fp) size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp)
{ {
int i; int i;
size_t printed = 0; size_t printed = 0;
struct dso *kdso = self->vmlinux_maps[MAP__FUNCTION]->dso;
if (kdso->has_build_id) {
char filename[PATH_MAX];
if (dso__build_id_filename(kdso, filename, sizeof(filename)))
printed += fprintf(fp, "[0] %s\n", filename);
}
for (i = 0; i < vmlinux_path__nr_entries; ++i) for (i = 0; i < vmlinux_path__nr_entries; ++i)
printed += fprintf(fp, "[%d] %s\n", i, vmlinux_path[i]); printed += fprintf(fp, "[%d] %s\n",
i + kdso->has_build_id, vmlinux_path[i]);
return printed; return printed;
} }
......
...@@ -216,6 +216,6 @@ int machines__create_guest_kernel_maps(struct rb_root *self); ...@@ -216,6 +216,6 @@ int machines__create_guest_kernel_maps(struct rb_root *self);
int symbol__init(void); int symbol__init(void);
bool symbol_type__is_a(char symbol_type, enum map_type map_type); bool symbol_type__is_a(char symbol_type, enum map_type map_type);
size_t vmlinux_path__fprintf(FILE *fp); size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp);
#endif /* __PERF_SYMBOL */ #endif /* __PERF_SYMBOL */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment