diff options
Diffstat (limited to 'tools/perf/util/hist.c')
| -rw-r--r-- | tools/perf/util/hist.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 410cf56c9662..e34fd248067d 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
| @@ -47,6 +47,13 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template) | |||
| 47 | return self; | 47 | return self; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | static void hists__inc_nr_entries(struct hists *self, struct hist_entry *entry) | ||
| 51 | { | ||
| 52 | if (entry->ms.sym && self->max_sym_namelen < entry->ms.sym->namelen) | ||
| 53 | self->max_sym_namelen = entry->ms.sym->namelen; | ||
| 54 | ++self->nr_entries; | ||
| 55 | } | ||
| 56 | |||
| 50 | struct hist_entry *__hists__add_entry(struct hists *self, | 57 | struct hist_entry *__hists__add_entry(struct hists *self, |
| 51 | struct addr_location *al, | 58 | struct addr_location *al, |
| 52 | struct symbol *sym_parent, u64 count) | 59 | struct symbol *sym_parent, u64 count) |
| @@ -89,6 +96,7 @@ struct hist_entry *__hists__add_entry(struct hists *self, | |||
| 89 | return NULL; | 96 | return NULL; |
| 90 | rb_link_node(&he->rb_node, parent, p); | 97 | rb_link_node(&he->rb_node, parent, p); |
| 91 | rb_insert_color(&he->rb_node, &self->entries); | 98 | rb_insert_color(&he->rb_node, &self->entries); |
| 99 | hists__inc_nr_entries(self, he); | ||
| 92 | out: | 100 | out: |
| 93 | hist_entry__add_cpumode_count(he, al->cpumode, count); | 101 | hist_entry__add_cpumode_count(he, al->cpumode, count); |
| 94 | return he; | 102 | return he; |
| @@ -137,7 +145,7 @@ void hist_entry__free(struct hist_entry *he) | |||
| 137 | * collapse the histogram | 145 | * collapse the histogram |
| 138 | */ | 146 | */ |
| 139 | 147 | ||
| 140 | static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he) | 148 | static bool collapse__insert_entry(struct rb_root *root, struct hist_entry *he) |
| 141 | { | 149 | { |
| 142 | struct rb_node **p = &root->rb_node; | 150 | struct rb_node **p = &root->rb_node; |
| 143 | struct rb_node *parent = NULL; | 151 | struct rb_node *parent = NULL; |
| @@ -153,7 +161,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he) | |||
| 153 | if (!cmp) { | 161 | if (!cmp) { |
| 154 | iter->count += he->count; | 162 | iter->count += he->count; |
| 155 | hist_entry__free(he); | 163 | hist_entry__free(he); |
| 156 | return; | 164 | return false; |
| 157 | } | 165 | } |
| 158 | 166 | ||
| 159 | if (cmp < 0) | 167 | if (cmp < 0) |
| @@ -164,6 +172,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he) | |||
| 164 | 172 | ||
| 165 | rb_link_node(&he->rb_node, parent, p); | 173 | rb_link_node(&he->rb_node, parent, p); |
| 166 | rb_insert_color(&he->rb_node, root); | 174 | rb_insert_color(&he->rb_node, root); |
| 175 | return true; | ||
| 167 | } | 176 | } |
| 168 | 177 | ||
| 169 | void hists__collapse_resort(struct hists *self) | 178 | void hists__collapse_resort(struct hists *self) |
| @@ -177,13 +186,16 @@ void hists__collapse_resort(struct hists *self) | |||
| 177 | 186 | ||
| 178 | tmp = RB_ROOT; | 187 | tmp = RB_ROOT; |
| 179 | next = rb_first(&self->entries); | 188 | next = rb_first(&self->entries); |
| 189 | self->nr_entries = 0; | ||
| 190 | self->max_sym_namelen = 0; | ||
| 180 | 191 | ||
| 181 | while (next) { | 192 | while (next) { |
| 182 | n = rb_entry(next, struct hist_entry, rb_node); | 193 | n = rb_entry(next, struct hist_entry, rb_node); |
| 183 | next = rb_next(&n->rb_node); | 194 | next = rb_next(&n->rb_node); |
| 184 | 195 | ||
| 185 | rb_erase(&n->rb_node, &self->entries); | 196 | rb_erase(&n->rb_node, &self->entries); |
| 186 | collapse__insert_entry(&tmp, n); | 197 | if (collapse__insert_entry(&tmp, n)) |
| 198 | hists__inc_nr_entries(self, n); | ||
| 187 | } | 199 | } |
| 188 | 200 | ||
| 189 | self->entries = tmp; | 201 | self->entries = tmp; |
| @@ -219,30 +231,31 @@ static void __hists__insert_output_entry(struct rb_root *entries, | |||
| 219 | rb_insert_color(&he->rb_node, entries); | 231 | rb_insert_color(&he->rb_node, entries); |
| 220 | } | 232 | } |
| 221 | 233 | ||
| 222 | u64 hists__output_resort(struct hists *self) | 234 | void hists__output_resort(struct hists *self) |
| 223 | { | 235 | { |
| 224 | struct rb_root tmp; | 236 | struct rb_root tmp; |
| 225 | struct rb_node *next; | 237 | struct rb_node *next; |
| 226 | struct hist_entry *n; | 238 | struct hist_entry *n; |
| 227 | u64 min_callchain_hits; | 239 | u64 min_callchain_hits; |
| 228 | u64 nr_hists = 0; | ||
| 229 | 240 | ||
| 230 | min_callchain_hits = self->stats.total * (callchain_param.min_percent / 100); | 241 | min_callchain_hits = self->stats.total * (callchain_param.min_percent / 100); |
| 231 | 242 | ||
| 232 | tmp = RB_ROOT; | 243 | tmp = RB_ROOT; |
| 233 | next = rb_first(&self->entries); | 244 | next = rb_first(&self->entries); |
| 234 | 245 | ||
| 246 | self->nr_entries = 0; | ||
| 247 | self->max_sym_namelen = 0; | ||
| 248 | |||
| 235 | while (next) { | 249 | while (next) { |
| 236 | n = rb_entry(next, struct hist_entry, rb_node); | 250 | n = rb_entry(next, struct hist_entry, rb_node); |
| 237 | next = rb_next(&n->rb_node); | 251 | next = rb_next(&n->rb_node); |
| 238 | 252 | ||
| 239 | rb_erase(&n->rb_node, &self->entries); | 253 | rb_erase(&n->rb_node, &self->entries); |
| 240 | __hists__insert_output_entry(&tmp, n, min_callchain_hits); | 254 | __hists__insert_output_entry(&tmp, n, min_callchain_hits); |
| 241 | ++nr_hists; | 255 | hists__inc_nr_entries(self, n); |
| 242 | } | 256 | } |
| 243 | 257 | ||
| 244 | self->entries = tmp; | 258 | self->entries = tmp; |
| 245 | return nr_hists; | ||
| 246 | } | 259 | } |
| 247 | 260 | ||
| 248 | static size_t callchain__fprintf_left_margin(FILE *fp, int left_margin) | 261 | static size_t callchain__fprintf_left_margin(FILE *fp, int left_margin) |
