aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-kmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-rw-r--r--tools/perf/builtin-kmem.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index 924a9518931a..31f60a2535e0 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -335,8 +335,9 @@ static int process_sample_event(event_t *event, struct perf_session *session)
335} 335}
336 336
337static struct perf_event_ops event_ops = { 337static struct perf_event_ops event_ops = {
338 .sample = process_sample_event, 338 .sample = process_sample_event,
339 .comm = event__process_comm, 339 .comm = event__process_comm,
340 .ordered_samples = true,
340}; 341};
341 342
342static double fragmentation(unsigned long n_req, unsigned long n_alloc) 343static double fragmentation(unsigned long n_req, unsigned long n_alloc)
@@ -351,6 +352,7 @@ static void __print_result(struct rb_root *root, struct perf_session *session,
351 int n_lines, int is_caller) 352 int n_lines, int is_caller)
352{ 353{
353 struct rb_node *next; 354 struct rb_node *next;
355 struct machine *machine;
354 356
355 printf("%.102s\n", graph_dotted_line); 357 printf("%.102s\n", graph_dotted_line);
356 printf(" %-34s |", is_caller ? "Callsite": "Alloc Ptr"); 358 printf(" %-34s |", is_caller ? "Callsite": "Alloc Ptr");
@@ -359,23 +361,29 @@ static void __print_result(struct rb_root *root, struct perf_session *session,
359 361
360 next = rb_first(root); 362 next = rb_first(root);
361 363
364 machine = perf_session__find_host_machine(session);
365 if (!machine) {
366 pr_err("__print_result: couldn't find kernel information\n");
367 return;
368 }
362 while (next && n_lines--) { 369 while (next && n_lines--) {
363 struct alloc_stat *data = rb_entry(next, struct alloc_stat, 370 struct alloc_stat *data = rb_entry(next, struct alloc_stat,
364 node); 371 node);
365 struct symbol *sym = NULL; 372 struct symbol *sym = NULL;
373 struct map *map;
366 char buf[BUFSIZ]; 374 char buf[BUFSIZ];
367 u64 addr; 375 u64 addr;
368 376
369 if (is_caller) { 377 if (is_caller) {
370 addr = data->call_site; 378 addr = data->call_site;
371 if (!raw_ip) 379 if (!raw_ip)
372 sym = map_groups__find_function(&session->kmaps, addr, NULL); 380 sym = machine__find_kernel_function(machine, addr, &map, NULL);
373 } else 381 } else
374 addr = data->ptr; 382 addr = data->ptr;
375 383
376 if (sym != NULL) 384 if (sym != NULL)
377 snprintf(buf, sizeof(buf), "%s+%Lx", sym->name, 385 snprintf(buf, sizeof(buf), "%s+%Lx", sym->name,
378 addr - sym->start); 386 addr - map->unmap_ip(map, sym->start));
379 else 387 else
380 snprintf(buf, sizeof(buf), "%#Lx", addr); 388 snprintf(buf, sizeof(buf), "%#Lx", addr);
381 printf(" %-34s |", buf); 389 printf(" %-34s |", buf);
@@ -484,10 +492,13 @@ static void sort_result(void)
484static int __cmd_kmem(void) 492static int __cmd_kmem(void)
485{ 493{
486 int err = -EINVAL; 494 int err = -EINVAL;
487 struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0); 495 struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0, false);
488 if (session == NULL) 496 if (session == NULL)
489 return -ENOMEM; 497 return -ENOMEM;
490 498
499 if (perf_session__create_kernel_maps(session) < 0)
500 goto out_delete;
501
491 if (!perf_session__has_traces(session, "kmem record")) 502 if (!perf_session__has_traces(session, "kmem record"))
492 goto out_delete; 503 goto out_delete;
493 504
@@ -718,7 +729,6 @@ static const char *record_args[] = {
718 "record", 729 "record",
719 "-a", 730 "-a",
720 "-R", 731 "-R",
721 "-M",
722 "-f", 732 "-f",
723 "-c", "1", 733 "-c", "1",
724 "-e", "kmem:kmalloc", 734 "-e", "kmem:kmalloc",