aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-kmem.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2009-12-13 16:50:29 -0500
committerIngo Molnar <mingo@elte.hu>2009-12-14 10:57:17 -0500
commit4aa65636411ccb12f006a6ad593930655c445ff6 (patch)
tree0f494705a2a7631070a5372bb53f873684b001c2 /tools/perf/builtin-kmem.c
parentb3165f414416a717f72a376720564012af5a2e01 (diff)
perf session: Move kmaps to perf_session
There is still some more work to do to disentangle map creation from DSO loading, but this happens only for the kernel, and for the early adopters of perf diff, where this disentanglement matters most, we'll be testing different kernels, so no problem here. Further clarification: right now we create the kernel maps for the various modules and discontiguous kernel text maps when loading the DSO, we should do it as a two step process, first creating the maps, for multiple mappings with the same DSO store, then doing the dso load just once, for the first hit on one of the maps sharing this DSO backing store. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1260741029-4430-6-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-rw-r--r--tools/perf/builtin-kmem.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index de194958fe6e..e79ecbc17181 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -364,19 +364,6 @@ static struct perf_event_ops event_ops = {
364 .sample_type_check = sample_type_check, 364 .sample_type_check = sample_type_check,
365}; 365};
366 366
367static int read_events(void)
368{
369 int err;
370 struct perf_session *session = perf_session__new(input_name, O_RDONLY, 0);
371
372 if (session == NULL)
373 return -ENOMEM;
374
375 err = perf_session__process_events(session, &event_ops);
376 perf_session__delete(session);
377 return err;
378}
379
380static double fragmentation(unsigned long n_req, unsigned long n_alloc) 367static double fragmentation(unsigned long n_req, unsigned long n_alloc)
381{ 368{
382 if (n_alloc == 0) 369 if (n_alloc == 0)
@@ -385,7 +372,8 @@ static double fragmentation(unsigned long n_req, unsigned long n_alloc)
385 return 100.0 - (100.0 * n_req / n_alloc); 372 return 100.0 - (100.0 * n_req / n_alloc);
386} 373}
387 374
388static void __print_result(struct rb_root *root, int n_lines, int is_caller) 375static void __print_result(struct rb_root *root, struct perf_session *session,
376 int n_lines, int is_caller)
389{ 377{
390 struct rb_node *next; 378 struct rb_node *next;
391 379
@@ -406,7 +394,7 @@ static void __print_result(struct rb_root *root, int n_lines, int is_caller)
406 if (is_caller) { 394 if (is_caller) {
407 addr = data->call_site; 395 addr = data->call_site;
408 if (!raw_ip) 396 if (!raw_ip)
409 sym = map_groups__find_function(kmaps, addr, NULL); 397 sym = map_groups__find_function(&session->kmaps, session, addr, NULL);
410 } else 398 } else
411 addr = data->ptr; 399 addr = data->ptr;
412 400
@@ -447,12 +435,12 @@ static void print_summary(void)
447 printf("Cross CPU allocations: %lu/%lu\n", nr_cross_allocs, nr_allocs); 435 printf("Cross CPU allocations: %lu/%lu\n", nr_cross_allocs, nr_allocs);
448} 436}
449 437
450static void print_result(void) 438static void print_result(struct perf_session *session)
451{ 439{
452 if (caller_flag) 440 if (caller_flag)
453 __print_result(&root_caller_sorted, caller_lines, 1); 441 __print_result(&root_caller_sorted, session, caller_lines, 1);
454 if (alloc_flag) 442 if (alloc_flag)
455 __print_result(&root_alloc_sorted, alloc_lines, 0); 443 __print_result(&root_alloc_sorted, session, alloc_lines, 0);
456 print_summary(); 444 print_summary();
457} 445}
458 446
@@ -520,12 +508,21 @@ static void sort_result(void)
520 508
521static int __cmd_kmem(void) 509static int __cmd_kmem(void)
522{ 510{
511 int err;
512 struct perf_session *session = perf_session__new(input_name, O_RDONLY,
513 0, NULL);
514 if (session == NULL)
515 return -ENOMEM;
516
523 setup_pager(); 517 setup_pager();
524 read_events(); 518 err = perf_session__process_events(session, &event_ops);
519 if (err != 0)
520 goto out_delete;
525 sort_result(); 521 sort_result();
526 print_result(); 522 print_result(session);
527 523out_delete:
528 return 0; 524 perf_session__delete(session);
525 return err;
529} 526}
530 527
531static const char * const kmem_usage[] = { 528static const char * const kmem_usage[] = {