]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/resctrl: Add ->measure() callback to resctrl_val_param
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 10 Jun 2024 15:14:50 +0000 (18:14 +0300)
committerShuah Khan <skhan@linuxfoundation.org>
Thu, 11 Jul 2024 17:23:54 +0000 (11:23 -0600)
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>
tools/testing/selftests/resctrl/cmt_test.c
tools/testing/selftests/resctrl/mba_test.c
tools/testing/selftests/resctrl/mbm_test.c
tools/testing/selftests/resctrl/resctrl.h
tools/testing/selftests/resctrl/resctrl_val.c

index 0105afec6188aecd64216b2eac090328cc5ec5d2..f6cb258f873d83a81abaeab7b698a1c4379d8ca6 100644 (file)
@@ -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);
index a6ad39aae1623ea693b4e6bb08aa630a2d7b2b2f..68d92c7c1cab2284ac41aa941f49bcaa2243eb72 100644 (file)
@@ -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;
 
index 9fc162a0d5630db678c1acdbbf72bd6cd6238607..7c6f60b1dd186323e4f8cafb493dc0a488986644 100644 (file)
@@ -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;
 
index e4b6dc672ecc73d813ec9239a4c2972b5685da2f..5dc3def7066977b2c2514d1d31df37fa56250e98 100644 (file)
@@ -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,
index 277c13b7a4c5211420f18b57505ae8d5702cbe98..590fc74cb88f56b832421ea0baf015e99b2433b6 100644 (file)
@@ -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: