perf symbols: Add nr_events to symbol_conf
authorArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 12 Nov 2011 00:17:32 +0000 (22:17 -0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 28 Nov 2011 12:37:11 +0000 (10:37 -0200)
Since symbol__alloc_hists need it, to avoid passing it around in many
functions have it in the symbol_conf struct.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-cwv8ysvpywzjq4v3xtbd4zwv@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-annotate.c
tools/perf/builtin-report.c
tools/perf/builtin-top.c
tools/perf/util/annotate.c
tools/perf/util/annotate.h
tools/perf/util/header.c
tools/perf/util/hist.h
tools/perf/util/symbol.h
tools/perf/util/ui/browsers/annotate.c
tools/perf/util/ui/browsers/hists.c

index 46b4c24f338ef4fe51e98a30d7f60f6b9e1010bb..8b9091bce98da5b3755ec7ddf18c93c45692016b 100644 (file)
@@ -43,10 +43,9 @@ static const char *sym_hist_filter;
 static const char      *cpu_list;
 static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
 
-static int perf_evlist__add_sample(struct perf_evlist *evlist,
-                                  struct perf_sample *sample,
-                                  struct perf_evsel *evsel,
-                                  struct addr_location *al)
+static int perf_evsel__add_sample(struct perf_evsel *evsel,
+                                 struct perf_sample *sample,
+                                 struct addr_location *al)
 {
        struct hist_entry *he;
        int ret;
@@ -69,8 +68,7 @@ static int perf_evlist__add_sample(struct perf_evlist *evlist,
        ret = 0;
        if (he->ms.sym != NULL) {
                struct annotation *notes = symbol__annotation(he->ms.sym);
-               if (notes->src == NULL &&
-                   symbol__alloc_hist(he->ms.sym, evlist->nr_entries) < 0)
+               if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0)
                        return -ENOMEM;
 
                ret = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
@@ -98,8 +96,7 @@ static int process_sample_event(union perf_event *event,
        if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
                return 0;
 
-       if (!al.filtered &&
-           perf_evlist__add_sample(session->evlist, sample, evsel, &al)) {
+       if (!al.filtered && perf_evsel__add_sample(evsel, sample, &al)) {
                pr_warning("problem incrementing symbol count, "
                           "skipping event\n");
                return -1;
@@ -114,8 +111,7 @@ static int hist_entry__tty_annotate(struct hist_entry *he, int evidx)
                                    print_line, full_paths, 0, 0);
 }
 
-static void hists__find_annotations(struct hists *self, int evidx,
-                                   int nr_events)
+static void hists__find_annotations(struct hists *self, int evidx)
 {
        struct rb_node *nd = rb_first(&self->entries), *next;
        int key = K_RIGHT;
@@ -138,8 +134,7 @@ find_next:
                }
 
                if (use_browser > 0) {
-                       key = hist_entry__tui_annotate(he, evidx, nr_events,
-                                                      NULL, NULL, 0);
+                       key = hist_entry__tui_annotate(he, evidx, NULL, NULL, 0);
                        switch (key) {
                        case K_RIGHT:
                                next = rb_next(nd);
@@ -217,8 +212,7 @@ static int __cmd_annotate(void)
                        total_nr_samples += nr_samples;
                        hists__collapse_resort(hists);
                        hists__output_resort(hists);
-                       hists__find_annotations(hists, pos->idx,
-                                               session->evlist->nr_entries);
+                       hists__find_annotations(hists, pos->idx);
                }
        }
 
index 4d7c8340c3267c82cca1b1a266f36b8ed3c1b793..758a287fc07acbfac4fc5116d9a27698e6e9747c 100644 (file)
@@ -92,8 +92,7 @@ static int perf_session__add_hist_entry(struct perf_session *session,
                assert(evsel != NULL);
 
                err = -ENOMEM;
-               if (notes->src == NULL &&
-                   symbol__alloc_hist(he->ms.sym, session->evlist->nr_entries) < 0)
+               if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0)
                        goto out;
 
                err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
index c9cdedb581348aa158677b28f6465734abcb50d4..04288ee223eda894682f1ed1d72d1fd8c9ddbdac 100644 (file)
@@ -170,7 +170,7 @@ static int parse_source(struct hist_entry *he)
 
        pthread_mutex_lock(&notes->lock);
 
-       if (symbol__alloc_hist(sym, top.evlist->nr_entries) < 0) {
+       if (symbol__alloc_hist(sym) < 0) {
                pthread_mutex_unlock(&notes->lock);
                pr_err("Not enough memory for annotating '%s' symbol!\n",
                       sym->name);
@@ -210,8 +210,7 @@ static void record_precise_ip(struct hist_entry *he, int counter, u64 ip)
        if (pthread_mutex_trylock(&notes->lock))
                return;
 
-       if (notes->src == NULL &&
-           symbol__alloc_hist(sym, top.evlist->nr_entries) < 0) {
+       if (notes->src == NULL && symbol__alloc_hist(sym) < 0) {
                pthread_mutex_unlock(&notes->lock);
                pr_err("Not enough memory for annotating '%s' symbol!\n",
                       sym->name);
@@ -1215,6 +1214,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
                return -ENOMEM;
        }
 
+       symbol_conf.nr_events = top.evlist->nr_entries;
+
        if (top.delay_secs < 1)
                top.delay_secs = 1;
 
index 119e996035c8f0e8ef529ba0e195f93f7cc79396..376e643f70666fcf2f86feeb22989f155cacc0ae 100644 (file)
@@ -25,17 +25,17 @@ int symbol__annotate_init(struct map *map __used, struct symbol *sym)
        return 0;
 }
 
-int symbol__alloc_hist(struct symbol *sym, int nevents)
+int symbol__alloc_hist(struct symbol *sym)
 {
        struct annotation *notes = symbol__annotation(sym);
        size_t sizeof_sym_hist = (sizeof(struct sym_hist) +
                                  (sym->end - sym->start) * sizeof(u64));
 
-       notes->src = zalloc(sizeof(*notes->src) + nevents * sizeof_sym_hist);
+       notes->src = zalloc(sizeof(*notes->src) + symbol_conf.nr_events * sizeof_sym_hist);
        if (notes->src == NULL)
                return -1;
        notes->src->sizeof_sym_hist = sizeof_sym_hist;
-       notes->src->nr_histograms   = nevents;
+       notes->src->nr_histograms   = symbol_conf.nr_events;
        INIT_LIST_HEAD(&notes->src->source);
        return 0;
 }
index d9072523d342d293bc4d40a114bb42db637b998c..efa5dc82bfaef4545904cd9c70b51c2007dcd5b6 100644 (file)
@@ -72,7 +72,7 @@ static inline struct annotation *symbol__annotation(struct symbol *sym)
 
 int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
                             int evidx, u64 addr);
-int symbol__alloc_hist(struct symbol *sym, int nevents);
+int symbol__alloc_hist(struct symbol *sym);
 void symbol__annotate_zero_histograms(struct symbol *sym);
 
 int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize);
@@ -99,8 +99,7 @@ static inline int symbol__tui_annotate(struct symbol *sym __used,
 }
 #else
 int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
-                        int nr_events, void(*timer)(void *arg), void *arg,
-                        int delay_secs);
+                        void(*timer)(void *arg), void *arg, int delay_secs);
 #endif
 
 extern const char      *disassembler_style;
index bcd05d05b4f01969906efe3dbfcc899ccdea554a..41424a16be8ea1f34448d7e410fb7b2aa9e09e03 100644 (file)
@@ -2041,6 +2041,8 @@ int perf_session__read_header(struct perf_session *session, int fd)
                lseek(fd, tmp, SEEK_SET);
        }
 
+       symbol_conf.nr_events = nr_attrs;
+
        if (f_header.event_types.size) {
                lseek(fd, f_header.event_types.offset, SEEK_SET);
                events = malloc(f_header.event_types.size);
index c86c1d27bd1eca09cef6c00949293a251b345ef9..6676d558b2a76e3497f2cb34536fdd49269630d9 100644 (file)
@@ -119,7 +119,6 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __used,
 
 static inline int hist_entry__tui_annotate(struct hist_entry *self __used,
                                           int evidx __used,
-                                          int nr_events __used,
                                           void(*timer)(void *arg) __used,
                                           void *arg __used,
                                           int delay_secs __used)
@@ -130,7 +129,7 @@ static inline int hist_entry__tui_annotate(struct hist_entry *self __used,
 #define K_RIGHT -2
 #else
 #include "ui/keysyms.h"
-int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events,
+int hist_entry__tui_annotate(struct hist_entry *he, int evidx,
                             void(*timer)(void *arg), void *arg, int delay_secs);
 
 int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
index 29f8d742e92face543371457443911134b316d37..123c2e14353e5b4c8d14d86ee82f8c4cdb3668cf 100644 (file)
@@ -68,6 +68,7 @@ struct strlist;
 
 struct symbol_conf {
        unsigned short  priv_size;
+       unsigned short  nr_events;
        bool            try_vmlinux_path,
                        use_modules,
                        sort_by_name,
index 0575905d1205a24b5353b54c2f4c548e4cc6c2e4..295a9c93f945963d224673244fee6c4d5ac552b8 100644 (file)
@@ -224,7 +224,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)
 }
 
 static int annotate_browser__run(struct annotate_browser *self, int evidx,
-                                int nr_events, void(*timer)(void *arg),
+                                void(*timer)(void *arg),
                                 void *arg, int delay_secs)
 {
        struct rb_node *nd = NULL;
@@ -328,8 +328,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
                                notes = symbol__annotation(target);
                                pthread_mutex_lock(&notes->lock);
 
-                               if (notes->src == NULL &&
-                                   symbol__alloc_hist(target, nr_events) < 0) {
+                               if (notes->src == NULL && symbol__alloc_hist(target) < 0) {
                                        pthread_mutex_unlock(&notes->lock);
                                        ui__warning("Not enough memory for annotating '%s' symbol!\n",
                                                    target->name);
@@ -337,7 +336,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
                                }
 
                                pthread_mutex_unlock(&notes->lock);
-                               symbol__tui_annotate(target, ms->map, evidx, nr_events,
+                               symbol__tui_annotate(target, ms->map, evidx,
                                                     timer, arg, delay_secs);
                        }
                        continue;
@@ -358,15 +357,15 @@ out:
        return key;
 }
 
-int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events,
+int hist_entry__tui_annotate(struct hist_entry *he, int evidx,
                             void(*timer)(void *arg), void *arg, int delay_secs)
 {
-       return symbol__tui_annotate(he->ms.sym, he->ms.map, evidx, nr_events,
+       return symbol__tui_annotate(he->ms.sym, he->ms.map, evidx,
                                    timer, arg, delay_secs);
 }
 
 int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
-                        int nr_events, void(*timer)(void *arg), void *arg,
+                        void(*timer)(void *arg), void *arg,
                         int delay_secs)
 {
        struct objdump_line *pos, *n;
@@ -419,8 +418,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
        browser.b.nr_entries = browser.nr_entries;
        browser.b.entries = &notes->src->source,
        browser.b.width += 18; /* Percentage */
-       ret = annotate_browser__run(&browser, evidx, nr_events,
-                                   timer, arg, delay_secs);
+       ret = annotate_browser__run(&browser, evidx, timer, arg, delay_secs);
        list_for_each_entry_safe(pos, n, &notes->src->source, node) {
                list_del(&pos->node);
                objdump_line__free(pos);
index d0c94b4596852d4f47ce266400ca3c7bb0013a96..1212a386a0336e8b0faf02f62513d9172d42b55f 100644 (file)
@@ -1020,7 +1020,7 @@ do_annotate:
                         * Don't let this be freed, say, by hists__decay_entry.
                         */
                        he->used = true;
-                       err = hist_entry__tui_annotate(he, evsel->idx, nr_events,
+                       err = hist_entry__tui_annotate(he, evsel->idx,
                                                       timer, arg, delay_secs);
                        he->used = false;
                        ui_browser__update_nr_entries(&browser->b, browser->hists->nr_entries);