1 // SPDX-License-Identifier: GPL-2.0
3 * Memory Bandwidth Monitoring (MBM) test
5 * Copyright (C) 2018 Intel Corporation
8 * Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>,
9 * Fenghua Yu <fenghua.yu@intel.com>
13 #define RESULT_FILE_NAME "result_mbm"
18 show_bw_info(unsigned long *bw_imc
, unsigned long *bw_resc
, int span
)
20 unsigned long avg_bw_imc
= 0, avg_bw_resc
= 0;
21 unsigned long sum_bw_imc
= 0, sum_bw_resc
= 0;
26 * Discard the first value which is inaccurate due to monitoring setup
29 for (runs
= 1; runs
< NUM_OF_RUNS
; runs
++) {
30 sum_bw_imc
+= bw_imc
[runs
];
31 sum_bw_resc
+= bw_resc
[runs
];
34 avg_bw_imc
= sum_bw_imc
/ 4;
35 avg_bw_resc
= sum_bw_resc
/ 4;
36 avg_diff
= avg_bw_resc
- avg_bw_imc
;
38 printf("%sok MBM: diff within %d%%\n",
39 labs(avg_diff
) > MAX_DIFF
? "not " : "", MAX_DIFF
);
41 printf("# avg_diff: %lu\n", labs(avg_diff
));
42 printf("# Span (MB): %d\n", span
);
43 printf("# avg_bw_imc: %lu\n", avg_bw_imc
);
44 printf("# avg_bw_resc: %lu\n", avg_bw_resc
);
47 static int check_results(int span
)
49 unsigned long bw_imc
[NUM_OF_RUNS
], bw_resc
[NUM_OF_RUNS
];
50 char temp
[1024], *token_array
[8];
51 char output
[] = RESULT_FILE_NAME
;
55 printf("# Checking for pass/fail\n");
57 fp
= fopen(output
, "r");
65 while (fgets(temp
, sizeof(temp
), fp
)) {
66 char *token
= strtok(temp
, ":\t");
70 token_array
[i
++] = token
;
71 token
= strtok(NULL
, ":\t");
74 bw_resc
[runs
] = strtoul(token_array
[5], NULL
, 0);
75 bw_imc
[runs
] = strtoul(token_array
[3], NULL
, 0);
79 show_bw_info(bw_imc
, bw_resc
, span
);
86 static int mbm_setup(int num
, ...)
88 struct resctrl_val_param
*p
;
89 static int num_of_runs
;
93 /* Run NUM_OF_RUNS times */
94 if (num_of_runs
++ >= NUM_OF_RUNS
)
98 p
= va_arg(param
, struct resctrl_val_param
*);
101 /* Set up shemata with 100% allocation on the first run. */
102 if (num_of_runs
== 0)
103 ret
= write_schemata(p
->ctrlgrp
, "100", p
->cpu_no
,
109 void mbm_test_cleanup(void)
111 remove(RESULT_FILE_NAME
);
114 int mbm_bw_change(int span
, int cpu_no
, char *bw_report
, char **benchmark_cmd
)
116 struct resctrl_val_param param
= {
117 .resctrl_val
= "mbm",
123 .filename
= RESULT_FILE_NAME
,
124 .bw_report
= bw_report
,
129 remove(RESULT_FILE_NAME
);
131 if (!validate_resctrl_feature_request("mbm"))
134 ret
= resctrl_val(benchmark_cmd
, ¶m
);
138 ret
= check_results(span
);