Commit aef5efa6 authored by Ilpo Järvinen's avatar Ilpo Järvinen Committed by Shuah Khan

selftests/resctrl: Add ->init() callback into resctrl_val_param

The struct resctrl_val_param is there to customize behavior inside
resctrl_val() which is currently not used to full extent and there are
number of strcmp()s for test name in resctrl_val done by resctrl_val().

Create ->init() hook into the struct resctrl_val_param to cleanly
do per test initialization.

Remove also unused branches to setup paths and the related #defines
for CMT test.

While touching kerneldoc, make the adjacent line consistent with the
newly added form (callback vs call back).
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tested-by: default avatarBabu Moger <babu.moger@amd.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 0e251816
...@@ -16,6 +16,17 @@ ...@@ -16,6 +16,17 @@
#define MAX_DIFF 2000000 #define MAX_DIFF 2000000
#define MAX_DIFF_PERCENT 15 #define MAX_DIFF_PERCENT 15
#define CON_MON_LCC_OCCUP_PATH \
"%s/%s/mon_groups/%s/mon_data/mon_L3_%02d/llc_occupancy"
static int cmt_init(const struct resctrl_val_param *param, int domain_id)
{
sprintf(llc_occup_path, CON_MON_LCC_OCCUP_PATH, RESCTRL_PATH,
param->ctrlgrp, param->mongrp, domain_id);
return 0;
}
static int cmt_setup(const struct resctrl_test *test, static int cmt_setup(const struct resctrl_test *test,
const struct user_params *uparams, const struct user_params *uparams,
struct resctrl_val_param *p) struct resctrl_val_param *p)
...@@ -139,6 +150,7 @@ static int cmt_run_test(const struct resctrl_test *test, const struct user_param ...@@ -139,6 +150,7 @@ static int cmt_run_test(const struct resctrl_test *test, const struct user_param
.filename = RESULT_FILE_NAME, .filename = RESULT_FILE_NAME,
.mask = ~(long_mask << n) & long_mask, .mask = ~(long_mask << n) & long_mask,
.num_of_runs = 0, .num_of_runs = 0,
.init = cmt_init,
.setup = cmt_setup, .setup = cmt_setup,
.measure = cmt_measure, .measure = cmt_measure,
}; };
......
...@@ -17,6 +17,19 @@ ...@@ -17,6 +17,19 @@
#define ALLOCATION_MIN 10 #define ALLOCATION_MIN 10
#define ALLOCATION_STEP 10 #define ALLOCATION_STEP 10
static int mba_init(const struct resctrl_val_param *param, int domain_id)
{
int ret;
ret = initialize_mem_bw_imc();
if (ret)
return ret;
initialize_mem_bw_resctrl(param, domain_id);
return 0;
}
/* /*
* Change schemata percentage from 100 to 10%. Write schemata to specified * Change schemata percentage from 100 to 10%. Write schemata to specified
* con_mon grp, mon_grp in resctrl FS. * con_mon grp, mon_grp in resctrl FS.
...@@ -156,6 +169,7 @@ static int mba_run_test(const struct resctrl_test *test, const struct user_param ...@@ -156,6 +169,7 @@ static int mba_run_test(const struct resctrl_test *test, const struct user_param
.mongrp = "m1", .mongrp = "m1",
.filename = RESULT_FILE_NAME, .filename = RESULT_FILE_NAME,
.bw_report = "reads", .bw_report = "reads",
.init = mba_init,
.setup = mba_setup, .setup = mba_setup,
.measure = mba_measure, .measure = mba_measure,
}; };
......
...@@ -86,6 +86,19 @@ static int check_results(size_t span) ...@@ -86,6 +86,19 @@ static int check_results(size_t span)
return ret; return ret;
} }
static int mbm_init(const struct resctrl_val_param *param, int domain_id)
{
int ret;
ret = initialize_mem_bw_imc();
if (ret)
return ret;
initialize_mem_bw_resctrl(param, domain_id);
return 0;
}
static int mbm_setup(const struct resctrl_test *test, static int mbm_setup(const struct resctrl_test *test,
const struct user_params *uparams, const struct user_params *uparams,
struct resctrl_val_param *p) struct resctrl_val_param *p)
...@@ -123,6 +136,7 @@ static int mbm_run_test(const struct resctrl_test *test, const struct user_param ...@@ -123,6 +136,7 @@ static int mbm_run_test(const struct resctrl_test *test, const struct user_param
.ctrlgrp = "c1", .ctrlgrp = "c1",
.filename = RESULT_FILE_NAME, .filename = RESULT_FILE_NAME,
.bw_report = "reads", .bw_report = "reads",
.init = mbm_init,
.setup = mbm_setup, .setup = mbm_setup,
.measure = mbm_measure, .measure = mbm_measure,
}; };
......
...@@ -86,7 +86,8 @@ struct resctrl_test { ...@@ -86,7 +86,8 @@ struct resctrl_test {
* @mongrp: Name of the monitor group (mon grp) * @mongrp: Name of the monitor group (mon grp)
* @filename: Name of file to which the o/p should be written * @filename: Name of file to which the o/p should be written
* @bw_report: Bandwidth report type (reads vs writes) * @bw_report: Bandwidth report type (reads vs writes)
* @setup: Call back function to setup test environment * @init: Callback function to initialize test environment
* @setup: Callback function to setup per test run environment
* @measure: Callback that performs the measurement (a single test) * @measure: Callback that performs the measurement (a single test)
*/ */
struct resctrl_val_param { struct resctrl_val_param {
...@@ -97,6 +98,8 @@ struct resctrl_val_param { ...@@ -97,6 +98,8 @@ struct resctrl_val_param {
char *bw_report; char *bw_report;
unsigned long mask; unsigned long mask;
int num_of_runs; int num_of_runs;
int (*init)(const struct resctrl_val_param *param,
int domain_id);
int (*setup)(const struct resctrl_test *test, int (*setup)(const struct resctrl_test *test,
const struct user_params *uparams, const struct user_params *uparams,
struct resctrl_val_param *param); struct resctrl_val_param *param);
...@@ -149,8 +152,11 @@ unsigned char *alloc_buffer(size_t buf_size, int memflush); ...@@ -149,8 +152,11 @@ unsigned char *alloc_buffer(size_t buf_size, int memflush);
void mem_flush(unsigned char *buf, size_t buf_size); void mem_flush(unsigned char *buf, size_t buf_size);
void fill_cache_read(unsigned char *buf, size_t buf_size, bool once); 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 run_fill_buf(size_t buf_size, int memflush, int op, bool once);
int initialize_mem_bw_imc(void);
int measure_mem_bw(const struct user_params *uparams, int measure_mem_bw(const struct user_params *uparams,
struct resctrl_val_param *param, pid_t bm_pid); struct resctrl_val_param *param, pid_t bm_pid);
void initialize_mem_bw_resctrl(const struct resctrl_val_param *param,
int domain_id);
int resctrl_val(const struct resctrl_test *test, int resctrl_val(const struct resctrl_test *test,
const struct user_params *uparams, const struct user_params *uparams,
const char * const *benchmark_cmd, const char * const *benchmark_cmd,
......
...@@ -23,18 +23,6 @@ ...@@ -23,18 +23,6 @@
#define CON_MBM_LOCAL_BYTES_PATH \ #define CON_MBM_LOCAL_BYTES_PATH \
"%s/%s/mon_data/mon_L3_%02d/mbm_local_bytes" "%s/%s/mon_data/mon_L3_%02d/mbm_local_bytes"
#define CON_MON_LCC_OCCUP_PATH \
"%s/%s/mon_groups/%s/mon_data/mon_L3_%02d/llc_occupancy"
#define CON_LCC_OCCUP_PATH \
"%s/%s/mon_data/mon_L3_%02d/llc_occupancy"
#define MON_LCC_OCCUP_PATH \
"%s/mon_groups/%s/mon_data/mon_L3_%02d/llc_occupancy"
#define LCC_OCCUP_PATH \
"%s/mon_data/mon_L3_%02d/llc_occupancy"
struct membw_read_format { struct membw_read_format {
__u64 value; /* The value of the event */ __u64 value; /* The value of the event */
__u64 time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */ __u64 time_enabled; /* if PERF_FORMAT_TOTAL_TIME_ENABLED */
...@@ -268,7 +256,7 @@ static int num_of_imcs(void) ...@@ -268,7 +256,7 @@ static int num_of_imcs(void)
return count; return count;
} }
static int initialize_mem_bw_imc(void) int initialize_mem_bw_imc(void)
{ {
int imc, j; int imc, j;
...@@ -424,24 +412,18 @@ static int get_mem_bw_imc(char *bw_report, float *bw_imc) ...@@ -424,24 +412,18 @@ static int get_mem_bw_imc(char *bw_report, float *bw_imc)
/* /*
* initialize_mem_bw_resctrl: Appropriately populate "mbm_total_path" * initialize_mem_bw_resctrl: Appropriately populate "mbm_total_path"
* @ctrlgrp: Name of the control monitor group (con_mon grp) * @param: Parameters passed to resctrl_val()
* @domain_id: Domain ID (cache ID; for MB, L3 cache ID) * @domain_id: Domain ID (cache ID; for MB, L3 cache ID)
*/ */
static void initialize_mem_bw_resctrl(const char *ctrlgrp, int domain_id) void initialize_mem_bw_resctrl(const struct resctrl_val_param *param,
int domain_id)
{ {
sprintf(mbm_total_path, CON_MBM_LOCAL_BYTES_PATH, RESCTRL_PATH, sprintf(mbm_total_path, CON_MBM_LOCAL_BYTES_PATH, RESCTRL_PATH,
ctrlgrp, domain_id); param->ctrlgrp, domain_id);
} }
/* /*
* Get MBM Local bytes as reported by resctrl FS * Open file to read MBM local bytes from resctrl FS
* For MBM,
* 1. If con_mon grp and mon grp are given, then read from con_mon grp's mon grp
* 2. If only con_mon grp is given, then read from con_mon grp
* 3. If both are not given, then read from root con_mon grp
* For MBA,
* 1. If con_mon grp is given, then read from it
* 2. If con_mon grp is not given, then read from root con_mon grp
*/ */
static FILE *open_mem_bw_resctrl(const char *mbm_bw_file) static FILE *open_mem_bw_resctrl(const char *mbm_bw_file)
{ {
...@@ -454,6 +436,9 @@ static FILE *open_mem_bw_resctrl(const char *mbm_bw_file) ...@@ -454,6 +436,9 @@ static FILE *open_mem_bw_resctrl(const char *mbm_bw_file)
return fp; return fp;
} }
/*
* Get MBM Local bytes as reported by resctrl FS
*/
static int get_mem_bw_resctrl(FILE *fp, unsigned long *mbm_total) static int get_mem_bw_resctrl(FILE *fp, unsigned long *mbm_total)
{ {
if (fscanf(fp, "%lu\n", mbm_total) <= 0) { if (fscanf(fp, "%lu\n", mbm_total) <= 0) {
...@@ -566,35 +551,6 @@ static int print_results_bw(char *filename, pid_t bm_pid, float bw_imc, ...@@ -566,35 +551,6 @@ static int print_results_bw(char *filename, pid_t bm_pid, float bw_imc,
return 0; return 0;
} }
static void set_cmt_path(const char *ctrlgrp, const char *mongrp, char sock_num)
{
if (strlen(ctrlgrp) && strlen(mongrp))
sprintf(llc_occup_path, CON_MON_LCC_OCCUP_PATH, RESCTRL_PATH,
ctrlgrp, mongrp, sock_num);
else if (!strlen(ctrlgrp) && strlen(mongrp))
sprintf(llc_occup_path, MON_LCC_OCCUP_PATH, RESCTRL_PATH,
mongrp, sock_num);
else if (strlen(ctrlgrp) && !strlen(mongrp))
sprintf(llc_occup_path, CON_LCC_OCCUP_PATH, RESCTRL_PATH,
ctrlgrp, sock_num);
else if (!strlen(ctrlgrp) && !strlen(mongrp))
sprintf(llc_occup_path, LCC_OCCUP_PATH, RESCTRL_PATH, sock_num);
}
/*
* initialize_llc_occu_resctrl: Appropriately populate "llc_occup_path"
* @ctrlgrp: Name of the control monitor group (con_mon grp)
* @mongrp: Name of the monitor group (mon grp)
* @domain_id: Domain ID (cache ID; for MB, L3 cache ID)
* @resctrl_val: Resctrl feature (Eg: cat, cmt.. etc)
*/
static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
int domain_id, char *resctrl_val)
{
if (!strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR)))
set_cmt_path(ctrlgrp, mongrp, domain_id);
}
/* /*
* measure_mem_bw - Measures memory bandwidth numbers while benchmark runs * measure_mem_bw - Measures memory bandwidth numbers while benchmark runs
* @uparams: User supplied parameters * @uparams: User supplied parameters
...@@ -825,16 +781,11 @@ int resctrl_val(const struct resctrl_test *test, ...@@ -825,16 +781,11 @@ int resctrl_val(const struct resctrl_test *test,
if (ret) if (ret)
goto out; goto out;
if (!strncmp(resctrl_val, MBM_STR, sizeof(MBM_STR)) || if (param->init) {
!strncmp(resctrl_val, MBA_STR, sizeof(MBA_STR))) { ret = param->init(param, domain_id);
ret = initialize_mem_bw_imc();
if (ret) if (ret)
goto out; goto out;
}
initialize_mem_bw_resctrl(param->ctrlgrp, domain_id);
} else if (!strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR)))
initialize_llc_occu_resctrl(param->ctrlgrp, param->mongrp,
domain_id, resctrl_val);
/* Parent waits for child to be ready. */ /* Parent waits for child to be ready. */
close(pipefd[1]); close(pipefd[1]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment