Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 515e23f0 authored by Borislav Petkov's avatar Borislav Petkov
Browse files

perf/bench: Carve out mem routine benchmarking



... so that we can call it multiple times. See next patch.

Reviewed-by: default avatarHitoshi Mitake <mitake.hitoshi@lab.ntt.co.jp>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
parent 0cf55934
Loading
Loading
Loading
Loading
+58 −62
Original line number Original line Diff line number Diff line
@@ -135,84 +135,32 @@ struct bench_mem_info {
	const char *const *usage;
	const char *const *usage;
};
};


static int bench_mem_common(int argc, const char **argv,
static void __bench_mem_routine(struct bench_mem_info *info, int r_idx, size_t len, double totallen)
		     const char *prefix __maybe_unused,
		     struct bench_mem_info *info)
{
{
	int i;
	const struct routine *r = &info->routines[r_idx];
	size_t len;
	double totallen;
	double result_bps[2];
	double result_bps[2];
	u64 result_cycle[2];
	u64 result_cycle[2];


	argc = parse_options(argc, argv, options,
			     info->usage, 0);

	if (no_prefault && only_prefault) {
		fprintf(stderr, "Invalid options: -o and -n are mutually exclusive\n");
		return 1;
	}

	if (use_cycle)
		init_cycle();

	len = (size_t)perf_atoll((char *)length_str);
	totallen = (double)len * iterations;

	result_cycle[0] = result_cycle[1] = 0ULL;
	result_cycle[0] = result_cycle[1] = 0ULL;
	result_bps[0] = result_bps[1] = 0.0;
	result_bps[0] = result_bps[1] = 0.0;


	if ((s64)len <= 0) {
		fprintf(stderr, "Invalid length:%s\n", length_str);
		return 1;
	}

	/* same to without specifying either of prefault and no-prefault */
	if (only_prefault && no_prefault)
		only_prefault = no_prefault = false;

	for (i = 0; info->routines[i].name; i++) {
		if (!strcmp(info->routines[i].name, routine))
			break;
	}
	if (!info->routines[i].name) {
		printf("Unknown routine:%s\n", routine);
		printf("Available routines...\n");
		for (i = 0; info->routines[i].name; i++) {
			printf("\t%s ... %s\n",
			       info->routines[i].name, info->routines[i].desc);
		}
		return 1;
	}

	if (bench_format == BENCH_FORMAT_DEFAULT)
	if (bench_format == BENCH_FORMAT_DEFAULT)
		printf("# Copying %s Bytes ...\n\n", length_str);
		printf("# Copying %s Bytes ...\n\n", length_str);


	if (!only_prefault && !no_prefault) {
	if (!only_prefault && !no_prefault) {
		/* show both of results */
		/* show both of results */
		if (use_cycle) {
		if (use_cycle) {
			result_cycle[0] =
			result_cycle[0] = info->do_cycle(r, len, false);
				info->do_cycle(&info->routines[i], len, false);
			result_cycle[1] = info->do_cycle(r, len, true);
			result_cycle[1] =
				info->do_cycle(&info->routines[i], len, true);
		} else {
		} else {
			result_bps[0] =
			result_bps[0]   = info->do_gettimeofday(r, len, false);
				info->do_gettimeofday(&info->routines[i],
			result_bps[1]   = info->do_gettimeofday(r, len, true);
						len, false);
			result_bps[1] =
				info->do_gettimeofday(&info->routines[i],
						len, true);
		}
		}
	} else {
	} else {
		if (use_cycle) {
		if (use_cycle)
			result_cycle[pf] =
			result_cycle[pf] = info->do_cycle(r, len, only_prefault);
				info->do_cycle(&info->routines[i],
		else
						len, only_prefault);
			result_bps[pf] = info->do_gettimeofday(r, len, only_prefault);
		} else {
			result_bps[pf] =
				info->do_gettimeofday(&info->routines[i],
						len, only_prefault);
		}
	}
	}


	switch (bench_format) {
	switch (bench_format) {
@@ -265,6 +213,54 @@ static int bench_mem_common(int argc, const char **argv,
		die("unknown format: %d\n", bench_format);
		die("unknown format: %d\n", bench_format);
		break;
		break;
	}
	}
}

static int bench_mem_common(int argc, const char **argv,
		     const char *prefix __maybe_unused,
		     struct bench_mem_info *info)
{
	int i;
	size_t len;
	double totallen;

	argc = parse_options(argc, argv, options,
			     info->usage, 0);

	if (no_prefault && only_prefault) {
		fprintf(stderr, "Invalid options: -o and -n are mutually exclusive\n");
		return 1;
	}

	if (use_cycle)
		init_cycle();

	len = (size_t)perf_atoll((char *)length_str);
	totallen = (double)len * iterations;

	if ((s64)len <= 0) {
		fprintf(stderr, "Invalid length:%s\n", length_str);
		return 1;
	}

	/* same to without specifying either of prefault and no-prefault */
	if (only_prefault && no_prefault)
		only_prefault = no_prefault = false;

	for (i = 0; info->routines[i].name; i++) {
		if (!strcmp(info->routines[i].name, routine))
			break;
	}
	if (!info->routines[i].name) {
		printf("Unknown routine:%s\n", routine);
		printf("Available routines...\n");
		for (i = 0; info->routines[i].name; i++) {
			printf("\t%s ... %s\n",
			       info->routines[i].name, info->routines[i].desc);
		}
		return 1;
	}

	__bench_mem_routine(info, i, len, totallen);


	return 0;
	return 0;
}
}