diff options
| -rw-r--r-- | tools/perf/Documentation/perf-kmem.txt | 13 | ||||
| -rw-r--r-- | tools/perf/builtin-kmem.c | 52 |
2 files changed, 37 insertions, 28 deletions
diff --git a/tools/perf/Documentation/perf-kmem.txt b/tools/perf/Documentation/perf-kmem.txt index 44b0ce35c28a..eac4d852e7cd 100644 --- a/tools/perf/Documentation/perf-kmem.txt +++ b/tools/perf/Documentation/perf-kmem.txt | |||
| @@ -8,16 +8,16 @@ perf-kmem - Tool to trace/measure kernel memory(slab) properties | |||
| 8 | SYNOPSIS | 8 | SYNOPSIS |
| 9 | -------- | 9 | -------- |
| 10 | [verse] | 10 | [verse] |
| 11 | 'perf kmem' {record} [<options>] | 11 | 'perf kmem' {record|stat} [<options>] |
| 12 | 12 | ||
| 13 | DESCRIPTION | 13 | DESCRIPTION |
| 14 | ----------- | 14 | ----------- |
| 15 | There's two variants of perf kmem: | 15 | There are two variants of perf kmem: |
| 16 | 16 | ||
| 17 | 'perf kmem record <command>' to record the kmem events | 17 | 'perf kmem record <command>' to record the kmem events |
| 18 | of an arbitrary workload. | 18 | of an arbitrary workload. |
| 19 | 19 | ||
| 20 | 'perf kmem' to report kernel memory statistics. | 20 | 'perf kmem stat' to report kernel memory statistics. |
| 21 | 21 | ||
| 22 | OPTIONS | 22 | OPTIONS |
| 23 | ------- | 23 | ------- |
| @@ -25,8 +25,11 @@ OPTIONS | |||
| 25 | --input=<file>:: | 25 | --input=<file>:: |
| 26 | Select the input file (default: perf.data) | 26 | Select the input file (default: perf.data) |
| 27 | 27 | ||
| 28 | --stat=<caller|alloc>:: | 28 | --caller:: |
| 29 | Select per callsite or per allocation statistics | 29 | Show per-callsite statistics |
| 30 | |||
| 31 | --alloc:: | ||
| 32 | Show per-allocation statistics | ||
| 30 | 33 | ||
| 31 | -s <key[,key2...]>:: | 34 | -s <key[,key2...]>:: |
| 32 | --sort=<key[,key2...]>:: | 35 | --sort=<key[,key2...]>:: |
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 7551a5f834b8..1b04787ed90a 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
| @@ -526,7 +526,7 @@ static int __cmd_kmem(void) | |||
| 526 | } | 526 | } |
| 527 | 527 | ||
| 528 | static const char * const kmem_usage[] = { | 528 | static const char * const kmem_usage[] = { |
| 529 | "perf kmem [<options>] {record}", | 529 | "perf kmem [<options>] {record|stat}", |
| 530 | NULL | 530 | NULL |
| 531 | }; | 531 | }; |
| 532 | 532 | ||
| @@ -686,18 +686,17 @@ static int parse_sort_opt(const struct option *opt __used, | |||
| 686 | return 0; | 686 | return 0; |
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | static int parse_stat_opt(const struct option *opt __used, | 689 | static int parse_caller_opt(const struct option *opt __used, |
| 690 | const char *arg, int unset __used) | 690 | const char *arg, int unset __used) |
| 691 | { | 691 | { |
| 692 | if (!arg) | 692 | caller_flag = (alloc_flag + 1); |
| 693 | return -1; | 693 | return 0; |
| 694 | } | ||
| 694 | 695 | ||
| 695 | if (strcmp(arg, "alloc") == 0) | 696 | static int parse_alloc_opt(const struct option *opt __used, |
| 696 | alloc_flag = (caller_flag + 1); | 697 | const char *arg, int unset __used) |
| 697 | else if (strcmp(arg, "caller") == 0) | 698 | { |
| 698 | caller_flag = (alloc_flag + 1); | 699 | alloc_flag = (caller_flag + 1); |
| 699 | else | ||
| 700 | return -1; | ||
| 701 | return 0; | 700 | return 0; |
| 702 | } | 701 | } |
| 703 | 702 | ||
| @@ -722,14 +721,17 @@ static int parse_line_opt(const struct option *opt __used, | |||
| 722 | static const struct option kmem_options[] = { | 721 | static const struct option kmem_options[] = { |
| 723 | OPT_STRING('i', "input", &input_name, "file", | 722 | OPT_STRING('i', "input", &input_name, "file", |
| 724 | "input file name"), | 723 | "input file name"), |
| 725 | OPT_CALLBACK(0, "stat", NULL, "<alloc>|<caller>", | 724 | OPT_CALLBACK_NOOPT(0, "caller", NULL, NULL, |
| 726 | "stat selector, Pass 'alloc' or 'caller'.", | 725 | "show per-callsite statistics", |
| 727 | parse_stat_opt), | 726 | parse_caller_opt), |
| 727 | OPT_CALLBACK_NOOPT(0, "alloc", NULL, NULL, | ||
| 728 | "show per-allocation statistics", | ||
| 729 | parse_alloc_opt), | ||
| 728 | OPT_CALLBACK('s', "sort", NULL, "key[,key2...]", | 730 | OPT_CALLBACK('s', "sort", NULL, "key[,key2...]", |
| 729 | "sort by keys: ptr, call_site, bytes, hit, pingpong, frag", | 731 | "sort by keys: ptr, call_site, bytes, hit, pingpong, frag", |
| 730 | parse_sort_opt), | 732 | parse_sort_opt), |
| 731 | OPT_CALLBACK('l', "line", NULL, "num", | 733 | OPT_CALLBACK('l', "line", NULL, "num", |
| 732 | "show n lins", | 734 | "show n lines", |
| 733 | parse_line_opt), | 735 | parse_line_opt), |
| 734 | OPT_BOOLEAN(0, "raw-ip", &raw_ip, "show raw ip instead of symbol"), | 736 | OPT_BOOLEAN(0, "raw-ip", &raw_ip, "show raw ip instead of symbol"), |
| 735 | OPT_END() | 737 | OPT_END() |
| @@ -773,18 +775,22 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __used) | |||
| 773 | 775 | ||
| 774 | argc = parse_options(argc, argv, kmem_options, kmem_usage, 0); | 776 | argc = parse_options(argc, argv, kmem_options, kmem_usage, 0); |
| 775 | 777 | ||
| 776 | if (argc && !strncmp(argv[0], "rec", 3)) | 778 | if (!argc) |
| 777 | return __cmd_record(argc, argv); | ||
| 778 | else if (argc) | ||
| 779 | usage_with_options(kmem_usage, kmem_options); | 779 | usage_with_options(kmem_usage, kmem_options); |
| 780 | 780 | ||
| 781 | if (list_empty(&caller_sort)) | 781 | if (!strncmp(argv[0], "rec", 3)) { |
| 782 | setup_sorting(&caller_sort, default_sort_order); | 782 | return __cmd_record(argc, argv); |
| 783 | if (list_empty(&alloc_sort)) | 783 | } else if (!strcmp(argv[0], "stat")) { |
| 784 | setup_sorting(&alloc_sort, default_sort_order); | 784 | setup_cpunode_map(); |
| 785 | |||
| 786 | if (list_empty(&caller_sort)) | ||
| 787 | setup_sorting(&caller_sort, default_sort_order); | ||
| 788 | if (list_empty(&alloc_sort)) | ||
| 789 | setup_sorting(&alloc_sort, default_sort_order); | ||
| 785 | 790 | ||
| 786 | setup_cpunode_map(); | 791 | return __cmd_kmem(); |
| 792 | } | ||
| 787 | 793 | ||
| 788 | return __cmd_kmem(); | 794 | return 0; |
| 789 | } | 795 | } |
| 790 | 796 | ||
