diff options
| author | Don Zickus <dzickus@redhat.com> | 2014-04-07 14:55:23 -0400 |
|---|---|---|
| committer | Jiri Olsa <jolsa@redhat.com> | 2014-04-22 11:39:20 -0400 |
| commit | 4b6279579c84cca7f162cfbcb98f66418f3062f3 (patch) | |
| tree | 798b1f0b07d08c048bcc73a1373fad56b437a61d | |
| parent | f5b1f4e483d55a88ed120e2c62b45ba5b939fa72 (diff) | |
perf kmem: Utilize the new generic cpunode_map
Use the previous patch implementation of cpunode_map for builtin-kmem.c
Should not be any functional difference.
Signed-off-by: Don Zickus <dzickus@redhat.com>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Link: http://lkml.kernel.org/r/1396896924-129847-4-git-send-email-dzickus@redhat.com
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
| -rw-r--r-- | tools/perf/builtin-kmem.c | 78 |
1 files changed, 3 insertions, 75 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index bd91de07d2a9..f91fa4376f4b 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "util/parse-options.h" | 14 | #include "util/parse-options.h" |
| 15 | #include "util/trace-event.h" | 15 | #include "util/trace-event.h" |
| 16 | #include "util/data.h" | 16 | #include "util/data.h" |
| 17 | #include "util/cpumap.h" | ||
| 17 | 18 | ||
| 18 | #include "util/debug.h" | 19 | #include "util/debug.h" |
| 19 | 20 | ||
| @@ -31,9 +32,6 @@ static int caller_lines = -1; | |||
| 31 | 32 | ||
| 32 | static bool raw_ip; | 33 | static bool raw_ip; |
| 33 | 34 | ||
| 34 | static int *cpunode_map; | ||
| 35 | static int max_cpu_num; | ||
| 36 | |||
| 37 | struct alloc_stat { | 35 | struct alloc_stat { |
| 38 | u64 call_site; | 36 | u64 call_site; |
| 39 | u64 ptr; | 37 | u64 ptr; |
| @@ -55,76 +53,6 @@ static struct rb_root root_caller_sorted; | |||
| 55 | static unsigned long total_requested, total_allocated; | 53 | static unsigned long total_requested, total_allocated; |
| 56 | static unsigned long nr_allocs, nr_cross_allocs; | 54 | static unsigned long nr_allocs, nr_cross_allocs; |
| 57 | 55 | ||
| 58 | #define PATH_SYS_NODE "/sys/devices/system/node" | ||
| 59 | |||
| 60 | static int init_cpunode_map(void) | ||
| 61 | { | ||
| 62 | FILE *fp; | ||
| 63 | int i, err = -1; | ||
| 64 | |||
| 65 | fp = fopen("/sys/devices/system/cpu/kernel_max", "r"); | ||
| 66 | if (!fp) { | ||
| 67 | max_cpu_num = 4096; | ||
| 68 | return 0; | ||
| 69 | } | ||
| 70 | |||
| 71 | if (fscanf(fp, "%d", &max_cpu_num) < 1) { | ||
| 72 | pr_err("Failed to read 'kernel_max' from sysfs"); | ||
| 73 | goto out_close; | ||
| 74 | } | ||
| 75 | |||
| 76 | max_cpu_num++; | ||
| 77 | |||
| 78 | cpunode_map = calloc(max_cpu_num, sizeof(int)); | ||
| 79 | if (!cpunode_map) { | ||
| 80 | pr_err("%s: calloc failed\n", __func__); | ||
| 81 | goto out_close; | ||
| 82 | } | ||
| 83 | |||
| 84 | for (i = 0; i < max_cpu_num; i++) | ||
| 85 | cpunode_map[i] = -1; | ||
| 86 | |||
| 87 | err = 0; | ||
| 88 | out_close: | ||
| 89 | fclose(fp); | ||
| 90 | return err; | ||
| 91 | } | ||
| 92 | |||
| 93 | static int setup_cpunode_map(void) | ||
| 94 | { | ||
| 95 | struct dirent *dent1, *dent2; | ||
| 96 | DIR *dir1, *dir2; | ||
| 97 | unsigned int cpu, mem; | ||
| 98 | char buf[PATH_MAX]; | ||
| 99 | |||
| 100 | if (init_cpunode_map()) | ||
| 101 | return -1; | ||
| 102 | |||
| 103 | dir1 = opendir(PATH_SYS_NODE); | ||
| 104 | if (!dir1) | ||
| 105 | return 0; | ||
| 106 | |||
| 107 | while ((dent1 = readdir(dir1)) != NULL) { | ||
| 108 | if (dent1->d_type != DT_DIR || | ||
| 109 | sscanf(dent1->d_name, "node%u", &mem) < 1) | ||
| 110 | continue; | ||
| 111 | |||
| 112 | snprintf(buf, PATH_MAX, "%s/%s", PATH_SYS_NODE, dent1->d_name); | ||
| 113 | dir2 = opendir(buf); | ||
| 114 | if (!dir2) | ||
| 115 | continue; | ||
| 116 | while ((dent2 = readdir(dir2)) != NULL) { | ||
| 117 | if (dent2->d_type != DT_LNK || | ||
| 118 | sscanf(dent2->d_name, "cpu%u", &cpu) < 1) | ||
| 119 | continue; | ||
| 120 | cpunode_map[cpu] = mem; | ||
| 121 | } | ||
| 122 | closedir(dir2); | ||
| 123 | } | ||
| 124 | closedir(dir1); | ||
| 125 | return 0; | ||
| 126 | } | ||
| 127 | |||
| 128 | static int insert_alloc_stat(unsigned long call_site, unsigned long ptr, | 56 | static int insert_alloc_stat(unsigned long call_site, unsigned long ptr, |
| 129 | int bytes_req, int bytes_alloc, int cpu) | 57 | int bytes_req, int bytes_alloc, int cpu) |
| 130 | { | 58 | { |
| @@ -235,7 +163,7 @@ static int perf_evsel__process_alloc_node_event(struct perf_evsel *evsel, | |||
| 235 | int ret = perf_evsel__process_alloc_event(evsel, sample); | 163 | int ret = perf_evsel__process_alloc_event(evsel, sample); |
| 236 | 164 | ||
| 237 | if (!ret) { | 165 | if (!ret) { |
| 238 | int node1 = cpunode_map[sample->cpu], | 166 | int node1 = cpu__get_node(sample->cpu), |
| 239 | node2 = perf_evsel__intval(evsel, sample, "node"); | 167 | node2 = perf_evsel__intval(evsel, sample, "node"); |
| 240 | 168 | ||
| 241 | if (node1 != node2) | 169 | if (node1 != node2) |
| @@ -772,7 +700,7 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 772 | if (!strncmp(argv[0], "rec", 3)) { | 700 | if (!strncmp(argv[0], "rec", 3)) { |
| 773 | return __cmd_record(argc, argv); | 701 | return __cmd_record(argc, argv); |
| 774 | } else if (!strcmp(argv[0], "stat")) { | 702 | } else if (!strcmp(argv[0], "stat")) { |
| 775 | if (setup_cpunode_map()) | 703 | if (cpu__setup_cpunode_map()) |
| 776 | return -1; | 704 | return -1; |
| 777 | 705 | ||
| 778 | if (list_empty(&caller_sort)) | 706 | if (list_empty(&caller_sort)) |
