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 /tools/perf/builtin-kmem.c | |
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>
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-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)) |