mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
perf hist: Introduce hists class and move lots of methods to it
In cbbc79a we introduced support for multiple events by introducing a new "event_stat_id" struct and then made several perf_session methods receive a point to it instead of a pointer to perf_session, and kept the event_stats and hists rb_tree in perf_session. While working on the new newt based browser, I realised that it would be better to introduce a new class, "hists" (short for "histograms"), renaming the "event_stat_id" struct and the perf_session methods that were really "hists" methods, as they manipulate only struct hists members, not touching anything in the other perf_session members. Other optimizations, such as calculating the maximum lenght of a symbol name present in an hists instance will be possible as we add them, avoiding a re-traversal just for finding that information. The rationale for the name "hists" to replace "event_stat_id" is that we may have multiple sets of hists for the same event_stat id, as, for instance, the 'perf diff' tool has, so event stat id is not what characterizes what this struct and the functions that manipulate it do. Cc: Eric B Munson <ebmunson@us.ibm.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
d118f8ba6a
commit
1c02c4d2e9
10 changed files with 146 additions and 164 deletions
|
@ -22,10 +22,10 @@ static char diff__default_sort_order[] = "dso,symbol";
|
|||
static bool force;
|
||||
static bool show_displacement;
|
||||
|
||||
static int perf_session__add_hist_entry(struct perf_session *self,
|
||||
struct addr_location *al, u64 count)
|
||||
static int hists__add_entry(struct hists *self,
|
||||
struct addr_location *al, u64 count)
|
||||
{
|
||||
if (__perf_session__add_hist_entry(&self->hists, al, NULL, count) != NULL)
|
||||
if (__hists__add_entry(self, al, NULL, count) != NULL)
|
||||
return 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -49,12 +49,12 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi
|
|||
|
||||
event__parse_sample(event, session->sample_type, &data);
|
||||
|
||||
if (perf_session__add_hist_entry(session, &al, data.period)) {
|
||||
if (hists__add_entry(&session->hists, &al, data.period)) {
|
||||
pr_warning("problem incrementing symbol count, skipping event\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
session->events_stats.total += data.period;
|
||||
session->hists.stats.total += data.period;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -87,35 +87,34 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
|
|||
rb_insert_color(&he->rb_node, root);
|
||||
}
|
||||
|
||||
static void perf_session__resort_hist_entries(struct perf_session *self)
|
||||
static void hists__resort_entries(struct hists *self)
|
||||
{
|
||||
unsigned long position = 1;
|
||||
struct rb_root tmp = RB_ROOT;
|
||||
struct rb_node *next = rb_first(&self->hists);
|
||||
struct rb_node *next = rb_first(&self->entries);
|
||||
|
||||
while (next != NULL) {
|
||||
struct hist_entry *n = rb_entry(next, struct hist_entry, rb_node);
|
||||
|
||||
next = rb_next(&n->rb_node);
|
||||
rb_erase(&n->rb_node, &self->hists);
|
||||
rb_erase(&n->rb_node, &self->entries);
|
||||
n->position = position++;
|
||||
perf_session__insert_hist_entry_by_name(&tmp, n);
|
||||
}
|
||||
|
||||
self->hists = tmp;
|
||||
self->entries = tmp;
|
||||
}
|
||||
|
||||
static void perf_session__set_hist_entries_positions(struct perf_session *self)
|
||||
static void hists__set_positions(struct hists *self)
|
||||
{
|
||||
perf_session__output_resort(&self->hists, self->events_stats.total);
|
||||
perf_session__resort_hist_entries(self);
|
||||
hists__output_resort(self);
|
||||
hists__resort_entries(self);
|
||||
}
|
||||
|
||||
static struct hist_entry *
|
||||
perf_session__find_hist_entry(struct perf_session *self,
|
||||
struct hist_entry *he)
|
||||
static struct hist_entry *hists__find_entry(struct hists *self,
|
||||
struct hist_entry *he)
|
||||
{
|
||||
struct rb_node *n = self->hists.rb_node;
|
||||
struct rb_node *n = self->entries.rb_node;
|
||||
|
||||
while (n) {
|
||||
struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node);
|
||||
|
@ -132,14 +131,13 @@ perf_session__find_hist_entry(struct perf_session *self,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void perf_session__match_hists(struct perf_session *old_session,
|
||||
struct perf_session *new_session)
|
||||
static void hists__match(struct hists *older, struct hists *newer)
|
||||
{
|
||||
struct rb_node *nd;
|
||||
|
||||
for (nd = rb_first(&new_session->hists); nd; nd = rb_next(nd)) {
|
||||
for (nd = rb_first(&newer->entries); nd; nd = rb_next(nd)) {
|
||||
struct hist_entry *pos = rb_entry(nd, struct hist_entry, rb_node);
|
||||
pos->pair = perf_session__find_hist_entry(old_session, pos);
|
||||
pos->pair = hists__find_entry(older, pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,15 +157,13 @@ static int __cmd_diff(void)
|
|||
goto out_delete;
|
||||
}
|
||||
|
||||
perf_session__output_resort(&session[1]->hists,
|
||||
session[1]->events_stats.total);
|
||||
hists__output_resort(&session[1]->hists);
|
||||
if (show_displacement)
|
||||
perf_session__set_hist_entries_positions(session[0]);
|
||||
hists__set_positions(&session[0]->hists);
|
||||
|
||||
perf_session__match_hists(session[0], session[1]);
|
||||
perf_session__fprintf_hists(&session[1]->hists, session[0],
|
||||
show_displacement, stdout,
|
||||
session[1]->events_stats.total);
|
||||
hists__match(&session[0]->hists, &session[1]->hists);
|
||||
hists__fprintf(&session[1]->hists, &session[0]->hists,
|
||||
show_displacement, stdout);
|
||||
out_delete:
|
||||
for (i = 0; i < 2; ++i)
|
||||
perf_session__delete(session[i]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue