diff options
Diffstat (limited to 'tools/perf/bench/mem-memcpy.c')
-rw-r--r-- | tools/perf/bench/mem-memcpy.c | 128 |
1 files changed, 66 insertions, 62 deletions
diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c index db1d3a29d97f..d3dfb7936dcd 100644 --- a/tools/perf/bench/mem-memcpy.c +++ b/tools/perf/bench/mem-memcpy.c | |||
@@ -36,7 +36,7 @@ static const struct option options[] = { | |||
36 | "Specify length of memory to copy. " | 36 | "Specify length of memory to copy. " |
37 | "Available units: B, KB, MB, GB and TB (upper and lower)"), | 37 | "Available units: B, KB, MB, GB and TB (upper and lower)"), |
38 | OPT_STRING('r', "routine", &routine, "default", | 38 | OPT_STRING('r', "routine", &routine, "default", |
39 | "Specify routine to copy"), | 39 | "Specify routine to copy, \"all\" runs all available routines"), |
40 | OPT_INTEGER('i', "iterations", &iterations, | 40 | OPT_INTEGER('i', "iterations", &iterations, |
41 | "repeat memcpy() invocation this number of times"), | 41 | "repeat memcpy() invocation this number of times"), |
42 | OPT_BOOLEAN('c', "cycle", &use_cycle, | 42 | OPT_BOOLEAN('c', "cycle", &use_cycle, |
@@ -135,55 +135,16 @@ struct bench_mem_info { | |||
135 | const char *const *usage; | 135 | const char *const *usage; |
136 | }; | 136 | }; |
137 | 137 | ||
138 | static int bench_mem_common(int argc, const char **argv, | 138 | static void __bench_mem_routine(struct bench_mem_info *info, int r_idx, size_t len, double totallen) |
139 | const char *prefix __maybe_unused, | ||
140 | struct bench_mem_info *info) | ||
141 | { | 139 | { |
142 | int i; | 140 | const struct routine *r = &info->routines[r_idx]; |
143 | size_t len; | ||
144 | double totallen; | ||
145 | double result_bps[2]; | 141 | double result_bps[2]; |
146 | u64 result_cycle[2]; | 142 | u64 result_cycle[2]; |
147 | 143 | ||
148 | argc = parse_options(argc, argv, options, | ||
149 | info->usage, 0); | ||
150 | |||
151 | if (no_prefault && only_prefault) { | ||
152 | fprintf(stderr, "Invalid options: -o and -n are mutually exclusive\n"); | ||
153 | return 1; | ||
154 | } | ||
155 | |||
156 | if (use_cycle) | ||
157 | init_cycle(); | ||
158 | |||
159 | len = (size_t)perf_atoll((char *)length_str); | ||
160 | totallen = (double)len * iterations; | ||
161 | |||
162 | result_cycle[0] = result_cycle[1] = 0ULL; | 144 | result_cycle[0] = result_cycle[1] = 0ULL; |
163 | result_bps[0] = result_bps[1] = 0.0; | 145 | result_bps[0] = result_bps[1] = 0.0; |
164 | 146 | ||
165 | if ((s64)len <= 0) { | 147 | printf("Routine %s (%s)\n", r->name, r->desc); |
166 | fprintf(stderr, "Invalid length:%s\n", length_str); | ||
167 | return 1; | ||
168 | } | ||
169 | |||
170 | /* same to without specifying either of prefault and no-prefault */ | ||
171 | if (only_prefault && no_prefault) | ||
172 | only_prefault = no_prefault = false; | ||
173 | |||
174 | for (i = 0; info->routines[i].name; i++) { | ||
175 | if (!strcmp(info->routines[i].name, routine)) | ||
176 | break; | ||
177 | } | ||
178 | if (!info->routines[i].name) { | ||
179 | printf("Unknown routine:%s\n", routine); | ||
180 | printf("Available routines...\n"); | ||
181 | for (i = 0; info->routines[i].name; i++) { | ||
182 | printf("\t%s ... %s\n", | ||
183 | info->routines[i].name, info->routines[i].desc); | ||
184 | } | ||
185 | return 1; | ||
186 | } | ||
187 | 148 | ||
188 | if (bench_format == BENCH_FORMAT_DEFAULT) | 149 | if (bench_format == BENCH_FORMAT_DEFAULT) |
189 | printf("# Copying %s Bytes ...\n\n", length_str); | 150 | printf("# Copying %s Bytes ...\n\n", length_str); |
@@ -191,28 +152,17 @@ static int bench_mem_common(int argc, const char **argv, | |||
191 | if (!only_prefault && !no_prefault) { | 152 | if (!only_prefault && !no_prefault) { |
192 | /* show both of results */ | 153 | /* show both of results */ |
193 | if (use_cycle) { | 154 | if (use_cycle) { |
194 | result_cycle[0] = | 155 | result_cycle[0] = info->do_cycle(r, len, false); |
195 | info->do_cycle(&info->routines[i], len, false); | 156 | result_cycle[1] = info->do_cycle(r, len, true); |
196 | result_cycle[1] = | ||
197 | info->do_cycle(&info->routines[i], len, true); | ||
198 | } else { | 157 | } else { |
199 | result_bps[0] = | 158 | result_bps[0] = info->do_gettimeofday(r, len, false); |
200 | info->do_gettimeofday(&info->routines[i], | 159 | result_bps[1] = info->do_gettimeofday(r, len, true); |
201 | len, false); | ||
202 | result_bps[1] = | ||
203 | info->do_gettimeofday(&info->routines[i], | ||
204 | len, true); | ||
205 | } | 160 | } |
206 | } else { | 161 | } else { |
207 | if (use_cycle) { | 162 | if (use_cycle) |
208 | result_cycle[pf] = | 163 | result_cycle[pf] = info->do_cycle(r, len, only_prefault); |
209 | info->do_cycle(&info->routines[i], | 164 | else |
210 | len, only_prefault); | 165 | result_bps[pf] = info->do_gettimeofday(r, len, only_prefault); |
211 | } else { | ||
212 | result_bps[pf] = | ||
213 | info->do_gettimeofday(&info->routines[i], | ||
214 | len, only_prefault); | ||
215 | } | ||
216 | } | 166 | } |
217 | 167 | ||
218 | switch (bench_format) { | 168 | switch (bench_format) { |
@@ -265,6 +215,60 @@ static int bench_mem_common(int argc, const char **argv, | |||
265 | die("unknown format: %d\n", bench_format); | 215 | die("unknown format: %d\n", bench_format); |
266 | break; | 216 | break; |
267 | } | 217 | } |
218 | } | ||
219 | |||
220 | static int bench_mem_common(int argc, const char **argv, | ||
221 | const char *prefix __maybe_unused, | ||
222 | struct bench_mem_info *info) | ||
223 | { | ||
224 | int i; | ||
225 | size_t len; | ||
226 | double totallen; | ||
227 | |||
228 | argc = parse_options(argc, argv, options, | ||
229 | info->usage, 0); | ||
230 | |||
231 | if (no_prefault && only_prefault) { | ||
232 | fprintf(stderr, "Invalid options: -o and -n are mutually exclusive\n"); | ||
233 | return 1; | ||
234 | } | ||
235 | |||
236 | if (use_cycle) | ||
237 | init_cycle(); | ||
238 | |||
239 | len = (size_t)perf_atoll((char *)length_str); | ||
240 | totallen = (double)len * iterations; | ||
241 | |||
242 | if ((s64)len <= 0) { | ||
243 | fprintf(stderr, "Invalid length:%s\n", length_str); | ||
244 | return 1; | ||
245 | } | ||
246 | |||
247 | /* same to without specifying either of prefault and no-prefault */ | ||
248 | if (only_prefault && no_prefault) | ||
249 | only_prefault = no_prefault = false; | ||
250 | |||
251 | if (!strncmp(routine, "all", 3)) { | ||
252 | for (i = 0; info->routines[i].name; i++) | ||
253 | __bench_mem_routine(info, i, len, totallen); | ||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | for (i = 0; info->routines[i].name; i++) { | ||
258 | if (!strcmp(info->routines[i].name, routine)) | ||
259 | break; | ||
260 | } | ||
261 | if (!info->routines[i].name) { | ||
262 | printf("Unknown routine:%s\n", routine); | ||
263 | printf("Available routines...\n"); | ||
264 | for (i = 0; info->routines[i].name; i++) { | ||
265 | printf("\t%s ... %s\n", | ||
266 | info->routines[i].name, info->routines[i].desc); | ||
267 | } | ||
268 | return 1; | ||
269 | } | ||
270 | |||
271 | __bench_mem_routine(info, i, len, totallen); | ||
268 | 272 | ||
269 | return 0; | 273 | return 0; |
270 | } | 274 | } |