perf hist: Only allocate callchain_node if processing callchains
The struct callchain_node size is 120 bytes, that are never used when there are no callchains or '-g none' is specified, so conditionally allocate it, reducing sizeof(struct hist_entry) from 210 bytes to only 96, greatly speeding the non-callchain processing. LKML-Reference: <new-submission> 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> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
71cf8b8ff7
commit
b9fb930477
|
@ -110,8 +110,8 @@ static int perf_session__add_hist_entry(struct perf_session *self,
|
||||||
|
|
||||||
if (symbol_conf.use_callchain) {
|
if (symbol_conf.use_callchain) {
|
||||||
if (!hit)
|
if (!hit)
|
||||||
callchain_init(&he->callchain);
|
callchain_init(he->callchain);
|
||||||
err = append_chain(&he->callchain, data->callchain, syms);
|
err = append_chain(he->callchain, data->callchain, syms);
|
||||||
free(syms);
|
free(syms);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -50,7 +50,8 @@ struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists,
|
||||||
p = &(*p)->rb_right;
|
p = &(*p)->rb_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
he = malloc(sizeof(*he));
|
he = malloc(sizeof(*he) + (symbol_conf.use_callchain ?
|
||||||
|
sizeof(struct callchain_node) : 0));
|
||||||
if (!he)
|
if (!he)
|
||||||
return NULL;
|
return NULL;
|
||||||
*he = entry;
|
*he = entry;
|
||||||
|
@ -168,7 +169,7 @@ static void perf_session__insert_output_hist_entry(struct rb_root *root,
|
||||||
struct hist_entry *iter;
|
struct hist_entry *iter;
|
||||||
|
|
||||||
if (symbol_conf.use_callchain)
|
if (symbol_conf.use_callchain)
|
||||||
callchain_param.sort(&he->sorted_chain, &he->callchain,
|
callchain_param.sort(&he->sorted_chain, he->callchain,
|
||||||
min_callchain_hits, &callchain_param);
|
min_callchain_hits, &callchain_param);
|
||||||
|
|
||||||
while (*p != NULL) {
|
while (*p != NULL) {
|
||||||
|
|
|
@ -49,12 +49,12 @@ struct hist_entry {
|
||||||
u64 ip;
|
u64 ip;
|
||||||
char level;
|
char level;
|
||||||
struct symbol *parent;
|
struct symbol *parent;
|
||||||
struct callchain_node callchain;
|
|
||||||
union {
|
union {
|
||||||
unsigned long position;
|
unsigned long position;
|
||||||
struct hist_entry *pair;
|
struct hist_entry *pair;
|
||||||
struct rb_root sorted_chain;
|
struct rb_root sorted_chain;
|
||||||
};
|
};
|
||||||
|
struct callchain_node callchain[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sort_type {
|
enum sort_type {
|
||||||
|
|
Loading…
Reference in New Issue