aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorHitoshi Mitake <mitake@dcl.info.waseda.ac.jp>2009-11-19 22:37:17 -0500
committerIngo Molnar <mingo@elte.hu>2009-11-22 03:41:06 -0500
commit12eac0bf0461910ae6dd7f071f156f75461a37cf (patch)
tree14c0b359ba8603f9bb40eb82b73c6de1acf8c1e9 /tools/perf
parent827f3b4974c5db2968d4979fe6a0ae00ab37bdd8 (diff)
perf bench: Make the mem/memcpy tests more user-friendly
mem-memcpy.c uses perf event system calls to obtain CPU clocks. And it suddenly dies with BUG_ON() when it running on Linux doesn't support perf event. Also fail at calloc() can occur easily when too large length is passed. Fail of calloc() causes sudden death with assert(). These behaviours are not friendly. So I fixed the treating of errors. Signed-off-by: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <1258688237-3797-1-git-send-email-mitake@dcl.info.waseda.ac.jp> [ v2: improved a few small details ] Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/bench/mem-memcpy.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
index d4f4f9806ae4..5165fd1d8d2c 100644
--- a/tools/perf/bench/mem-memcpy.c
+++ b/tools/perf/bench/mem-memcpy.c
@@ -22,9 +22,10 @@
22 22
23#define K 1024 23#define K 1024
24 24
25static const char *length_str = "1MB"; 25static const char *length_str = "1MB";
26static const char *routine = "default"; 26static const char *routine = "default";
27static int use_clock = 0; 27static int use_clock = 0;
28static int clock_fd;
28 29
29static const struct option options[] = { 30static const struct option options[] = {
30 OPT_STRING('l', "length", &length_str, "1MB", 31 OPT_STRING('l', "length", &length_str, "1MB",
@@ -57,17 +58,19 @@ static const char * const bench_mem_memcpy_usage[] = {
57 NULL 58 NULL
58}; 59};
59 60
60static int clock_fd;
61
62static struct perf_event_attr clock_attr = { 61static struct perf_event_attr clock_attr = {
63 .type = PERF_TYPE_HARDWARE, 62 .type = PERF_TYPE_HARDWARE,
64 .config = PERF_COUNT_HW_CPU_CYCLES 63 .config = PERF_COUNT_HW_CPU_CYCLES
65}; 64};
66 65
67static void init_clock(void) 66static void init_clock(void)
68{ 67{
69 clock_fd = sys_perf_event_open(&clock_attr, getpid(), -1, -1, 0); 68 clock_fd = sys_perf_event_open(&clock_attr, getpid(), -1, -1, 0);
70 BUG_ON(clock_fd < 0); 69
70 if (clock_fd < 0 && errno == ENOSYS)
71 die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
72 else
73 BUG_ON(clock_fd < 0);
71} 74}
72 75
73static u64 get_clock(void) 76static u64 get_clock(void)
@@ -104,7 +107,8 @@ int bench_mem_memcpy(int argc, const char **argv,
104 tv_diff.tv_sec = 0; 107 tv_diff.tv_sec = 0;
105 tv_diff.tv_usec = 0; 108 tv_diff.tv_usec = 0;
106 length = (size_t)perf_atoll((char *)length_str); 109 length = (size_t)perf_atoll((char *)length_str);
107 if ((long long int)length <= 0) { 110
111 if ((s64)length <= 0) {
108 fprintf(stderr, "Invalid length:%s\n", length_str); 112 fprintf(stderr, "Invalid length:%s\n", length_str);
109 return 1; 113 return 1;
110 } 114 }
@@ -124,9 +128,12 @@ int bench_mem_memcpy(int argc, const char **argv,
124 } 128 }
125 129
126 dst = calloc(length, sizeof(char)); 130 dst = calloc(length, sizeof(char));
127 assert(dst); 131 if (!dst)
132 die("memory allocation failed - maybe length is too large?\n");
133
128 src = calloc(length, sizeof(char)); 134 src = calloc(length, sizeof(char));
129 assert(src); 135 if (!src)
136 die("memory allocation failed - maybe length is too large?\n");
130 137
131 if (bench_format == BENCH_FORMAT_DEFAULT) { 138 if (bench_format == BENCH_FORMAT_DEFAULT) {
132 printf("# Copying %s Bytes from %p to %p ...\n\n", 139 printf("# Copying %s Bytes from %p to %p ...\n\n",
@@ -136,8 +143,9 @@ int bench_mem_memcpy(int argc, const char **argv,
136 if (use_clock) { 143 if (use_clock) {
137 init_clock(); 144 init_clock();
138 clock_start = get_clock(); 145 clock_start = get_clock();
139 } else 146 } else {
140 BUG_ON(gettimeofday(&tv_start, NULL)); 147 BUG_ON(gettimeofday(&tv_start, NULL));
148 }
141 149
142 routines[i].fn(dst, src, length); 150 routines[i].fn(dst, src, length);
143 151
@@ -176,9 +184,8 @@ int bench_mem_memcpy(int argc, const char **argv,
176 printf("%lf\n", bps); 184 printf("%lf\n", bps);
177 break; 185 break;
178 default: 186 default:
179 /* reaching here is something disaster */ 187 /* reaching this means there's some disaster: */
180 fprintf(stderr, "Unknown format:%d\n", bench_format); 188 die("unknown format: %d\n", bench_format);
181 exit(1);
182 break; 189 break;
183 } 190 }
184 191