|
@@ -8,21 +8,21 @@ struct callchain_param callchain_param = {
|
|
.min_percent = 0.5
|
|
.min_percent = 0.5
|
|
};
|
|
};
|
|
|
|
|
|
-static void perf_session__add_cpumode_count(struct hist_entry *he,
|
|
|
|
- unsigned int cpumode, u64 count)
|
|
|
|
|
|
+static void hist_entry__add_cpumode_count(struct hist_entry *self,
|
|
|
|
+ unsigned int cpumode, u64 count)
|
|
{
|
|
{
|
|
switch (cpumode) {
|
|
switch (cpumode) {
|
|
case PERF_RECORD_MISC_KERNEL:
|
|
case PERF_RECORD_MISC_KERNEL:
|
|
- he->count_sys += count;
|
|
|
|
|
|
+ self->count_sys += count;
|
|
break;
|
|
break;
|
|
case PERF_RECORD_MISC_USER:
|
|
case PERF_RECORD_MISC_USER:
|
|
- he->count_us += count;
|
|
|
|
|
|
+ self->count_us += count;
|
|
break;
|
|
break;
|
|
case PERF_RECORD_MISC_GUEST_KERNEL:
|
|
case PERF_RECORD_MISC_GUEST_KERNEL:
|
|
- he->count_guest_sys += count;
|
|
|
|
|
|
+ self->count_guest_sys += count;
|
|
break;
|
|
break;
|
|
case PERF_RECORD_MISC_GUEST_USER:
|
|
case PERF_RECORD_MISC_GUEST_USER:
|
|
- he->count_guest_us += count;
|
|
|
|
|
|
+ self->count_guest_us += count;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
@@ -47,12 +47,11 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template)
|
|
return self;
|
|
return self;
|
|
}
|
|
}
|
|
|
|
|
|
-struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists,
|
|
|
|
- struct addr_location *al,
|
|
|
|
- struct symbol *sym_parent,
|
|
|
|
- u64 count)
|
|
|
|
|
|
+struct hist_entry *__hists__add_entry(struct hists *self,
|
|
|
|
+ struct addr_location *al,
|
|
|
|
+ struct symbol *sym_parent, u64 count)
|
|
{
|
|
{
|
|
- struct rb_node **p = &hists->rb_node;
|
|
|
|
|
|
+ struct rb_node **p = &self->entries.rb_node;
|
|
struct rb_node *parent = NULL;
|
|
struct rb_node *parent = NULL;
|
|
struct hist_entry *he;
|
|
struct hist_entry *he;
|
|
struct hist_entry entry = {
|
|
struct hist_entry entry = {
|
|
@@ -89,9 +88,9 @@ struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists,
|
|
if (!he)
|
|
if (!he)
|
|
return NULL;
|
|
return NULL;
|
|
rb_link_node(&he->rb_node, parent, p);
|
|
rb_link_node(&he->rb_node, parent, p);
|
|
- rb_insert_color(&he->rb_node, hists);
|
|
|
|
|
|
+ rb_insert_color(&he->rb_node, &self->entries);
|
|
out:
|
|
out:
|
|
- perf_session__add_cpumode_count(he, al->cpumode, count);
|
|
|
|
|
|
+ hist_entry__add_cpumode_count(he, al->cpumode, count);
|
|
return he;
|
|
return he;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -167,7 +166,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he)
|
|
rb_insert_color(&he->rb_node, root);
|
|
rb_insert_color(&he->rb_node, root);
|
|
}
|
|
}
|
|
|
|
|
|
-void perf_session__collapse_resort(struct rb_root *hists)
|
|
|
|
|
|
+void hists__collapse_resort(struct hists *self)
|
|
{
|
|
{
|
|
struct rb_root tmp;
|
|
struct rb_root tmp;
|
|
struct rb_node *next;
|
|
struct rb_node *next;
|
|
@@ -177,28 +176,28 @@ void perf_session__collapse_resort(struct rb_root *hists)
|
|
return;
|
|
return;
|
|
|
|
|
|
tmp = RB_ROOT;
|
|
tmp = RB_ROOT;
|
|
- next = rb_first(hists);
|
|
|
|
|
|
+ next = rb_first(&self->entries);
|
|
|
|
|
|
while (next) {
|
|
while (next) {
|
|
n = rb_entry(next, struct hist_entry, rb_node);
|
|
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, hists);
|
|
|
|
|
|
+ rb_erase(&n->rb_node, &self->entries);
|
|
collapse__insert_entry(&tmp, n);
|
|
collapse__insert_entry(&tmp, n);
|
|
}
|
|
}
|
|
|
|
|
|
- *hists = tmp;
|
|
|
|
|
|
+ self->entries = tmp;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
* reverse the map, sort on count.
|
|
* reverse the map, sort on count.
|
|
*/
|
|
*/
|
|
|
|
|
|
-static void perf_session__insert_output_hist_entry(struct rb_root *root,
|
|
|
|
- struct hist_entry *he,
|
|
|
|
- u64 min_callchain_hits)
|
|
|
|
|
|
+static void __hists__insert_output_entry(struct rb_root *entries,
|
|
|
|
+ struct hist_entry *he,
|
|
|
|
+ u64 min_callchain_hits)
|
|
{
|
|
{
|
|
- struct rb_node **p = &root->rb_node;
|
|
|
|
|
|
+ struct rb_node **p = &entries->rb_node;
|
|
struct rb_node *parent = NULL;
|
|
struct rb_node *parent = NULL;
|
|
struct hist_entry *iter;
|
|
struct hist_entry *iter;
|
|
|
|
|
|
@@ -217,10 +216,10 @@ static void perf_session__insert_output_hist_entry(struct rb_root *root,
|
|
}
|
|
}
|
|
|
|
|
|
rb_link_node(&he->rb_node, parent, p);
|
|
rb_link_node(&he->rb_node, parent, p);
|
|
- rb_insert_color(&he->rb_node, root);
|
|
|
|
|
|
+ rb_insert_color(&he->rb_node, entries);
|
|
}
|
|
}
|
|
|
|
|
|
-u64 perf_session__output_resort(struct rb_root *hists, u64 total_samples)
|
|
|
|
|
|
+u64 hists__output_resort(struct hists *self)
|
|
{
|
|
{
|
|
struct rb_root tmp;
|
|
struct rb_root tmp;
|
|
struct rb_node *next;
|
|
struct rb_node *next;
|
|
@@ -228,23 +227,21 @@ u64 perf_session__output_resort(struct rb_root *hists, u64 total_samples)
|
|
u64 min_callchain_hits;
|
|
u64 min_callchain_hits;
|
|
u64 nr_hists = 0;
|
|
u64 nr_hists = 0;
|
|
|
|
|
|
- min_callchain_hits =
|
|
|
|
- total_samples * (callchain_param.min_percent / 100);
|
|
|
|
|
|
+ min_callchain_hits = self->stats.total * (callchain_param.min_percent / 100);
|
|
|
|
|
|
tmp = RB_ROOT;
|
|
tmp = RB_ROOT;
|
|
- next = rb_first(hists);
|
|
|
|
|
|
+ next = rb_first(&self->entries);
|
|
|
|
|
|
while (next) {
|
|
while (next) {
|
|
n = rb_entry(next, struct hist_entry, rb_node);
|
|
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, hists);
|
|
|
|
- perf_session__insert_output_hist_entry(&tmp, n,
|
|
|
|
- min_callchain_hits);
|
|
|
|
|
|
+ rb_erase(&n->rb_node, &self->entries);
|
|
|
|
+ __hists__insert_output_entry(&tmp, n, min_callchain_hits);
|
|
++nr_hists;
|
|
++nr_hists;
|
|
}
|
|
}
|
|
|
|
|
|
- *hists = tmp;
|
|
|
|
|
|
+ self->entries = tmp;
|
|
return nr_hists;
|
|
return nr_hists;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -500,12 +497,9 @@ static size_t hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-int hist_entry__snprintf(struct hist_entry *self,
|
|
|
|
- char *s, size_t size,
|
|
|
|
- struct perf_session *pair_session,
|
|
|
|
- bool show_displacement,
|
|
|
|
- long displacement, bool color,
|
|
|
|
- u64 session_total)
|
|
|
|
|
|
+int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
|
|
|
|
+ struct hists *pair_hists, bool show_displacement,
|
|
|
|
+ long displacement, bool color, u64 session_total)
|
|
{
|
|
{
|
|
struct sort_entry *se;
|
|
struct sort_entry *se;
|
|
u64 count, total, count_sys, count_us, count_guest_sys, count_guest_us;
|
|
u64 count, total, count_sys, count_us, count_guest_sys, count_guest_us;
|
|
@@ -515,9 +509,9 @@ int hist_entry__snprintf(struct hist_entry *self,
|
|
if (symbol_conf.exclude_other && !self->parent)
|
|
if (symbol_conf.exclude_other && !self->parent)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- if (pair_session) {
|
|
|
|
|
|
+ if (pair_hists) {
|
|
count = self->pair ? self->pair->count : 0;
|
|
count = self->pair ? self->pair->count : 0;
|
|
- total = pair_session->events_stats.total;
|
|
|
|
|
|
+ total = pair_hists->stats.total;
|
|
count_sys = self->pair ? self->pair->count_sys : 0;
|
|
count_sys = self->pair ? self->pair->count_sys : 0;
|
|
count_us = self->pair ? self->pair->count_us : 0;
|
|
count_us = self->pair ? self->pair->count_us : 0;
|
|
count_guest_sys = self->pair ? self->pair->count_guest_sys : 0;
|
|
count_guest_sys = self->pair ? self->pair->count_guest_sys : 0;
|
|
@@ -569,7 +563,7 @@ int hist_entry__snprintf(struct hist_entry *self,
|
|
ret += snprintf(s + ret, size - ret, "%11lld", count);
|
|
ret += snprintf(s + ret, size - ret, "%11lld", count);
|
|
}
|
|
}
|
|
|
|
|
|
- if (pair_session) {
|
|
|
|
|
|
+ if (pair_hists) {
|
|
char bf[32];
|
|
char bf[32];
|
|
double old_percent = 0, new_percent = 0, diff;
|
|
double old_percent = 0, new_percent = 0, diff;
|
|
|
|
|
|
@@ -615,14 +609,12 @@ int hist_entry__snprintf(struct hist_entry *self,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-int hist_entry__fprintf(struct hist_entry *self,
|
|
|
|
- struct perf_session *pair_session,
|
|
|
|
- bool show_displacement,
|
|
|
|
- long displacement, FILE *fp,
|
|
|
|
|
|
+int hist_entry__fprintf(struct hist_entry *self, struct hists *pair_hists,
|
|
|
|
+ bool show_displacement, long displacement, FILE *fp,
|
|
u64 session_total)
|
|
u64 session_total)
|
|
{
|
|
{
|
|
char bf[512];
|
|
char bf[512];
|
|
- hist_entry__snprintf(self, bf, sizeof(bf), pair_session,
|
|
|
|
|
|
+ hist_entry__snprintf(self, bf, sizeof(bf), pair_hists,
|
|
show_displacement, displacement,
|
|
show_displacement, displacement,
|
|
true, session_total);
|
|
true, session_total);
|
|
return fprintf(fp, "%s\n", bf);
|
|
return fprintf(fp, "%s\n", bf);
|
|
@@ -644,10 +636,8 @@ static size_t hist_entry__fprintf_callchain(struct hist_entry *self, FILE *fp,
|
|
left_margin);
|
|
left_margin);
|
|
}
|
|
}
|
|
|
|
|
|
-size_t perf_session__fprintf_hists(struct rb_root *hists,
|
|
|
|
- struct perf_session *pair,
|
|
|
|
- bool show_displacement, FILE *fp,
|
|
|
|
- u64 session_total)
|
|
|
|
|
|
+size_t hists__fprintf(struct hists *self, struct hists *pair,
|
|
|
|
+ bool show_displacement, FILE *fp)
|
|
{
|
|
{
|
|
struct sort_entry *se;
|
|
struct sort_entry *se;
|
|
struct rb_node *nd;
|
|
struct rb_node *nd;
|
|
@@ -753,7 +743,7 @@ size_t perf_session__fprintf_hists(struct rb_root *hists,
|
|
fprintf(fp, "\n#\n");
|
|
fprintf(fp, "\n#\n");
|
|
|
|
|
|
print_entries:
|
|
print_entries:
|
|
- for (nd = rb_first(hists); nd; nd = rb_next(nd)) {
|
|
|
|
|
|
+ for (nd = rb_first(&self->entries); nd; nd = rb_next(nd)) {
|
|
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
|
|
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
|
|
|
|
|
|
if (show_displacement) {
|
|
if (show_displacement) {
|
|
@@ -765,10 +755,10 @@ print_entries:
|
|
++position;
|
|
++position;
|
|
}
|
|
}
|
|
ret += hist_entry__fprintf(h, pair, show_displacement,
|
|
ret += hist_entry__fprintf(h, pair, show_displacement,
|
|
- displacement, fp, session_total);
|
|
|
|
|
|
+ displacement, fp, self->stats.total);
|
|
|
|
|
|
if (symbol_conf.use_callchain)
|
|
if (symbol_conf.use_callchain)
|
|
- ret += hist_entry__fprintf_callchain(h, fp, session_total);
|
|
|
|
|
|
+ ret += hist_entry__fprintf_callchain(h, fp, self->stats.total);
|
|
|
|
|
|
if (h->ms.map == NULL && verbose > 1) {
|
|
if (h->ms.map == NULL && verbose > 1) {
|
|
__map_groups__fprintf_maps(&h->thread->mg,
|
|
__map_groups__fprintf_maps(&h->thread->mg,
|