Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
Linus Torvalds [Sun, 30 May 2010 19:35:01 +0000 (12:35 -0700)]
* '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

kernel/trace/ring_buffer.c
kernel/trace/trace.c
tools/perf/builtin-annotate.c
tools/perf/builtin-top.c
tools/perf/util/debug.c
tools/perf/util/newt.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index 7f6059c..1da7b6e 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 55e4851..086d363 100644 (file)
@@ -3666,7 +3666,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;
 
@@ -3693,11 +3692,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)
index 08278ed..96db524 100644 (file)
@@ -343,7 +343,7 @@ find_next:
                        continue;
                }
 
-               if (use_browser) {
+               if (use_browser > 0) {
                        key = hist_entry__tui_annotate(he);
                        if (is_exit_key(key))
                                break;
index 397290a..a66f427 100644 (file)
@@ -1060,7 +1060,7 @@ static void event__process_sample(const event_t *self,
                        pr_err("Can't annotate %s", sym->name);
                        if (sym_filter_entry->map->dso->origin == DSO__ORIG_KERNEL) {
                                pr_err(": No vmlinux file was found in the path:\n");
-                               vmlinux_path__fprintf(stderr);
+                               machine__fprintf_vmlinux_path(machine, stderr);
                        } else
                                pr_err(".\n");
                        exit(1);
index dd824cf..6cddff2 100644 (file)
@@ -22,7 +22,7 @@ int eprintf(int level, const char *fmt, ...)
 
        if (verbose >= level) {
                va_start(args, fmt);
-               if (use_browser)
+               if (use_browser > 0)
                        ret = browser__show_help(fmt, args);
                else
                        ret = vfprintf(stderr, fmt, args);
index d54c540..cf182ca 100644 (file)
@@ -1139,6 +1139,7 @@ void setup_browser(void)
        struct newtPercentTreeColors *c = &defaultPercentTreeColors;
 
        if (!isatty(1) || !use_browser || dump_trace) {
+               use_browser = 0;
                setup_pager();
                return;
        }
index aaa51ba..7fd6b15 100644 (file)
@@ -1695,9 +1695,20 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map,
                           symbol_filter_t filter)
 {
        int i, err = 0;
+       char *filename;
 
        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) {
                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;
                }
        }
-
+out:
        return err;
 }
 
@@ -2102,13 +2113,21 @@ out_fail:
        return -1;
 }
 
-size_t vmlinux_path__fprintf(FILE *fp)
+size_t machine__fprintf_vmlinux_path(struct machine *self, FILE *fp)
 {
        int i;
        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)
-               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;
 }
index 5d25b5e..5e02d2c 100644 (file)
@@ -216,6 +216,6 @@ int machines__create_guest_kernel_maps(struct rb_root *self);
 int symbol__init(void);
 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 */