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
This commit is contained in:
commit
bc7d352c5e
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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 @@ find_next:
|
||||||
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,
|
||||||
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, ...)
|
||||||
|
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2102,13 +2113,21 @@ out_fail:
|
||||||
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);
|
||||||
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 */
|
||||||
|
|
Loading…
Reference in New Issue