selftests/resctrl: Introduce generalized test framework
[linux-2.6-microblaze.git] / tools / testing / selftests / resctrl / resctrl_tests.c
index 3059a12..75fc49b 100644 (file)
 static volatile int sink_target;
 volatile int *value_sink = &sink_target;
 
+static struct resctrl_test *resctrl_tests[] = {
+       &mbm_test,
+       &mba_test,
+       &cmt_test,
+       &l3_cat_test,
+};
+
 static int detect_vendor(void)
 {
        FILE *inf = fopen("/proc/cpuinfo", "r");
@@ -53,11 +60,16 @@ int get_vendor(void)
 
 static void cmd_help(void)
 {
+       int i;
+
        printf("usage: resctrl_tests [-h] [-t test list] [-n no_of_bits] [-b benchmark_cmd [option]...]\n");
        printf("\t-b benchmark_cmd [option]...: run specified benchmark for MBM, MBA and CMT\n");
        printf("\t   default benchmark is builtin fill_buf\n");
        printf("\t-t test list: run tests specified in the test list, ");
        printf("e.g. -t mbm,mba,cmt,cat\n");
+       printf("\t\tSupported tests:\n");
+       for (i = 0; i < ARRAY_SIZE(resctrl_tests); i++)
+               printf("\t\t\t%s\n", resctrl_tests[i]->name);
        printf("\t-n no_of_bits: run cache tests using specified no of bits in cache bit mask\n");
        printf("\t-p cpu_no: specify CPU number to run the test. 1 is default\n");
        printf("\t-h: help\n");
@@ -96,102 +108,41 @@ static void test_cleanup(void)
        signal_handler_unregister();
 }
 
-static void run_mbm_test(const struct user_params *uparams)
+static bool test_vendor_specific_check(const struct resctrl_test *test)
 {
-       int res;
-
-       ksft_print_msg("Starting MBM BW change ...\n");
-
-       if (test_prepare()) {
-               ksft_exit_fail_msg("Abnormal failure when preparing for the test\n");
-               return;
-       }
-
-       if (!validate_resctrl_feature_request("L3_MON", "mbm_total_bytes") ||
-           !validate_resctrl_feature_request("L3_MON", "mbm_local_bytes") ||
-           (get_vendor() != ARCH_INTEL)) {
-               ksft_test_result_skip("Hardware does not support MBM or MBM is disabled\n");
-               goto cleanup;
-       }
-
-       res = mbm_bw_change(uparams);
-       ksft_test_result(!res, "MBM: bw change\n");
-       if ((get_vendor() == ARCH_INTEL) && res)
-               ksft_print_msg("Intel MBM may be inaccurate when Sub-NUMA Clustering is enabled. Check BIOS configuration.\n");
+       if (!test->vendor_specific)
+               return true;
 
-cleanup:
-       test_cleanup();
+       return get_vendor() & test->vendor_specific;
 }
 
-static void run_mba_test(const struct user_params *uparams)
+static void run_single_test(const struct resctrl_test *test, const struct user_params *uparams)
 {
-       int res;
-
-       ksft_print_msg("Starting MBA Schemata change ...\n");
+       int ret;
 
-       if (test_prepare()) {
-               ksft_exit_fail_msg("Abnormal failure when preparing for the test\n");
+       if (test->disabled)
                return;
-       }
 
-       if (!validate_resctrl_feature_request("MB", NULL) ||
-           !validate_resctrl_feature_request("L3_MON", "mbm_local_bytes") ||
-           (get_vendor() != ARCH_INTEL)) {
-               ksft_test_result_skip("Hardware does not support MBA or MBA is disabled\n");
-               goto cleanup;
-       }
-
-       res = mba_schemata_change(uparams);
-       ksft_test_result(!res, "MBA: schemata change\n");
-
-cleanup:
-       test_cleanup();
-}
-
-static void run_cmt_test(const struct user_params *uparams)
-{
-       int res;
-
-       ksft_print_msg("Starting CMT test ...\n");
-
-       if (test_prepare()) {
-               ksft_exit_fail_msg("Abnormal failure when preparing for the test\n");
+       if (!test_vendor_specific_check(test)) {
+               ksft_test_result_skip("Hardware does not support %s\n", test->name);
                return;
        }
 
-       if (!validate_resctrl_feature_request("L3_MON", "llc_occupancy") ||
-           !validate_resctrl_feature_request("L3", NULL)) {
-               ksft_test_result_skip("Hardware does not support CMT or CMT is disabled\n");
-               goto cleanup;
-       }
-
-       res = cmt_resctrl_val(uparams);
-       ksft_test_result(!res, "CMT: test\n");
-       if ((get_vendor() == ARCH_INTEL) && res)
-               ksft_print_msg("Intel CMT may be inaccurate when Sub-NUMA Clustering is enabled. Check BIOS configuration.\n");
-
-cleanup:
-       test_cleanup();
-}
-
-static void run_cat_test(const struct user_params *uparams)
-{
-       int res;
-
-       ksft_print_msg("Starting CAT test ...\n");
+       ksft_print_msg("Starting %s test ...\n", test->name);
 
        if (test_prepare()) {
                ksft_exit_fail_msg("Abnormal failure when preparing for the test\n");
                return;
        }
 
-       if (!validate_resctrl_feature_request("L3", NULL)) {
-               ksft_test_result_skip("Hardware does not support CAT or CAT is disabled\n");
+       if (!test->feature_check(test)) {
+               ksft_test_result_skip("Hardware does not support %s or %s is disabled\n",
+                                     test->name, test->name);
                goto cleanup;
        }
 
-       res = cat_perf_miss_val(uparams, "L3");
-       ksft_test_result(!res, "CAT: test\n");
+       ret = test->run_test(test, uparams);
+       ksft_test_result(!ret, "%s: test\n", test->name);
 
 cleanup:
        test_cleanup();
@@ -207,11 +158,10 @@ static void init_user_params(struct user_params *uparams)
 
 int main(int argc, char **argv)
 {
-       bool mbm_test = true, mba_test = true, cmt_test = true;
+       int tests = ARRAY_SIZE(resctrl_tests);
+       bool test_param_seen = false;
        struct user_params uparams;
        char *span_str = NULL;
-       bool cat_test = true;
-       int tests = 0;
        int ret, c, i;
 
        init_user_params(&uparams);
@@ -239,25 +189,26 @@ int main(int argc, char **argv)
                case 't':
                        token = strtok(optarg, ",");
 
-                       mbm_test = false;
-                       mba_test = false;
-                       cmt_test = false;
-                       cat_test = false;
+                       if (!test_param_seen) {
+                               for (i = 0; i < ARRAY_SIZE(resctrl_tests); i++)
+                                       resctrl_tests[i]->disabled = true;
+                               tests = 0;
+                               test_param_seen = true;
+                       }
                        while (token) {
-                               if (!strncmp(token, MBM_STR, sizeof(MBM_STR))) {
-                                       mbm_test = true;
-                                       tests++;
-                               } else if (!strncmp(token, MBA_STR, sizeof(MBA_STR))) {
-                                       mba_test = true;
-                                       tests++;
-                               } else if (!strncmp(token, CMT_STR, sizeof(CMT_STR))) {
-                                       cmt_test = true;
-                                       tests++;
-                               } else if (!strncmp(token, CAT_STR, sizeof(CAT_STR))) {
-                                       cat_test = true;
-                                       tests++;
-                               } else {
-                                       printf("invalid argument\n");
+                               bool found = false;
+
+                               for (i = 0; i < ARRAY_SIZE(resctrl_tests); i++) {
+                                       if (!strcasecmp(token, resctrl_tests[i]->name)) {
+                                               if (resctrl_tests[i]->disabled)
+                                                       tests++;
+                                               resctrl_tests[i]->disabled = false;
+                                               found = true;
+                                       }
+                               }
+
+                               if (!found) {
+                                       printf("invalid test: %s\n", token);
 
                                        return -1;
                                }
@@ -317,19 +268,10 @@ last_arg:
                uparams.benchmark_cmd[5] = NULL;
        }
 
-       ksft_set_plan(tests ? : 4);
-
-       if (mbm_test)
-               run_mbm_test(&uparams);
-
-       if (mba_test)
-               run_mba_test(&uparams);
-
-       if (cmt_test)
-               run_cmt_test(&uparams);
+       ksft_set_plan(tests);
 
-       if (cat_test)
-               run_cat_test(&uparams);
+       for (i = 0; i < ARRAY_SIZE(resctrl_tests); i++)
+               run_single_test(resctrl_tests[i], &uparams);
 
        free(span_str);
        ksft_finished();