aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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