summaryrefslogtreecommitdiff
path: root/tools/perf/util
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2009-12-14 18:10:39 +0300
committerIngo Molnar <mingo@elte.hu>2009-12-14 18:57:18 +0300
commit4e4f06e4c8f17ea96f7dd76251cab99511026401 (patch)
tree18b7f83b664939be0a9bde8e43daf9db8ca7fccc /tools/perf/util
parentb9bf089212d95746ce66482bcdbc7e77a0651088 (diff)
downloadlinux-4e4f06e4c8f17ea96f7dd76251cab99511026401.tar.xz
perf session: Move the hist_entries rb tree to perf_session
As we'll need to sort multiple times for multiple perf sessions, so that we can then do a diff. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1260803439-16783-1-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util')
-rw-r--r--tools/perf/util/data_map.c2
-rw-r--r--tools/perf/util/hist.c43
-rw-r--r--tools/perf/util/hist.h43
-rw-r--r--tools/perf/util/session.h5
4 files changed, 42 insertions, 51 deletions
diff --git a/tools/perf/util/data_map.c b/tools/perf/util/data_map.c
index 44dea211cc65..08c4cf5e66ba 100644
--- a/tools/perf/util/data_map.c
+++ b/tools/perf/util/data_map.c
@@ -161,7 +161,7 @@ int perf_session__process_events(struct perf_session *self,
err = -EINVAL;
if (ops->sample_type_check &&
- ops->sample_type_check(sample_type) < 0)
+ ops->sample_type_check(sample_type, self) < 0)
goto out_err;
if (!ops->full_paths) {
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index b40e37ded4bf..b9828fce7bf0 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1,7 +1,6 @@
#include "hist.h"
-
-struct rb_root hist;
-int callchain;
+#include "session.h"
+#include "sort.h"
struct callchain_param callchain_param = {
.mode = CHAIN_GRAPH_REL,
@@ -12,11 +11,12 @@ struct callchain_param callchain_param = {
* histogram, sorted on item, collects counts
*/
-struct hist_entry *__hist_entry__add(struct addr_location *al,
- struct symbol *sym_parent,
- u64 count, bool *hit)
+struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self,
+ struct addr_location *al,
+ struct symbol *sym_parent,
+ u64 count, bool *hit)
{
- struct rb_node **p = &hist.rb_node;
+ struct rb_node **p = &self->hists.rb_node;
struct rb_node *parent = NULL;
struct hist_entry *he;
struct hist_entry entry = {
@@ -52,7 +52,7 @@ struct hist_entry *__hist_entry__add(struct addr_location *al,
return NULL;
*he = entry;
rb_link_node(&he->rb_node, parent, p);
- rb_insert_color(&he->rb_node, &hist);
+ rb_insert_color(&he->rb_node, &self->hists);
*hit = false;
return he;
}
@@ -129,7 +129,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he)
rb_insert_color(&he->rb_node, root);
}
-void collapse__resort(void)
+void perf_session__collapse_resort(struct perf_session *self)
{
struct rb_root tmp;
struct rb_node *next;
@@ -139,31 +139,33 @@ void collapse__resort(void)
return;
tmp = RB_ROOT;
- next = rb_first(&hist);
+ next = rb_first(&self->hists);
while (next) {
n = rb_entry(next, struct hist_entry, rb_node);
next = rb_next(&n->rb_node);
- rb_erase(&n->rb_node, &hist);
+ rb_erase(&n->rb_node, &self->hists);
collapse__insert_entry(&tmp, n);
}
- hist = tmp;
+ self->hists = tmp;
}
/*
* reverse the map, sort on count.
*/
-static void output__insert_entry(struct rb_root *root, struct hist_entry *he,
- u64 min_callchain_hits)
+static void perf_session__insert_output_hist_entry(struct perf_session *self,
+ struct rb_root *root,
+ struct hist_entry *he,
+ u64 min_callchain_hits)
{
struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL;
struct hist_entry *iter;
- if (callchain)
+ if (self->use_callchain)
callchain_param.sort(&he->sorted_chain, &he->callchain,
min_callchain_hits, &callchain_param);
@@ -181,7 +183,7 @@ static void output__insert_entry(struct rb_root *root, struct hist_entry *he,
rb_insert_color(&he->rb_node, root);
}
-void output__resort(u64 total_samples)
+void perf_session__output_resort(struct perf_session *self, u64 total_samples)
{
struct rb_root tmp;
struct rb_node *next;
@@ -192,15 +194,16 @@ void output__resort(u64 total_samples)
total_samples * (callchain_param.min_percent / 100);
tmp = RB_ROOT;
- next = rb_first(&hist);
+ next = rb_first(&self->hists);
while (next) {
n = rb_entry(next, struct hist_entry, rb_node);
next = rb_next(&n->rb_node);
- rb_erase(&n->rb_node, &hist);
- output__insert_entry(&tmp, n, min_callchain_hits);
+ rb_erase(&n->rb_node, &self->hists);
+ perf_session__insert_output_hist_entry(self, &tmp, n,
+ min_callchain_hits);
}
- hist = tmp;
+ self->hists = tmp;
}
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index a6cb1485e3b9..7efdb1b6d8c8 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -1,40 +1,25 @@
#ifndef __PERF_HIST_H
#define __PERF_HIST_H
-#include "../builtin.h"
-#include "util.h"
-
-#include "color.h"
-#include <linux/list.h>
-#include "cache.h"
-#include <linux/rbtree.h>
-#include "symbol.h"
-#include "string.h"
+#include <linux/types.h>
#include "callchain.h"
-#include "strlist.h"
-#include "values.h"
-
-#include "../perf.h"
-#include "debug.h"
-#include "header.h"
-
-#include "parse-options.h"
-#include "parse-events.h"
-#include "thread.h"
-#include "sort.h"
-
-extern struct rb_root hist;
-extern int callchain;
extern struct callchain_param callchain_param;
-struct hist_entry *__hist_entry__add(struct addr_location *al,
- struct symbol *parent,
- u64 count, bool *hit);
+struct perf_session;
+struct hist_entry;
+struct addr_location;
+struct symbol;
+
+struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self,
+ struct addr_location *al,
+ struct symbol *parent,
+ u64 count, bool *hit);
extern int64_t hist_entry__cmp(struct hist_entry *, struct hist_entry *);
extern int64_t hist_entry__collapse(struct hist_entry *, struct hist_entry *);
-extern void hist_entry__free(struct hist_entry *);
-extern void collapse__resort(void);
-extern void output__resort(u64);
+void hist_entry__free(struct hist_entry *);
+
+void perf_session__output_resort(struct perf_session *self, u64 total_samples);
+void perf_session__collapse_resort(struct perf_session *self);
#endif /* __PERF_HIST_H */
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 20b2c9cc834b..759d96022a39 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -16,10 +16,12 @@ struct perf_session {
struct map_groups kmaps;
struct rb_root threads;
struct thread *last_match;
+ struct rb_root hists;
int fd;
int cwdlen;
char *cwd;
bool use_modules;
+ bool use_callchain;
char filename[0];
};
@@ -35,7 +37,8 @@ struct perf_event_ops {
event_op process_read_event;
event_op process_throttle_event;
event_op process_unthrottle_event;
- int (*sample_type_check)(u64 sample_type);
+ int (*sample_type_check)(u64 sample_type,
+ struct perf_session *session);
unsigned long total_unknown;
bool full_paths;
};