summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHitoshi Mitake <mitake@dcl.info.waseda.ac.jp>2009-11-20 12:37:17 +0900
committerIngo Molnar <mingo@elte.hu>2009-11-22 09:41:06 +0100
commit12eac0bf0461910ae6dd7f071f156f75461a37cf (patch)
tree14c0b359ba8603f9bb40eb82b73c6de1acf8c1e9
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>
-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 @@
#define K 1024
-static const char *length_str = "1MB";
-static const char *routine = "default";
-static int use_clock = 0;
+static const char *length_str = "1MB";
+static const char *routine = "default";
+static int use_clock = 0;
+static int clock_fd;
static const struct option options[] = {
OPT_STRING('l', "length", &length_str, "1MB",
@@ -57,17 +58,19 @@ static const char * const bench_mem_memcpy_usage[] = {
NULL
};
-static int clock_fd;
-
static struct perf_event_attr clock_attr = {
- .type = PERF_TYPE_HARDWARE,
- .config = PERF_COUNT_HW_CPU_CYCLES
+ .type = PERF_TYPE_HARDWARE,
+ .config = PERF_COUNT_HW_CPU_CYCLES
};
static void init_clock(void)
{
clock_fd = sys_perf_event_open(&clock_attr, getpid(), -1, -1, 0);
- BUG_ON(clock_fd < 0);
+
+ if (clock_fd < 0 && errno == ENOSYS)
+ die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
+ else
+ BUG_ON(clock_fd < 0);
}
static u64 get_clock(void)
@@ -104,7 +107,8 @@ int bench_mem_memcpy(int argc, const char **argv,
tv_diff.tv_sec = 0;
tv_diff.tv_usec = 0;
length = (size_t)perf_atoll((char *)length_str);
- if ((long long int)length <= 0) {
+
+ if ((s64)length <= 0) {
fprintf(stderr, "Invalid length:%s\n", length_str);
return 1;
}
@@ -124,9 +128,12 @@ int bench_mem_memcpy(int argc, const char **argv,
}
dst = calloc(length, sizeof(char));
- assert(dst);
+ if (!dst)
+ die("memory allocation failed - maybe length is too large?\n");
+
src = calloc(length, sizeof(char));
- assert(src);
+ if (!src)
+ die("memory allocation failed - maybe length is too large?\n");
if (bench_format == BENCH_FORMAT_DEFAULT) {
printf("# Copying %s Bytes from %p to %p ...\n\n",
@@ -136,8 +143,9 @@ int bench_mem_memcpy(int argc, const char **argv,
if (use_clock) {
init_clock();
clock_start = get_clock();
- } else
+ } else {
BUG_ON(gettimeofday(&tv_start, NULL));
+ }
routines[i].fn(dst, src, length);
@@ -176,9 +184,8 @@ int bench_mem_memcpy(int argc, const char **argv,
printf("%lf\n", bps);
break;
default:
- /* reaching here is something disaster */
- fprintf(stderr, "Unknown format:%d\n", bench_format);
- exit(1);
+ /* reaching this means there's some disaster: */
+ die("unknown format: %d\n", bench_format);
break;
}