Skip to content

Commit

Permalink
perf diff: Refactor diff displacement possition info
Browse files Browse the repository at this point in the history
Moving the position calculation into the diff command, so the position
as prepared inside struct hist_entry data and there's no need to compute
in the output display path.

Removing 'displacement' from struct perf_hpp as it is no longer needed.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1349354994-17853-3-git-send-email-namhyung@kernel.org
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Jiri Olsa authored and Arnaldo Carvalho de Melo committed Oct 4, 2012
1 parent ae359f1 commit dd46434
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 40 deletions.
49 changes: 32 additions & 17 deletions tools/perf/builtin-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ static struct perf_tool tool = {
.ordering_requires_timestamps = true,
};

static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
struct hist_entry *he)
static void insert_hist_entry_by_name(struct rb_root *root,
struct hist_entry *he)
{
struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL;
Expand All @@ -90,7 +90,7 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
rb_insert_color(&he->rb_node, root);
}

static void hists__resort_entries(struct hists *self)
static void hists__name_resort(struct hists *self, bool sort)
{
unsigned long position = 1;
struct rb_root tmp = RB_ROOT;
Expand All @@ -100,12 +100,16 @@ static void hists__resort_entries(struct hists *self)
struct hist_entry *n = rb_entry(next, struct hist_entry, rb_node);

next = rb_next(&n->rb_node);
rb_erase(&n->rb_node, &self->entries);
n->position = position++;
perf_session__insert_hist_entry_by_name(&tmp, n);

if (sort) {
rb_erase(&n->rb_node, &self->entries);
insert_hist_entry_by_name(&tmp, n);
}
}

self->entries = tmp;
if (sort)
self->entries = tmp;
}

static struct hist_entry *hists__find_entry(struct hists *self,
Expand All @@ -121,7 +125,7 @@ static struct hist_entry *hists__find_entry(struct hists *self,
n = n->rb_left;
else if (cmp > 0)
n = n->rb_right;
else
else
return iter;
}

Expand Down Expand Up @@ -150,6 +154,24 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel,
return NULL;
}

static void perf_evlist__resort_hists(struct perf_evlist *evlist, bool name)
{
struct perf_evsel *evsel;

list_for_each_entry(evsel, &evlist->entries, node) {
struct hists *hists = &evsel->hists;

hists__output_resort(hists);

/*
* The hists__name_resort only sets possition
* if name is false.
*/
if (name || ((!name) && show_displacement))
hists__name_resort(hists, name);
}
}

static int __cmd_diff(void)
{
int ret, i;
Expand All @@ -176,15 +198,8 @@ static int __cmd_diff(void)
evlist_old = older->evlist;
evlist_new = newer->evlist;

list_for_each_entry(evsel, &evlist_new->entries, node)
hists__output_resort(&evsel->hists);

list_for_each_entry(evsel, &evlist_old->entries, node) {
hists__output_resort(&evsel->hists);

if (show_displacement)
hists__resort_entries(&evsel->hists);
}
perf_evlist__resort_hists(evlist_old, true);
perf_evlist__resort_hists(evlist_new, false);

list_for_each_entry(evsel, &evlist_new->entries, node) {
struct perf_evsel *evsel_old;
Expand All @@ -200,7 +215,7 @@ static int __cmd_diff(void)

hists__match(&evsel_old->hists, &evsel->hists);
hists__fprintf(&evsel->hists, &evsel_old->hists,
show_displacement, true, 0, 0, stdout);
true, 0, 0, stdout);
}

out_delete:
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
const char *evname = perf_evsel__name(pos);

hists__fprintf_nr_sample_events(hists, evname, stdout);
hists__fprintf(hists, NULL, false, true, 0, 0, stdout);
hists__fprintf(hists, NULL, true, 0, 0, stdout);
fprintf(stdout, "\n\n");
}

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ static void perf_top__print_sym_table(struct perf_top *top)
hists__output_recalc_col_len(&top->sym_evsel->hists,
top->winsize.ws_row - 3);
putchar('\n');
hists__fprintf(&top->sym_evsel->hists, NULL, false, false,
hists__fprintf(&top->sym_evsel->hists, NULL, false,
top->winsize.ws_row - 4 - printed, win_width, stdout);
}

Expand Down
8 changes: 5 additions & 3 deletions tools/perf/ui/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,13 +244,15 @@ static int hpp__width_displ(struct perf_hpp *hpp __maybe_unused)
}

static int hpp__entry_displ(struct perf_hpp *hpp,
struct hist_entry *he __maybe_unused)
struct hist_entry *he)
{
struct hist_entry *pair = he->pair;
long displacement = pair ? pair->position - he->position : 0;
const char *fmt = symbol_conf.field_sep ? "%s" : "%6.6s";
char buf[32] = " ";

if (hpp->displacement)
scnprintf(buf, sizeof(buf), "%+4ld", hpp->displacement);
if (displacement)
scnprintf(buf, sizeof(buf), "%+4ld", displacement);

return scnprintf(hpp->buf, hpp->size, fmt, buf);
}
Expand Down
17 changes: 3 additions & 14 deletions tools/perf/ui/stdio/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,15 +308,14 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he,

static int hist_entry__fprintf(struct hist_entry *he, size_t size,
struct hists *hists, struct hists *pair_hists,
long displacement, u64 total_period, FILE *fp)
u64 total_period, FILE *fp)
{
char bf[512];
int ret;
struct perf_hpp hpp = {
.buf = bf,
.size = size,
.total_period = total_period,
.displacement = displacement,
.ptr = pair_hists,
};
bool color = !symbol_conf.field_sep;
Expand All @@ -337,15 +336,13 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size,
}

size_t hists__fprintf(struct hists *hists, struct hists *pair,
bool show_displacement, bool show_header, int max_rows,
bool show_header, int max_rows,
int max_cols, FILE *fp)
{
struct sort_entry *se;
struct rb_node *nd;
size_t ret = 0;
u64 total_period;
unsigned long position = 1;
long displacement = 0;
unsigned int width;
const char *sep = symbol_conf.field_sep;
const char *col_width = symbol_conf.col_width_list_str;
Expand Down Expand Up @@ -449,15 +446,7 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair,
if (h->filtered)
continue;

if (show_displacement) {
if (h->pair != NULL)
displacement = ((long)h->pair->position -
(long)position);
else
displacement = 0;
++position;
}
ret += hist_entry__fprintf(h, max_cols, hists, pair, displacement,
ret += hist_entry__fprintf(h, max_cols, hists, pair,
total_period, fp);

if (max_rows && ++nr_rows >= max_rows)
Expand Down
4 changes: 1 addition & 3 deletions tools/perf/util/hist.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ void hists__inc_nr_events(struct hists *self, u32 type);
size_t hists__fprintf_nr_events(struct hists *self, FILE *fp);

size_t hists__fprintf(struct hists *self, struct hists *pair,
bool show_displacement, bool show_header,
int max_rows, int max_cols, FILE *fp);
bool show_header, int max_rows, int max_cols, FILE *fp);

int hist_entry__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr);
int hist_entry__annotate(struct hist_entry *self, size_t privsize);
Expand All @@ -120,7 +119,6 @@ struct perf_hpp {
size_t size;
u64 total_period;
const char *sep;
long displacement;
void *ptr;
};

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/sort.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ struct hist_entry {
u8 filtered;
char *srcline;
struct symbol *parent;
unsigned long position;
union {
unsigned long position;
struct hist_entry *pair;
struct rb_root sorted_chain;
};
Expand Down

0 comments on commit dd46434

Please sign in to comment.