Commit dd464345 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf diff: Refactor diff displacement possition info

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: default avatarJiri 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.orgSigned-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ae359f19
...@@ -70,8 +70,8 @@ static struct perf_tool tool = { ...@@ -70,8 +70,8 @@ static struct perf_tool tool = {
.ordering_requires_timestamps = true, .ordering_requires_timestamps = true,
}; };
static void perf_session__insert_hist_entry_by_name(struct rb_root *root, static void insert_hist_entry_by_name(struct rb_root *root,
struct hist_entry *he) struct hist_entry *he)
{ {
struct rb_node **p = &root->rb_node; struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL; struct rb_node *parent = NULL;
...@@ -90,7 +90,7 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root, ...@@ -90,7 +90,7 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
rb_insert_color(&he->rb_node, 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; unsigned long position = 1;
struct rb_root tmp = RB_ROOT; struct rb_root tmp = RB_ROOT;
...@@ -100,12 +100,16 @@ static void hists__resort_entries(struct hists *self) ...@@ -100,12 +100,16 @@ static void hists__resort_entries(struct hists *self)
struct hist_entry *n = rb_entry(next, struct hist_entry, rb_node); struct hist_entry *n = rb_entry(next, struct hist_entry, rb_node);
next = rb_next(&n->rb_node); next = rb_next(&n->rb_node);
rb_erase(&n->rb_node, &self->entries);
n->position = position++; 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, static struct hist_entry *hists__find_entry(struct hists *self,
...@@ -121,7 +125,7 @@ static struct hist_entry *hists__find_entry(struct hists *self, ...@@ -121,7 +125,7 @@ static struct hist_entry *hists__find_entry(struct hists *self,
n = n->rb_left; n = n->rb_left;
else if (cmp > 0) else if (cmp > 0)
n = n->rb_right; n = n->rb_right;
else else
return iter; return iter;
} }
...@@ -150,6 +154,24 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel, ...@@ -150,6 +154,24 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel,
return NULL; 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) static int __cmd_diff(void)
{ {
int ret, i; int ret, i;
...@@ -176,15 +198,8 @@ static int __cmd_diff(void) ...@@ -176,15 +198,8 @@ static int __cmd_diff(void)
evlist_old = older->evlist; evlist_old = older->evlist;
evlist_new = newer->evlist; evlist_new = newer->evlist;
list_for_each_entry(evsel, &evlist_new->entries, node) perf_evlist__resort_hists(evlist_old, true);
hists__output_resort(&evsel->hists); perf_evlist__resort_hists(evlist_new, false);
list_for_each_entry(evsel, &evlist_old->entries, node) {
hists__output_resort(&evsel->hists);
if (show_displacement)
hists__resort_entries(&evsel->hists);
}
list_for_each_entry(evsel, &evlist_new->entries, node) { list_for_each_entry(evsel, &evlist_new->entries, node) {
struct perf_evsel *evsel_old; struct perf_evsel *evsel_old;
...@@ -200,7 +215,7 @@ static int __cmd_diff(void) ...@@ -200,7 +215,7 @@ static int __cmd_diff(void)
hists__match(&evsel_old->hists, &evsel->hists); hists__match(&evsel_old->hists, &evsel->hists);
hists__fprintf(&evsel->hists, &evsel_old->hists, hists__fprintf(&evsel->hists, &evsel_old->hists,
show_displacement, true, 0, 0, stdout); true, 0, 0, stdout);
} }
out_delete: out_delete:
......
...@@ -320,7 +320,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist, ...@@ -320,7 +320,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
const char *evname = perf_evsel__name(pos); const char *evname = perf_evsel__name(pos);
hists__fprintf_nr_sample_events(hists, evname, stdout); 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"); fprintf(stdout, "\n\n");
} }
......
...@@ -316,7 +316,7 @@ static void perf_top__print_sym_table(struct perf_top *top) ...@@ -316,7 +316,7 @@ static void perf_top__print_sym_table(struct perf_top *top)
hists__output_recalc_col_len(&top->sym_evsel->hists, hists__output_recalc_col_len(&top->sym_evsel->hists,
top->winsize.ws_row - 3); top->winsize.ws_row - 3);
putchar('\n'); 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); top->winsize.ws_row - 4 - printed, win_width, stdout);
} }
......
...@@ -244,13 +244,15 @@ static int hpp__width_displ(struct perf_hpp *hpp __maybe_unused) ...@@ -244,13 +244,15 @@ static int hpp__width_displ(struct perf_hpp *hpp __maybe_unused)
} }
static int hpp__entry_displ(struct perf_hpp *hpp, 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"; const char *fmt = symbol_conf.field_sep ? "%s" : "%6.6s";
char buf[32] = " "; char buf[32] = " ";
if (hpp->displacement) if (displacement)
scnprintf(buf, sizeof(buf), "%+4ld", hpp->displacement); scnprintf(buf, sizeof(buf), "%+4ld", displacement);
return scnprintf(hpp->buf, hpp->size, fmt, buf); return scnprintf(hpp->buf, hpp->size, fmt, buf);
} }
......
...@@ -308,7 +308,7 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he, ...@@ -308,7 +308,7 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he,
static int hist_entry__fprintf(struct hist_entry *he, size_t size, static int hist_entry__fprintf(struct hist_entry *he, size_t size,
struct hists *hists, struct hists *pair_hists, struct hists *hists, struct hists *pair_hists,
long displacement, u64 total_period, FILE *fp) u64 total_period, FILE *fp)
{ {
char bf[512]; char bf[512];
int ret; int ret;
...@@ -316,7 +316,6 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size, ...@@ -316,7 +316,6 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size,
.buf = bf, .buf = bf,
.size = size, .size = size,
.total_period = total_period, .total_period = total_period,
.displacement = displacement,
.ptr = pair_hists, .ptr = pair_hists,
}; };
bool color = !symbol_conf.field_sep; bool color = !symbol_conf.field_sep;
...@@ -337,15 +336,13 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size, ...@@ -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, 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) int max_cols, FILE *fp)
{ {
struct sort_entry *se; struct sort_entry *se;
struct rb_node *nd; struct rb_node *nd;
size_t ret = 0; size_t ret = 0;
u64 total_period; u64 total_period;
unsigned long position = 1;
long displacement = 0;
unsigned int width; unsigned int width;
const char *sep = symbol_conf.field_sep; const char *sep = symbol_conf.field_sep;
const char *col_width = symbol_conf.col_width_list_str; const char *col_width = symbol_conf.col_width_list_str;
...@@ -449,15 +446,7 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair, ...@@ -449,15 +446,7 @@ size_t hists__fprintf(struct hists *hists, struct hists *pair,
if (h->filtered) if (h->filtered)
continue; continue;
if (show_displacement) { ret += hist_entry__fprintf(h, max_cols, hists, pair,
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,
total_period, fp); total_period, fp);
if (max_rows && ++nr_rows >= max_rows) if (max_rows && ++nr_rows >= max_rows)
......
...@@ -99,8 +99,7 @@ void hists__inc_nr_events(struct hists *self, u32 type); ...@@ -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_nr_events(struct hists *self, FILE *fp);
size_t hists__fprintf(struct hists *self, struct hists *pair, size_t hists__fprintf(struct hists *self, struct hists *pair,
bool show_displacement, bool show_header, bool show_header, int max_rows, int max_cols, FILE *fp);
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__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr);
int hist_entry__annotate(struct hist_entry *self, size_t privsize); int hist_entry__annotate(struct hist_entry *self, size_t privsize);
...@@ -120,7 +119,6 @@ struct perf_hpp { ...@@ -120,7 +119,6 @@ struct perf_hpp {
size_t size; size_t size;
u64 total_period; u64 total_period;
const char *sep; const char *sep;
long displacement;
void *ptr; void *ptr;
}; };
......
...@@ -73,8 +73,8 @@ struct hist_entry { ...@@ -73,8 +73,8 @@ struct hist_entry {
u8 filtered; u8 filtered;
char *srcline; char *srcline;
struct symbol *parent; struct symbol *parent;
unsigned long position;
union { union {
unsigned long position;
struct hist_entry *pair; struct hist_entry *pair;
struct rb_root sorted_chain; struct rb_root sorted_chain;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment