Commit b1a901e0 authored by Ilpo Järvinen's avatar Ilpo Järvinen Committed by Shuah Khan
Browse files

selftests/resctrl: Simplify span lifetime



struct resctrl_val_param contains span member. resctrl_val(), however,
never uses it because the value of span is embedded into the default
benchmark command and parsed from it by run_benchmark().

Remove span from resctrl_val_param. Provide DEFAULT_SPAN for the code
that needs it. CMT and CAT tests communicate span that is different
from the DEFAULT_SPAN between their internal functions which is
converted into passing it directly as a parameter.

Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tested-by: default avatarShaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Reviewed-by: default avatarShaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Reviewed-by: default avatar"Wieczor-Retman, Maciej" <maciej.wieczor-retman@intel.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 47e36f16
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -205,10 +205,11 @@ int measure_cache_vals(struct resctrl_val_param *param, int bm_pid)
 * cache_val:		execute benchmark and measure LLC occupancy resctrl
 * and perf cache miss for the benchmark
 * @param:		parameters passed to cache_val()
 * @span:		buffer size for the benchmark
 *
 * Return:		0 on success. non-zero on failure.
 */
int cat_val(struct resctrl_val_param *param)
int cat_val(struct resctrl_val_param *param, size_t span)
{
	int memflush = 1, operation = 0, ret = 0;
	char *resctrl_val = param->resctrl_val;
@@ -245,7 +246,7 @@ int cat_val(struct resctrl_val_param *param)
		if (ret)
			break;

		if (run_fill_buf(param->span, memflush, operation, true)) {
		if (run_fill_buf(span, memflush, operation, true)) {
			fprintf(stderr, "Error-running fill buffer\n");
			ret = -1;
			goto pe_close;
+7 −6
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ static int cat_setup(struct resctrl_val_param *p)
	return ret;
}

static int check_results(struct resctrl_val_param *param)
static int check_results(struct resctrl_val_param *param, size_t span)
{
	char *token_array[8], temp[512];
	unsigned long sum_llc_perf_miss = 0;
@@ -76,7 +76,7 @@ static int check_results(struct resctrl_val_param *param)
	fclose(fp);
	no_of_bits = count_bits(param->mask);

	return show_cache_info(sum_llc_perf_miss, no_of_bits, param->span / 64,
	return show_cache_info(sum_llc_perf_miss, no_of_bits, span / 64,
			       MAX_DIFF, MAX_DIFF_PERCENT, runs - 1,
			       get_vendor() == ARCH_INTEL, false);
}
@@ -96,6 +96,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
	char cbm_mask[256];
	int count_of_bits;
	char pipe_message;
	size_t span;

	/* Get default cbm mask for L3/L2 cache */
	ret = get_cbm_mask(cache_type, cbm_mask);
@@ -140,7 +141,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
	/* Set param values for parent thread which will be allocated bitmask
	 * with (max_bits - n) bits
	 */
	param.span = cache_size * (count_of_bits - n) / count_of_bits;
	span = cache_size * (count_of_bits - n) / count_of_bits;
	strcpy(param.ctrlgrp, "c2");
	strcpy(param.mongrp, "m2");
	strcpy(param.filename, RESULT_FILE_NAME2);
@@ -162,7 +163,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
		param.mask = l_mask_1;
		strcpy(param.ctrlgrp, "c1");
		strcpy(param.mongrp, "m1");
		param.span = cache_size * n / count_of_bits;
		span = cache_size * n / count_of_bits;
		strcpy(param.filename, RESULT_FILE_NAME1);
		param.num_of_runs = 0;
		param.cpu_no = sibling_cpu_no;
@@ -176,9 +177,9 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)

	remove(param.filename);

	ret = cat_val(&param);
	ret = cat_val(&param, span);
	if (ret == 0)
		ret = check_results(&param);
		ret = check_results(&param, span);

	if (bm_pid == 0) {
		/* Tell parent that child is ready */
+6 −5
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ static int cmt_setup(struct resctrl_val_param *p)
	return 0;
}

static int check_results(struct resctrl_val_param *param, int no_of_bits)
static int check_results(struct resctrl_val_param *param, size_t span, int no_of_bits)
{
	char *token_array[8], temp[512];
	unsigned long sum_llc_occu_resc = 0;
@@ -58,7 +58,7 @@ static int check_results(struct resctrl_val_param *param, int no_of_bits)
	}
	fclose(fp);

	return show_cache_info(sum_llc_occu_resc, no_of_bits, param->span,
	return show_cache_info(sum_llc_occu_resc, no_of_bits, span,
			       MAX_DIFF, MAX_DIFF_PERCENT, runs - 1,
			       true, true);
}
@@ -74,6 +74,7 @@ int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
	unsigned long long_mask;
	char cbm_mask[256];
	int count_of_bits;
	size_t span;
	int ret;

	if (!validate_resctrl_feature_request(CMT_STR))
@@ -105,13 +106,13 @@ int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
		.cpu_no		= cpu_no,
		.filename	= RESULT_FILE_NAME,
		.mask		= ~(long_mask << n) & long_mask,
		.span		= cache_size * n / count_of_bits,
		.num_of_runs	= 0,
		.setup		= cmt_setup,
	};

	span = cache_size * n / count_of_bits;
	if (strcmp(benchmark_cmd[0], "fill_buf") == 0)
		sprintf(benchmark_cmd[1], "%zu", param.span);
		sprintf(benchmark_cmd[1], "%zu", span);

	remove(RESULT_FILE_NAME);

@@ -119,7 +120,7 @@ int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd)
	if (ret)
		goto out;

	ret = check_results(&param, n);
	ret = check_results(&param, span, n);

out:
	cmt_test_cleanup();
+2 −3
Original line number Diff line number Diff line
@@ -109,13 +109,12 @@ void mbm_test_cleanup(void)
	remove(RESULT_FILE_NAME);
}

int mbm_bw_change(size_t span, int cpu_no, char **benchmark_cmd)
int mbm_bw_change(int cpu_no, char **benchmark_cmd)
{
	struct resctrl_val_param param = {
		.resctrl_val	= MBM_STR,
		.ctrlgrp	= "c1",
		.mongrp		= "m1",
		.span		= span,
		.cpu_no		= cpu_no,
		.filename	= RESULT_FILE_NAME,
		.bw_report	= "reads",
@@ -129,7 +128,7 @@ int mbm_bw_change(size_t span, int cpu_no, char **benchmark_cmd)
	if (ret)
		goto out;

	ret = check_results(span);
	ret = check_results(DEFAULT_SPAN);

out:
	mbm_test_cleanup();
+4 −4
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@

#define END_OF_TESTS	1

#define DEFAULT_SPAN		(250 * MB)

#define PARENT_EXIT(err_msg)			\
	do {					\
		perror(err_msg);		\
@@ -52,7 +54,6 @@
 * @ctrlgrp:		Name of the control monitor group (con_mon grp)
 * @mongrp:		Name of the monitor group (mon grp)
 * @cpu_no:		CPU number to which the benchmark would be binded
 * @span:		Memory bytes accessed in each benchmark iteration
 * @filename:		Name of file to which the o/p should be written
 * @bw_report:		Bandwidth report type (reads vs writes)
 * @setup:		Call back function to setup test environment
@@ -62,7 +63,6 @@ struct resctrl_val_param {
	char		ctrlgrp[64];
	char		mongrp[64];
	int		cpu_no;
	size_t		span;
	char		filename[64];
	char		*bw_report;
	unsigned long	mask;
@@ -98,7 +98,7 @@ int perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu,
		    int group_fd, unsigned long flags);
int run_fill_buf(size_t span, int memflush, int op, bool once);
int resctrl_val(char **benchmark_cmd, struct resctrl_val_param *param);
int mbm_bw_change(size_t span, int cpu_no, char **benchmark_cmd);
int mbm_bw_change(int cpu_no, char **benchmark_cmd);
void tests_cleanup(void);
void mbm_test_cleanup(void);
int mba_schemata_change(int cpu_no, char **benchmark_cmd);
@@ -108,7 +108,7 @@ int get_cache_size(int cpu_no, char *cache_type, unsigned long *cache_size);
void ctrlc_handler(int signum, siginfo_t *info, void *ptr);
int signal_handler_register(void);
void signal_handler_unregister(void);
int cat_val(struct resctrl_val_param *param);
int cat_val(struct resctrl_val_param *param, size_t span);
void cat_test_cleanup(void);
int cat_perf_miss_val(int cpu_no, int no_of_bits, char *cache_type);
int cmt_resctrl_val(int cpu_no, int n, char **benchmark_cmd);
Loading