diff options
| -rw-r--r-- | tools/perf/builtin-report.c | 40 | ||||
| -rw-r--r-- | tools/perf/util/sort.c | 10 | ||||
| -rw-r--r-- | tools/perf/util/sort.h | 1 |
3 files changed, 41 insertions, 10 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index bee207ce589a..3d8c52220f1f 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -122,8 +122,8 @@ static void init_rem_hits(void) | |||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static size_t | 124 | static size_t |
| 125 | callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | 125 | __callchain__fprintf_graph(FILE *fp, struct callchain_node *self, |
| 126 | u64 total_samples, int depth, int depth_mask) | 126 | u64 total_samples, int depth, int depth_mask) |
| 127 | { | 127 | { |
| 128 | struct rb_node *node, *next; | 128 | struct rb_node *node, *next; |
| 129 | struct callchain_node *child; | 129 | struct callchain_node *child; |
| @@ -174,9 +174,9 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | |||
| 174 | new_total, | 174 | new_total, |
| 175 | cumul); | 175 | cumul); |
| 176 | } | 176 | } |
| 177 | ret += callchain__fprintf_graph(fp, child, new_total, | 177 | ret += __callchain__fprintf_graph(fp, child, new_total, |
| 178 | depth + 1, | 178 | depth + 1, |
| 179 | new_depth_mask | (1 << depth)); | 179 | new_depth_mask | (1 << depth)); |
| 180 | node = next; | 180 | node = next; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| @@ -197,6 +197,33 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | |||
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | static size_t | 199 | static size_t |
| 200 | callchain__fprintf_graph(FILE *fp, struct callchain_node *self, | ||
| 201 | u64 total_samples) | ||
| 202 | { | ||
| 203 | struct callchain_list *chain; | ||
| 204 | int i = 0; | ||
| 205 | int ret = 0; | ||
| 206 | |||
| 207 | list_for_each_entry(chain, &self->val, list) { | ||
| 208 | if (chain->ip >= PERF_CONTEXT_MAX) | ||
| 209 | continue; | ||
| 210 | |||
| 211 | if (!i++ && sort_by_sym_first) | ||
| 212 | continue; | ||
| 213 | |||
| 214 | if (chain->sym) | ||
| 215 | ret += fprintf(fp, " %s\n", chain->sym->name); | ||
| 216 | else | ||
| 217 | ret += fprintf(fp, " %p\n", | ||
| 218 | (void *)(long)chain->ip); | ||
| 219 | } | ||
| 220 | |||
| 221 | ret += __callchain__fprintf_graph(fp, self, total_samples, 1, 1); | ||
| 222 | |||
| 223 | return ret; | ||
| 224 | } | ||
| 225 | |||
| 226 | static size_t | ||
| 200 | callchain__fprintf_flat(FILE *fp, struct callchain_node *self, | 227 | callchain__fprintf_flat(FILE *fp, struct callchain_node *self, |
| 201 | u64 total_samples) | 228 | u64 total_samples) |
| 202 | { | 229 | { |
| @@ -244,8 +271,7 @@ hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self, | |||
| 244 | break; | 271 | break; |
| 245 | case CHAIN_GRAPH_ABS: /* Falldown */ | 272 | case CHAIN_GRAPH_ABS: /* Falldown */ |
| 246 | case CHAIN_GRAPH_REL: | 273 | case CHAIN_GRAPH_REL: |
| 247 | ret += callchain__fprintf_graph(fp, chain, | 274 | ret += callchain__fprintf_graph(fp, chain, total_samples); |
| 248 | total_samples, 1, 1); | ||
| 249 | case CHAIN_NONE: | 275 | case CHAIN_NONE: |
| 250 | default: | 276 | default: |
| 251 | break; | 277 | break; |
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 40c9acd41cad..60ced707bd6b 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c | |||
| @@ -5,8 +5,9 @@ char default_parent_pattern[] = "^sys_|^do_page_fault"; | |||
| 5 | char *parent_pattern = default_parent_pattern; | 5 | char *parent_pattern = default_parent_pattern; |
| 6 | char default_sort_order[] = "comm,dso,symbol"; | 6 | char default_sort_order[] = "comm,dso,symbol"; |
| 7 | char *sort_order = default_sort_order; | 7 | char *sort_order = default_sort_order; |
| 8 | int sort__need_collapse = 0; | 8 | int sort__need_collapse = 0; |
| 9 | int sort__has_parent = 0; | 9 | int sort__has_parent = 0; |
| 10 | int sort_by_sym_first; | ||
| 10 | 11 | ||
| 11 | unsigned int dsos__col_width; | 12 | unsigned int dsos__col_width; |
| 12 | unsigned int comms__col_width; | 13 | unsigned int comms__col_width; |
| @@ -265,6 +266,10 @@ int sort_dimension__add(const char *tok) | |||
| 265 | sort__has_parent = 1; | 266 | sort__has_parent = 1; |
| 266 | } | 267 | } |
| 267 | 268 | ||
| 269 | if (list_empty(&hist_entry__sort_list) && | ||
| 270 | !strcmp(sd->name, "symbol")) | ||
| 271 | sort_by_sym_first = true; | ||
| 272 | |||
| 268 | list_add_tail(&sd->entry->list, &hist_entry__sort_list); | 273 | list_add_tail(&sd->entry->list, &hist_entry__sort_list); |
| 269 | sd->taken = 1; | 274 | sd->taken = 1; |
| 270 | 275 | ||
| @@ -273,4 +278,3 @@ int sort_dimension__add(const char *tok) | |||
| 273 | 278 | ||
| 274 | return -ESRCH; | 279 | return -ESRCH; |
| 275 | } | 280 | } |
| 276 | |||
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 13806d782af6..24c2b709f0d3 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h | |||
| @@ -39,6 +39,7 @@ extern struct sort_entry sort_parent; | |||
| 39 | extern unsigned int dsos__col_width; | 39 | extern unsigned int dsos__col_width; |
| 40 | extern unsigned int comms__col_width; | 40 | extern unsigned int comms__col_width; |
| 41 | extern unsigned int threads__col_width; | 41 | extern unsigned int threads__col_width; |
| 42 | extern int sort_by_sym_first; | ||
| 42 | 43 | ||
| 43 | struct hist_entry { | 44 | struct hist_entry { |
| 44 | struct rb_node rb_node; | 45 | struct rb_node rb_node; |
