0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "resctrl.h"
0012
0013 #define RESULT_FILE_NAME "result_mbm"
0014 #define MAX_DIFF_PERCENT 5
0015 #define NUM_OF_RUNS 5
0016
0017 static int
0018 show_bw_info(unsigned long *bw_imc, unsigned long *bw_resc, int span)
0019 {
0020 unsigned long avg_bw_imc = 0, avg_bw_resc = 0;
0021 unsigned long sum_bw_imc = 0, sum_bw_resc = 0;
0022 int runs, ret, avg_diff_per;
0023 float avg_diff = 0;
0024
0025
0026
0027
0028
0029 for (runs = 1; runs < NUM_OF_RUNS ; runs++) {
0030 sum_bw_imc += bw_imc[runs];
0031 sum_bw_resc += bw_resc[runs];
0032 }
0033
0034 avg_bw_imc = sum_bw_imc / 4;
0035 avg_bw_resc = sum_bw_resc / 4;
0036 avg_diff = (float)labs(avg_bw_resc - avg_bw_imc) / avg_bw_imc;
0037 avg_diff_per = (int)(avg_diff * 100);
0038
0039 ret = avg_diff_per > MAX_DIFF_PERCENT;
0040 ksft_print_msg("%s Check MBM diff within %d%%\n",
0041 ret ? "Fail:" : "Pass:", MAX_DIFF_PERCENT);
0042 ksft_print_msg("avg_diff_per: %d%%\n", avg_diff_per);
0043 ksft_print_msg("Span (MB): %d\n", span);
0044 ksft_print_msg("avg_bw_imc: %lu\n", avg_bw_imc);
0045 ksft_print_msg("avg_bw_resc: %lu\n", avg_bw_resc);
0046
0047 return ret;
0048 }
0049
0050 static int check_results(int span)
0051 {
0052 unsigned long bw_imc[NUM_OF_RUNS], bw_resc[NUM_OF_RUNS];
0053 char temp[1024], *token_array[8];
0054 char output[] = RESULT_FILE_NAME;
0055 int runs, ret;
0056 FILE *fp;
0057
0058 ksft_print_msg("Checking for pass/fail\n");
0059
0060 fp = fopen(output, "r");
0061 if (!fp) {
0062 perror(output);
0063
0064 return errno;
0065 }
0066
0067 runs = 0;
0068 while (fgets(temp, sizeof(temp), fp)) {
0069 char *token = strtok(temp, ":\t");
0070 int i = 0;
0071
0072 while (token) {
0073 token_array[i++] = token;
0074 token = strtok(NULL, ":\t");
0075 }
0076
0077 bw_resc[runs] = strtoul(token_array[5], NULL, 0);
0078 bw_imc[runs] = strtoul(token_array[3], NULL, 0);
0079 runs++;
0080 }
0081
0082 ret = show_bw_info(bw_imc, bw_resc, span);
0083
0084 fclose(fp);
0085
0086 return ret;
0087 }
0088
0089 static int mbm_setup(int num, ...)
0090 {
0091 struct resctrl_val_param *p;
0092 static int num_of_runs;
0093 va_list param;
0094 int ret = 0;
0095
0096
0097 if (num_of_runs++ >= NUM_OF_RUNS)
0098 return -1;
0099
0100 va_start(param, num);
0101 p = va_arg(param, struct resctrl_val_param *);
0102 va_end(param);
0103
0104
0105 if (num_of_runs == 0)
0106 ret = write_schemata(p->ctrlgrp, "100", p->cpu_no,
0107 p->resctrl_val);
0108
0109 return ret;
0110 }
0111
0112 void mbm_test_cleanup(void)
0113 {
0114 remove(RESULT_FILE_NAME);
0115 }
0116
0117 int mbm_bw_change(int span, int cpu_no, char *bw_report, char **benchmark_cmd)
0118 {
0119 struct resctrl_val_param param = {
0120 .resctrl_val = MBM_STR,
0121 .ctrlgrp = "c1",
0122 .mongrp = "m1",
0123 .span = span,
0124 .cpu_no = cpu_no,
0125 .mum_resctrlfs = 1,
0126 .filename = RESULT_FILE_NAME,
0127 .bw_report = bw_report,
0128 .setup = mbm_setup
0129 };
0130 int ret;
0131
0132 remove(RESULT_FILE_NAME);
0133
0134 ret = resctrl_val(benchmark_cmd, ¶m);
0135 if (ret)
0136 return ret;
0137
0138 ret = check_results(span);
0139 if (ret)
0140 return ret;
0141
0142 mbm_test_cleanup();
0143
0144 return 0;
0145 }