diff options
| -rw-r--r-- | tools/perf/util/event.h | 8 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 6 | ||||
| -rw-r--r-- | tools/perf/util/hist.c | 86 | ||||
| -rw-r--r-- | tools/perf/util/hist.h | 13 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 32 | ||||
| -rw-r--r-- | tools/perf/util/machine.h | 3 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/sort.c | 369 | ||||
| -rw-r--r-- | tools/perf/util/sort.h | 9 | ||||
| -rw-r--r-- | tools/perf/util/symbol.h | 6 |
10 files changed, 525 insertions, 10 deletions
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index a97fbbe6b3b3..181389535c0c 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
| @@ -91,6 +91,7 @@ struct perf_sample { | |||
| 91 | u64 weight; | 91 | u64 weight; |
| 92 | u32 cpu; | 92 | u32 cpu; |
| 93 | u32 raw_size; | 93 | u32 raw_size; |
| 94 | u64 data_src; | ||
| 94 | void *raw_data; | 95 | void *raw_data; |
| 95 | struct ip_callchain *callchain; | 96 | struct ip_callchain *callchain; |
| 96 | struct branch_stack *branch_stack; | 97 | struct branch_stack *branch_stack; |
| @@ -98,6 +99,13 @@ struct perf_sample { | |||
| 98 | struct stack_dump user_stack; | 99 | struct stack_dump user_stack; |
| 99 | }; | 100 | }; |
| 100 | 101 | ||
| 102 | #define PERF_MEM_DATA_SRC_NONE \ | ||
| 103 | (PERF_MEM_S(OP, NA) |\ | ||
| 104 | PERF_MEM_S(LVL, NA) |\ | ||
| 105 | PERF_MEM_S(SNOOP, NA) |\ | ||
| 106 | PERF_MEM_S(LOCK, NA) |\ | ||
| 107 | PERF_MEM_S(TLB, NA)) | ||
| 108 | |||
| 101 | struct build_id_event { | 109 | struct build_id_event { |
| 102 | struct perf_event_header header; | 110 | struct perf_event_header header; |
| 103 | pid_t pid; | 111 | pid_t pid; |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 23061a6ccd77..5c4ca51c8f7b 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -1177,6 +1177,12 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, | |||
| 1177 | array++; | 1177 | array++; |
| 1178 | } | 1178 | } |
| 1179 | 1179 | ||
| 1180 | data->data_src = PERF_MEM_DATA_SRC_NONE; | ||
| 1181 | if (type & PERF_SAMPLE_DATA_SRC) { | ||
| 1182 | data->data_src = *array; | ||
| 1183 | array++; | ||
| 1184 | } | ||
| 1185 | |||
| 1180 | return 0; | 1186 | return 0; |
| 1181 | } | 1187 | } |
| 1182 | 1188 | ||
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 97ddd18acd7c..99cc719ce736 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
| @@ -67,12 +67,16 @@ static void hists__set_unres_dso_col_len(struct hists *hists, int dso) | |||
| 67 | void hists__calc_col_len(struct hists *hists, struct hist_entry *h) | 67 | void hists__calc_col_len(struct hists *hists, struct hist_entry *h) |
| 68 | { | 68 | { |
| 69 | const unsigned int unresolved_col_width = BITS_PER_LONG / 4; | 69 | const unsigned int unresolved_col_width = BITS_PER_LONG / 4; |
| 70 | int symlen; | ||
| 70 | u16 len; | 71 | u16 len; |
| 71 | 72 | ||
| 72 | if (h->ms.sym) | 73 | if (h->ms.sym) |
| 73 | hists__new_col_len(hists, HISTC_SYMBOL, h->ms.sym->namelen + 4); | 74 | hists__new_col_len(hists, HISTC_SYMBOL, h->ms.sym->namelen + 4); |
| 74 | else | 75 | else { |
| 76 | symlen = unresolved_col_width + 4 + 2; | ||
| 77 | hists__new_col_len(hists, HISTC_SYMBOL, symlen); | ||
| 75 | hists__set_unres_dso_col_len(hists, HISTC_DSO); | 78 | hists__set_unres_dso_col_len(hists, HISTC_DSO); |
| 79 | } | ||
| 76 | 80 | ||
| 77 | len = thread__comm_len(h->thread); | 81 | len = thread__comm_len(h->thread); |
| 78 | if (hists__new_col_len(hists, HISTC_COMM, len)) | 82 | if (hists__new_col_len(hists, HISTC_COMM, len)) |
| @@ -87,7 +91,6 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h) | |||
| 87 | hists__new_col_len(hists, HISTC_PARENT, h->parent->namelen); | 91 | hists__new_col_len(hists, HISTC_PARENT, h->parent->namelen); |
| 88 | 92 | ||
| 89 | if (h->branch_info) { | 93 | if (h->branch_info) { |
| 90 | int symlen; | ||
| 91 | /* | 94 | /* |
| 92 | * +4 accounts for '[x] ' priv level info | 95 | * +4 accounts for '[x] ' priv level info |
| 93 | * +2 account of 0x prefix on raw addresses | 96 | * +2 account of 0x prefix on raw addresses |
| @@ -116,6 +119,42 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h) | |||
| 116 | hists__set_unres_dso_col_len(hists, HISTC_DSO_TO); | 119 | hists__set_unres_dso_col_len(hists, HISTC_DSO_TO); |
| 117 | } | 120 | } |
| 118 | } | 121 | } |
| 122 | |||
| 123 | if (h->mem_info) { | ||
| 124 | /* | ||
| 125 | * +4 accounts for '[x] ' priv level info | ||
| 126 | * +2 account of 0x prefix on raw addresses | ||
| 127 | */ | ||
| 128 | if (h->mem_info->daddr.sym) { | ||
| 129 | symlen = (int)h->mem_info->daddr.sym->namelen + 4 | ||
| 130 | + unresolved_col_width + 2; | ||
| 131 | hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, | ||
| 132 | symlen); | ||
| 133 | } else { | ||
| 134 | symlen = unresolved_col_width + 4 + 2; | ||
| 135 | hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, | ||
| 136 | symlen); | ||
| 137 | } | ||
| 138 | if (h->mem_info->daddr.map) { | ||
| 139 | symlen = dso__name_len(h->mem_info->daddr.map->dso); | ||
| 140 | hists__new_col_len(hists, HISTC_MEM_DADDR_DSO, | ||
| 141 | symlen); | ||
| 142 | } else { | ||
| 143 | symlen = unresolved_col_width + 4 + 2; | ||
| 144 | hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO); | ||
| 145 | } | ||
| 146 | } else { | ||
| 147 | symlen = unresolved_col_width + 4 + 2; | ||
| 148 | hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, symlen); | ||
| 149 | hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO); | ||
| 150 | } | ||
| 151 | |||
| 152 | hists__new_col_len(hists, HISTC_MEM_LOCKED, 6); | ||
| 153 | hists__new_col_len(hists, HISTC_MEM_TLB, 22); | ||
| 154 | hists__new_col_len(hists, HISTC_MEM_SNOOP, 12); | ||
| 155 | hists__new_col_len(hists, HISTC_MEM_LVL, 21 + 3); | ||
| 156 | hists__new_col_len(hists, HISTC_LOCAL_WEIGHT, 12); | ||
| 157 | hists__new_col_len(hists, HISTC_GLOBAL_WEIGHT, 12); | ||
| 119 | } | 158 | } |
| 120 | 159 | ||
| 121 | void hists__output_recalc_col_len(struct hists *hists, int max_rows) | 160 | void hists__output_recalc_col_len(struct hists *hists, int max_rows) |
| @@ -158,6 +197,7 @@ static void hist_entry__add_cpumode_period(struct hist_entry *he, | |||
| 158 | static void he_stat__add_period(struct he_stat *he_stat, u64 period, | 197 | static void he_stat__add_period(struct he_stat *he_stat, u64 period, |
| 159 | u64 weight) | 198 | u64 weight) |
| 160 | { | 199 | { |
| 200 | |||
| 161 | he_stat->period += period; | 201 | he_stat->period += period; |
| 162 | he_stat->weight += weight; | 202 | he_stat->weight += weight; |
| 163 | he_stat->nr_events += 1; | 203 | he_stat->nr_events += 1; |
| @@ -243,7 +283,7 @@ void hists__decay_entries_threaded(struct hists *hists, | |||
| 243 | static struct hist_entry *hist_entry__new(struct hist_entry *template) | 283 | static struct hist_entry *hist_entry__new(struct hist_entry *template) |
| 244 | { | 284 | { |
| 245 | size_t callchain_size = symbol_conf.use_callchain ? sizeof(struct callchain_root) : 0; | 285 | size_t callchain_size = symbol_conf.use_callchain ? sizeof(struct callchain_root) : 0; |
| 246 | struct hist_entry *he = malloc(sizeof(*he) + callchain_size); | 286 | struct hist_entry *he = zalloc(sizeof(*he) + callchain_size); |
| 247 | 287 | ||
| 248 | if (he != NULL) { | 288 | if (he != NULL) { |
| 249 | *he = *template; | 289 | *he = *template; |
| @@ -258,6 +298,13 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template) | |||
| 258 | he->branch_info->to.map->referenced = true; | 298 | he->branch_info->to.map->referenced = true; |
| 259 | } | 299 | } |
| 260 | 300 | ||
| 301 | if (he->mem_info) { | ||
| 302 | if (he->mem_info->iaddr.map) | ||
| 303 | he->mem_info->iaddr.map->referenced = true; | ||
| 304 | if (he->mem_info->daddr.map) | ||
| 305 | he->mem_info->daddr.map->referenced = true; | ||
| 306 | } | ||
| 307 | |||
| 261 | if (symbol_conf.use_callchain) | 308 | if (symbol_conf.use_callchain) |
| 262 | callchain_init(he->callchain); | 309 | callchain_init(he->callchain); |
| 263 | 310 | ||
| @@ -346,6 +393,36 @@ out_unlock: | |||
| 346 | return he; | 393 | return he; |
| 347 | } | 394 | } |
| 348 | 395 | ||
| 396 | struct hist_entry *__hists__add_mem_entry(struct hists *self, | ||
| 397 | struct addr_location *al, | ||
| 398 | struct symbol *sym_parent, | ||
| 399 | struct mem_info *mi, | ||
| 400 | u64 period, | ||
| 401 | u64 weight) | ||
| 402 | { | ||
| 403 | struct hist_entry entry = { | ||
| 404 | .thread = al->thread, | ||
| 405 | .ms = { | ||
| 406 | .map = al->map, | ||
| 407 | .sym = al->sym, | ||
| 408 | }, | ||
| 409 | .stat = { | ||
| 410 | .period = period, | ||
| 411 | .weight = weight, | ||
| 412 | .nr_events = 1, | ||
