Skip to content

Commit

Permalink
perf bench: Make the mem/memcpy tests more user-friendly
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
LKML-Reference: <[email protected]>
[ v2: improved a few small details ]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
Hitoshi Mitake authored and Ingo Molnar committed Nov 22, 2009
1 parent 827f3b4 commit 12eac0b
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions tools/perf/bench/mem-memcpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand All @@ -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",
Expand All @@ -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);

Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 12eac0b

Please sign in to comment.