diff options
Diffstat (limited to 'tools/perf/util/session.c')
| -rw-r--r-- | tools/perf/util/session.c | 102 |
1 files changed, 80 insertions, 22 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index f5a8fbdd3f7..080e5336d89 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "session.h" | 12 | #include "session.h" |
| 13 | #include "sort.h" | 13 | #include "sort.h" |
| 14 | #include "util.h" | 14 | #include "util.h" |
| 15 | #include "cpumap.h" | ||
| 15 | 16 | ||
| 16 | static int perf_session__open(struct perf_session *self, bool force) | 17 | static int perf_session__open(struct perf_session *self, bool force) |
| 17 | { | 18 | { |
| @@ -247,9 +248,14 @@ int perf_session__resolve_callchain(struct perf_session *self, | |||
| 247 | callchain_cursor_reset(&self->callchain_cursor); | 248 | callchain_cursor_reset(&self->callchain_cursor); |
| 248 | 249 | ||
| 249 | for (i = 0; i < chain->nr; i++) { | 250 | for (i = 0; i < chain->nr; i++) { |
| 250 | u64 ip = chain->ips[i]; | 251 | u64 ip; |
| 251 | struct addr_location al; | 252 | struct addr_location al; |
| 252 | 253 | ||
| 254 | if (callchain_param.order == ORDER_CALLEE) | ||
| 255 | ip = chain->ips[i]; | ||
| 256 | else | ||
| 257 | ip = chain->ips[chain->nr - i - 1]; | ||
| 258 | |||
| 253 | if (ip >= PERF_CONTEXT_MAX) { | 259 | if (ip >= PERF_CONTEXT_MAX) { |
| 254 | switch (ip) { | 260 | switch (ip) { |
| 255 | case PERF_CONTEXT_HV: | 261 | case PERF_CONTEXT_HV: |
| @@ -708,9 +714,9 @@ static void dump_sample(struct perf_session *session, union perf_event *event, | |||
| 708 | if (!dump_trace) | 714 | if (!dump_trace) |
| 709 | return; | 715 | return; |
| 710 | 716 | ||
| 711 | printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 "\n", | 717 | printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n", |
| 712 | event->header.misc, sample->pid, sample->tid, sample->ip, | 718 | event->header.misc, sample->pid, sample->tid, sample->ip, |
| 713 | sample->period); | 719 | sample->period, sample->addr); |
| 714 | 720 | ||
| 715 | if (session->sample_type & PERF_SAMPLE_CALLCHAIN) | 721 | if (session->sample_type & PERF_SAMPLE_CALLCHAIN) |
| 716 | callchain__printf(sample); | 722 | callchain__printf(sample); |
| @@ -1202,9 +1208,10 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session, | |||
| 1202 | return NULL; | 1208 | return NULL; |
| 1203 | } | 1209 | } |
| 1204 | 1210 | ||
| 1205 | void perf_session__print_symbols(union perf_event *event, | 1211 | void perf_session__print_ip(union perf_event *event, |
| 1206 | struct perf_sample *sample, | 1212 | struct perf_sample *sample, |
| 1207 | struct perf_session *session) | 1213 | struct perf_session *session, |
| 1214 | int print_sym, int print_dso) | ||
| 1208 | { | 1215 | { |
| 1209 | struct addr_location al; | 1216 | struct addr_location al; |
| 1210 | const char *symname, *dsoname; | 1217 | const char *symname, *dsoname; |
| @@ -1233,32 +1240,83 @@ void perf_session__print_symbols(union perf_event *event, | |||
| 1233 | if (!node) | 1240 | if (!node) |
| 1234 | break; | 1241 | break; |
| 1235 | 1242 | ||
| 1236 | if (node->sym && node->sym->name) | 1243 | printf("\t%16" PRIx64, node->ip); |
| 1237 | symname = node->sym->name; | 1244 | if (print_sym) { |
| 1245 | if (node->sym && node->sym->name) | ||
| 1246 | symname = node->sym->name; | ||
| 1247 | else | ||
| 1248 | symname = ""; | ||
| 1249 | |||
| 1250 | printf(" %s", symname); | ||
| 1251 | } | ||
| 1252 | if (print_dso) { | ||
| 1253 | if (node->map && node->map->dso && node->map->dso->name) | ||
| 1254 | dsoname = node->map->dso->name; | ||
| 1255 | else | ||
| 1256 | dsoname = ""; | ||
| 1257 | |||
| 1258 | printf(" (%s)", dsoname); | ||
| 1259 | } | ||
| 1260 | printf("\n"); | ||
| 1261 | |||
| 1262 | callchain_cursor_advance(cursor); | ||
| 1263 | } | ||
| 1264 | |||
| 1265 | } else { | ||
| 1266 | printf("%16" PRIx64, al.addr); | ||
| 1267 | if (print_sym) { | ||
| 1268 | if (al.sym && al.sym->name) | ||
| 1269 | symname = al.sym->name; | ||
| 1238 | else | 1270 | else |
| 1239 | symname = ""; | 1271 | symname = ""; |
| 1240 | 1272 | ||
| 1241 | if (node->map && node->map->dso && node->map->dso->name) | 1273 | printf(" %s", symname); |
| 1242 | dsoname = node->map->dso->name; | 1274 | } |
| 1275 | |||
| 1276 | if (print_dso) { | ||
| 1277 | if (al.map && al.map->dso && al.map->dso->name) | ||
| 1278 | dsoname = al.map->dso->name; | ||
| 1243 | else | 1279 | else |
| 1244 | dsoname = ""; | 1280 | dsoname = ""; |
| 1245 | 1281 | ||
| 1246 | printf("\t%16" PRIx64 " %s (%s)\n", node->ip, symname, dsoname); | 1282 | printf(" (%s)", dsoname); |
| 1283 | } | ||
| 1284 | } | ||
| 1285 | } | ||
| 1286 | |||
| 1287 | int perf_session__cpu_bitmap(struct perf_session *session, | ||
| 1288 | const char *cpu_list, unsigned long *cpu_bitmap) | ||
| 1289 | { | ||
| 1290 | int i; | ||
| 1291 | struct cpu_map *map; | ||
| 1292 | |||
| 1293 | for (i = 0; i < PERF_TYPE_MAX; ++i) { | ||
| 1294 | struct perf_evsel *evsel; | ||
| 1247 | 1295 | ||
| 1248 | callchain_cursor_advance(cursor); | 1296 | evsel = perf_session__find_first_evtype(session, i); |
| 1297 | if (!evsel) | ||
| 1298 | continue; | ||
| 1299 | |||
| 1300 | if (!(evsel->attr.sample_type & PERF_SAMPLE_CPU)) { | ||
| 1301 | pr_err("File does not contain CPU events. " | ||
| 1302 | "Remove -c option to proceed.\n"); | ||
| 1303 | return -1; | ||
| 1249 | } | 1304 | } |
| 1305 | } | ||
| 1250 | 1306 | ||
| 1251 | } else { | 1307 | map = cpu_map__new(cpu_list); |
| 1252 | if (al.sym && al.sym->name) | ||
| 1253 | symname = al.sym->name; | ||
| 1254 | else | ||
| 1255 | symname = ""; | ||
| 1256 | 1308 | ||
| 1257 | if (al.map && al.map->dso && al.map->dso->name) | 1309 | for (i = 0; i < map->nr; i++) { |
| 1258 | dsoname = al.map->dso->name; | 1310 | int cpu = map->map[i]; |
| 1259 | else | 1311 | |
| 1260 | dsoname = ""; | 1312 | if (cpu >= MAX_NR_CPUS) { |
| 1313 | pr_err("Requested CPU %d too large. " | ||
| 1314 | "Consider raising MAX_NR_CPUS\n", cpu); | ||
| 1315 | return -1; | ||
| 1316 | } | ||
| 1261 | 1317 | ||
| 1262 | printf("%16" PRIx64 " %s (%s)", al.addr, symname, dsoname); | 1318 | set_bit(cpu, cpu_bitmap); |
| 1263 | } | 1319 | } |
| 1320 | |||
| 1321 | return 0; | ||
| 1264 | } | 1322 | } |
