All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf bench: Make mem/memcpy more friendly
       [not found] <20091119072252.GA11452@elte.hu>
@ 2009-11-20  3:37 ` Hitoshi Mitake
  2009-11-22  8:43   ` [tip:perf/bench] perf bench: Make the mem/memcpy tests more user-friendly tip-bot for Hitoshi Mitake
  0 siblings, 1 reply; 2+ messages in thread
From: Hitoshi Mitake @ 2009-11-20  3:37 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Hitoshi Mitake, Peter Zijlstra, Paul Mackerras,
	Frederic Weisbecker

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 treat of error.

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>
---
 tools/perf/bench/mem-memcpy.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
index d4f4f98..1252d42 100644
--- a/tools/perf/bench/mem-memcpy.c
+++ b/tools/perf/bench/mem-memcpy.c
@@ -67,6 +67,11 @@ static struct perf_event_attr clock_attr = {
 static void init_clock(void)
 {
 	clock_fd = sys_perf_event_open(&clock_attr, getpid(), -1, -1, 0);
+	if (clock_fd < 0 && errno == ENOSYS) {
+		fprintf(stderr, "! Your Linux doesn't support perf events!\n");
+		fprintf(stderr, "! Measuring clock is impossible. Aborting.\n");
+		exit(1);
+	}
 	BUG_ON(clock_fd < 0);
 }
 
@@ -124,9 +129,17 @@ int bench_mem_memcpy(int argc, const char **argv,
 	}
 
 	dst = calloc(length, sizeof(char));
-	assert(dst);
+	if (!dst) {
+		fprintf(stderr, "Allocating memory failed.\n");
+		fprintf(stderr, "Maybe length is too large.\n");
+		exit(1);
+	}
 	src = calloc(length, sizeof(char));
-	assert(src);
+	if (!src) {
+		fprintf(stderr, "Allocating memory failed.\n");
+		fprintf(stderr, "Maybe length is too large.\n");
+		exit(1);
+	}
 
 	if (bench_format == BENCH_FORMAT_DEFAULT) {
 		printf("# Copying %s Bytes from %p to %p ...\n\n",
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [tip:perf/bench] perf bench: Make the mem/memcpy tests more user-friendly
  2009-11-20  3:37 ` [PATCH] perf bench: Make mem/memcpy more friendly Hitoshi Mitake
@ 2009-11-22  8:43   ` tip-bot for Hitoshi Mitake
  0 siblings, 0 replies; 2+ messages in thread
From: tip-bot for Hitoshi Mitake @ 2009-11-22  8:43 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, paulus, hpa, mingo, a.p.zijlstra, mitake, fweisbec,
	tglx, mingo

Commit-ID:  12eac0bf0461910ae6dd7f071f156f75461a37cf
Gitweb:     http://git.kernel.org/tip/12eac0bf0461910ae6dd7f071f156f75461a37cf
Author:     Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
AuthorDate: Fri, 20 Nov 2009 12:37:17 +0900
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Sun, 22 Nov 2009 09:41:06 +0100

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>
---
 tools/perf/bench/mem-memcpy.c |   37 ++++++++++++++++++++++---------------
 1 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/tools/perf/bench/mem-memcpy.c b/tools/perf/bench/mem-memcpy.c
index d4f4f98..5165fd1 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;
 	}
 

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-11-22  8:44 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20091119072252.GA11452@elte.hu>
2009-11-20  3:37 ` [PATCH] perf bench: Make mem/memcpy more friendly Hitoshi Mitake
2009-11-22  8:43   ` [tip:perf/bench] perf bench: Make the mem/memcpy tests more user-friendly tip-bot for Hitoshi Mitake

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.