mirror of
https://github.com/torvalds/linux
synced 2024-09-29 07:50:45 +00:00
selftests/resctrl: Add ->measure() callback to resctrl_val_param
The measurement done in resctrl_val() varies depending on test type. The decision for how to measure is decided based on the string compare to test name which is quite inflexible. Add ->measure() callback into the struct resctrl_val_param to allow each test to provide necessary code as a function which simplifies what resctrl_val() has to do. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Tested-by: Babu Moger <babu.moger@amd.com> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
711d27b05a
commit
0e25181699
|
@ -29,6 +29,13 @@ static int cmt_setup(const struct resctrl_test *test,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cmt_measure(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid)
|
||||
{
|
||||
sleep(1);
|
||||
return measure_llc_resctrl(param->filename, bm_pid);
|
||||
}
|
||||
|
||||
static int show_results_info(unsigned long sum_llc_val, int no_of_bits,
|
||||
unsigned long cache_span, unsigned long max_diff,
|
||||
unsigned long max_diff_percent, unsigned long num_of_runs,
|
||||
|
@ -133,6 +140,7 @@ static int cmt_run_test(const struct resctrl_test *test, const struct user_param
|
|||
.mask = ~(long_mask << n) & long_mask,
|
||||
.num_of_runs = 0,
|
||||
.setup = cmt_setup,
|
||||
.measure = cmt_measure,
|
||||
};
|
||||
|
||||
span = cache_portion_size(cache_total_size, param.mask, long_mask);
|
||||
|
|
|
@ -51,6 +51,12 @@ static int mba_setup(const struct resctrl_test *test,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mba_measure(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid)
|
||||
{
|
||||
return measure_mem_bw(uparams, param, bm_pid);
|
||||
}
|
||||
|
||||
static bool show_mba_info(unsigned long *bw_imc, unsigned long *bw_resc)
|
||||
{
|
||||
int allocation, runs;
|
||||
|
@ -150,7 +156,8 @@ static int mba_run_test(const struct resctrl_test *test, const struct user_param
|
|||
.mongrp = "m1",
|
||||
.filename = RESULT_FILE_NAME,
|
||||
.bw_report = "reads",
|
||||
.setup = mba_setup
|
||||
.setup = mba_setup,
|
||||
.measure = mba_measure,
|
||||
};
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -105,6 +105,12 @@ static int mbm_setup(const struct resctrl_test *test,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int mbm_measure(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid)
|
||||
{
|
||||
return measure_mem_bw(uparams, param, bm_pid);
|
||||
}
|
||||
|
||||
static void mbm_test_cleanup(void)
|
||||
{
|
||||
remove(RESULT_FILE_NAME);
|
||||
|
@ -117,7 +123,8 @@ static int mbm_run_test(const struct resctrl_test *test, const struct user_param
|
|||
.ctrlgrp = "c1",
|
||||
.filename = RESULT_FILE_NAME,
|
||||
.bw_report = "reads",
|
||||
.setup = mbm_setup
|
||||
.setup = mbm_setup,
|
||||
.measure = mbm_measure,
|
||||
};
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -87,6 +87,7 @@ struct resctrl_test {
|
|||
* @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
|
||||
* @measure: Callback that performs the measurement (a single test)
|
||||
*/
|
||||
struct resctrl_val_param {
|
||||
char *resctrl_val;
|
||||
|
@ -99,6 +100,9 @@ struct resctrl_val_param {
|
|||
int (*setup)(const struct resctrl_test *test,
|
||||
const struct user_params *uparams,
|
||||
struct resctrl_val_param *param);
|
||||
int (*measure)(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param,
|
||||
pid_t bm_pid);
|
||||
};
|
||||
|
||||
struct perf_event_read {
|
||||
|
@ -145,6 +149,8 @@ unsigned char *alloc_buffer(size_t buf_size, int memflush);
|
|||
void mem_flush(unsigned char *buf, size_t buf_size);
|
||||
void fill_cache_read(unsigned char *buf, size_t buf_size, bool once);
|
||||
int run_fill_buf(size_t buf_size, int memflush, int op, bool once);
|
||||
int measure_mem_bw(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid);
|
||||
int resctrl_val(const struct resctrl_test *test,
|
||||
const struct user_params *uparams,
|
||||
const char * const *benchmark_cmd,
|
||||
|
|
|
@ -606,8 +606,8 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
|
|||
* available. Compare the two values to validate resctrl value. It takes
|
||||
* 1 sec to measure the data.
|
||||
*/
|
||||
static int measure_mem_bw(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid)
|
||||
int measure_mem_bw(const struct user_params *uparams,
|
||||
struct resctrl_val_param *param, pid_t bm_pid)
|
||||
{
|
||||
unsigned long bw_resc, bw_resc_start, bw_resc_end;
|
||||
FILE *mem_bw_fp;
|
||||
|
@ -868,17 +868,9 @@ int resctrl_val(const struct resctrl_test *test,
|
|||
if (ret < 0)
|
||||
break;
|
||||
|
||||
if (!strncmp(resctrl_val, MBM_STR, sizeof(MBM_STR)) ||
|
||||
!strncmp(resctrl_val, MBA_STR, sizeof(MBA_STR))) {
|
||||
ret = measure_mem_bw(uparams, param, bm_pid);
|
||||
if (ret)
|
||||
break;
|
||||
} else if (!strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR))) {
|
||||
sleep(1);
|
||||
ret = measure_llc_resctrl(param->filename, bm_pid);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
ret = param->measure(uparams, param, bm_pid);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
Loading…
Reference in a new issue