From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: linux-kselftest@vger.kernel.org,
"Reinette Chatre" <reinette.chatre@intel.com>,
"Shuah Khan" <shuah@kernel.org>,
"Babu Moger" <babu.moger@amd.com>,
"Maciej Wieczór-Retman" <maciej.wieczor-retman@intel.com>
Cc: linux-kernel@vger.kernel.org, "Fenghua Yu" <fenghua.yu@intel.com>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: [PATCH v4 02/16] selftests/resctrl: Calculate resctrl FS derived mem bw over sleep(1) only
Date: Mon, 20 May 2024 15:30:06 +0300 [thread overview]
Message-ID: <20240520123020.18938-3-ilpo.jarvinen@linux.intel.com> (raw)
In-Reply-To: <20240520123020.18938-1-ilpo.jarvinen@linux.intel.com>
For MBM/MBA tests, measure_vals() calls get_mem_bw_imc() that performs
the measurement over a duration of sleep(1) call. The memory bandwidth
numbers from IMC are derived over this duration. The resctrl FS derived
memory bandwidth, however, is calculated inside measure_vals() and only
takes delta between the previous value and the current one which
besides the actual test, also samples inter-test noise.
Rework the logic in measure_vals() and get_mem_bw_imc() such that the
resctrl FS memory bandwidth section covers much shorter duration
closely matching that of the IMC perf counters to improve measurement
accuracy. Open two the resctrl mem bw files twice to avoid opening
after the test during measurement period (reading the same file twice
returns the same value so two files are needed).
Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
v4:
- Open resctrl mem bw file (twice) beforehand to avoid opening it during
the test
v3:
- Don't drop Return: entry from perf_open_imc_mem_bw() func comment
---
tools/testing/selftests/resctrl/resctrl_val.c | 119 +++++++++++++-----
1 file changed, 85 insertions(+), 34 deletions(-)
diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index f55f5989de72..bd5a1cbb8a21 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -306,18 +306,13 @@ static void perf_close_imc_mem_bw(void)
}
/*
- * get_mem_bw_imc: Memory band width as reported by iMC counters
- * @cpu_no: CPU number that the benchmark PID is binded to
- * @bw_report: Bandwidth report type (reads, writes)
- *
- * Memory B/W utilized by a process on a socket can be calculated using
- * iMC counters. Perf events are used to read these counters.
+ * perf_open_imc_mem_bw - Open perf fds for IMCs
+ * @cpu_no: CPU number that the benchmark PID is binded to
*
* Return: = 0 on success. < 0 on failure.
*/
-static int get_mem_bw_imc(int cpu_no, char *bw_report, float *bw_imc)
+static int perf_open_imc_mem_bw(int cpu_no)
{
- float reads, writes, of_mul_read, of_mul_write;
int imc, ret;
for (imc = 0; imc < imcs; imc++) {
@@ -325,8 +320,6 @@ static int get_mem_bw_imc(int cpu_no, char *bw_report, float *bw_imc)
imc_counters_config[imc][WRITE].fd = -1;
}
- /* Start all iMC counters to log values (both read and write) */
- reads = 0, writes = 0, of_mul_read = 1, of_mul_write = 1;
for (imc = 0; imc < imcs; imc++) {
ret = open_perf_event(imc, cpu_no, READ);
if (ret)
@@ -334,7 +327,26 @@ static int get_mem_bw_imc(int cpu_no, char *bw_report, float *bw_imc)
ret = open_perf_event(imc, cpu_no, WRITE);
if (ret)
goto close_fds;
+ }
+ return 0;
+
+close_fds:
+ perf_close_imc_mem_bw();
+ return -1;
+}
+
+/*
+ * do_mem_bw_test - Perform memory bandwidth test
+ *
+ * Runs memory bandwidth test over one second period. Also, handles starting
+ * and stopping of the IMC perf counters around the test.
+ */
+static void do_imc_mem_bw_test(void)
+{
+ int imc;
+
+ for (imc = 0; imc < imcs; imc++) {
membw_ioctl_perf_event_ioc_reset_enable(imc, READ);
membw_ioctl_perf_event_ioc_reset_enable(imc, WRITE);
}
@@ -346,6 +358,24 @@ static int get_mem_bw_imc(int cpu_no, char *bw_report, float *bw_imc)
membw_ioctl_perf_event_ioc_disable(imc, READ);
membw_ioctl_perf_event_ioc_disable(imc, WRITE);
}
+}
+
+/*
+ * get_mem_bw_imc - Memory band width as reported by iMC counters
+ * @bw_report: Bandwidth report type (reads, writes)
+ *
+ * Memory B/W utilized by a process on a socket can be calculated using
+ * iMC counters. Perf events are used to read these counters.
+ *
+ * Return: = 0 on success. < 0 on failure.
+ */
+static int get_mem_bw_imc(char *bw_report, float *bw_imc)
+{
+ float reads, writes, of_mul_read, of_mul_write;
+ int imc;
+
+ /* Start all iMC counters to log values (both read and write) */
+ reads = 0, writes = 0, of_mul_read = 1, of_mul_write = 1;
/*
* Get results which are stored in struct type imc_counter_config
@@ -462,24 +492,23 @@ static void initialize_mem_bw_resctrl(const char *ctrlgrp, const char *mongrp,
* 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 int get_mem_bw_resctrl(unsigned long *mbm_total)
+static FILE *open_mem_bw_resctrl(const char *mbm_bw_file)
{
FILE *fp;
- fp = fopen(mbm_total_path, "r");
- if (!fp) {
+ fp = fopen(mbm_bw_file, "r");
+ if (!fp)
ksft_perror("Failed to open total bw file");
- return -1;
- }
+ return fp;
+}
+
+static int get_mem_bw_resctrl(FILE *fp, unsigned long *mbm_total)
+{
if (fscanf(fp, "%lu", mbm_total) <= 0) {
ksft_perror("Could not get mbm local bytes");
- fclose(fp);
-
return -1;
}
- fclose(fp);
-
return 0;
}
@@ -616,13 +645,22 @@ static void initialize_llc_occu_resctrl(const char *ctrlgrp, const char *mongrp,
}
static int measure_vals(const struct user_params *uparams,
- struct resctrl_val_param *param,
- unsigned long *bw_resc_start)
+ struct resctrl_val_param *param)
{
- unsigned long bw_resc, bw_resc_end;
+ unsigned long bw_resc, bw_resc_start, bw_resc_end;
+ FILE *mem_bw_fp, *mem_bw_fp2;
float bw_imc;
int ret;
+ mem_bw_fp = open_mem_bw_resctrl(mbm_total_path);
+ if (!mem_bw_fp)
+ return -1;
+ mem_bw_fp2 = open_mem_bw_resctrl(mbm_total_path);
+ if (!mem_bw_fp2) {
+ ret = -1;
+ goto close_fp;
+ }
+
/*
* Measure memory bandwidth from resctrl and from
* another source which is perf imc value or could
@@ -630,22 +668,36 @@ static int measure_vals(const struct user_params *uparams,
* Compare the two values to validate resctrl value.
* It takes 1sec to measure the data.
*/
- ret = get_mem_bw_imc(uparams->cpu, param->bw_report, &bw_imc);
+ ret = perf_open_imc_mem_bw(uparams->cpu);
if (ret < 0)
- return ret;
+ goto close_fp2;
- ret = get_mem_bw_resctrl(&bw_resc_end);
+ ret = get_mem_bw_resctrl(mem_bw_fp, &bw_resc_start);
if (ret < 0)
- return ret;
+ goto close_fp2;
- bw_resc = (bw_resc_end - *bw_resc_start) / MB;
- ret = print_results_bw(param->filename, bm_pid, bw_imc, bw_resc);
- if (ret)
- return ret;
+ do_imc_mem_bw_test();
+
+ ret = get_mem_bw_resctrl(mem_bw_fp2, &bw_resc_end);
+ if (ret < 0)
+ goto close_fp2;
+
+ ret = get_mem_bw_imc(param->bw_report, &bw_imc);
+ if (ret < 0)
+ goto close_fp2;
- *bw_resc_start = bw_resc_end;
+ fclose(mem_bw_fp2);
+ fclose(mem_bw_fp);
- return 0;
+ bw_resc = (bw_resc_end - bw_resc_start) / MB;
+
+ return print_results_bw(param->filename, bm_pid, bw_imc, bw_resc);
+
+close_fp2:
+ fclose(mem_bw_fp2);
+close_fp:
+ fclose(mem_bw_fp);
+ return ret;
}
/*
@@ -719,7 +771,6 @@ int resctrl_val(const struct resctrl_test *test,
struct resctrl_val_param *param)
{
char *resctrl_val = param->resctrl_val;
- unsigned long bw_resc_start = 0;
struct sigaction sigact;
int ret = 0, pipefd[2];
char pipe_message = 0;
@@ -861,7 +912,7 @@ int resctrl_val(const struct resctrl_test *test,
if (!strncmp(resctrl_val, MBM_STR, sizeof(MBM_STR)) ||
!strncmp(resctrl_val, MBA_STR, sizeof(MBA_STR))) {
- ret = measure_vals(uparams, param, &bw_resc_start);
+ ret = measure_vals(uparams, param);
if (ret)
break;
} else if (!strncmp(resctrl_val, CMT_STR, sizeof(CMT_STR))) {
--
2.39.2
next prev parent reply other threads:[~2024-05-20 12:30 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-20 12:30 [PATCH v4 00/16] selftests/resctrl: resctrl_val() related cleanups & improvements Ilpo Järvinen
2024-05-20 12:30 ` [PATCH v4 01/16] selftests/resctrl: Fix closing IMC fds on error and open-code R+W instead of loops Ilpo Järvinen
2024-05-29 17:42 ` Reinette Chatre
2024-05-20 12:30 ` Ilpo Järvinen [this message]
2024-05-24 0:10 ` [PATCH v4 02/16] selftests/resctrl: Calculate resctrl FS derived mem bw over sleep(1) only Reinette Chatre
2024-05-24 7:57 ` Ilpo Järvinen
2024-05-24 15:14 ` Reinette Chatre
2024-05-24 15:26 ` Ilpo Järvinen
2024-05-28 10:19 ` Ilpo Järvinen
2024-05-28 15:15 ` Reinette Chatre
2024-05-30 11:11 ` Ilpo Järvinen
2024-05-30 15:08 ` Reinette Chatre
2024-05-31 12:51 ` Ilpo Järvinen
2024-05-20 12:30 ` [PATCH v4 03/16] selftests/resctrl: Make "bandwidth" consistent in comments & prints Ilpo Järvinen
2024-05-29 17:43 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 04/16] selftests/resctrl: Consolidate get_domain_id() into resctrl_val() Ilpo Järvinen
2024-05-29 17:43 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 05/16] selftests/resctrl: Use correct type for pids Ilpo Järvinen
2024-05-29 17:44 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 06/16] selftests/resctrl: Cleanup bm_pid and ppid usage & limit scope Ilpo Järvinen
2024-05-29 17:44 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 07/16] selftests/resctrl: Rename measure_vals() to measure_mem_bw_vals() & document Ilpo Järvinen
2024-05-29 17:44 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 08/16] selftests/resctrl: Simplify mem bandwidth file code for MBA & MBM tests Ilpo Järvinen
2024-05-29 17:45 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 09/16] selftests/resctrl: Add ->measure() callback to resctrl_val_param Ilpo Järvinen
2024-05-29 17:46 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 10/16] selftests/resctrl: Add ->init() callback into resctrl_val_param Ilpo Järvinen
2024-05-29 17:48 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 11/16] selftests/resctrl: Simplify bandwidth report type handling Ilpo Järvinen
2024-05-29 17:46 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 12/16] selftests/resctrl: Make some strings passed to resctrlfs functions const Ilpo Järvinen
2024-05-29 17:47 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 13/16] selftests/resctrl: Convert ctrlgrp & mongrp to pointers Ilpo Järvinen
2024-05-29 17:48 ` Reinette Chatre
2024-05-30 11:44 ` Ilpo Järvinen
2024-05-20 12:30 ` [PATCH v4 14/16] selftests/resctrl: Remove mongrp from MBA test Ilpo Järvinen
2024-05-29 17:49 ` Reinette Chatre
2024-05-30 11:56 ` Ilpo Järvinen
2024-05-30 15:09 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 15/16] selftests/resctrl: Remove mongrp from CMT test Ilpo Järvinen
2024-05-29 17:49 ` Reinette Chatre
2024-05-20 12:30 ` [PATCH v4 16/16] selftests/resctrl: Remove test name comparing from write_bm_pid_to_resctrl() Ilpo Järvinen
2024-05-29 17:52 ` Reinette Chatre
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240520123020.18938-3-ilpo.jarvinen@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=babu.moger@amd.com \
--cc=fenghua.yu@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maciej.wieczor-retman@intel.com \
--cc=reinette.chatre@intel.com \
--cc=shuah@kernel.org \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox