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: "Fenghua Yu" <fenghua.yu@intel.com>,
linux-kernel@vger.kernel.org,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: [PATCH v3 02/16] selftests/resctrl: Calculate resctrl FS derived mem bw over sleep(1) only
Date: Mon, 8 Apr 2024 19:32:33 +0300 [thread overview]
Message-ID: <20240408163247.3224-3-ilpo.jarvinen@linux.intel.com> (raw)
In-Reply-To: <20240408163247.3224-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.
Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
v3:
- Don't drop Return: entry from perf_open_imc_mem_bw() func comment
---
tools/testing/selftests/resctrl/resctrl_val.c | 71 +++++++++++++------
1 file changed, 50 insertions(+), 21 deletions(-)
diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index 456cf0d0b8ca..ca4da7f4cf25 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -294,22 +294,15 @@ static int initialize_mem_bw_imc(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;
- /* 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)
@@ -317,7 +310,22 @@ 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)
return -1;
+ }
+
+ return 0;
+}
+/*
+ * 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);
}
@@ -329,6 +337,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
@@ -600,10 +626,9 @@ 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;
float bw_imc;
int ret;
@@ -614,22 +639,27 @@ 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;
+
+ ret = get_mem_bw_resctrl(&bw_resc_start);
if (ret < 0)
return ret;
+ do_imc_mem_bw_test();
+
ret = get_mem_bw_resctrl(&bw_resc_end);
if (ret < 0)
return ret;
- bw_resc = (bw_resc_end - *bw_resc_start) / MB;
- ret = print_results_bw(param->filename, bm_pid, bw_imc, bw_resc);
- if (ret)
+ ret = get_mem_bw_imc(param->bw_report, &bw_imc);
+ if (ret < 0)
return ret;
- *bw_resc_start = bw_resc_end;
+ bw_resc = (bw_resc_end - bw_resc_start) / MB;
- return 0;
+ return print_results_bw(param->filename, bm_pid, bw_imc, bw_resc);
}
/*
@@ -703,7 +733,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;
@@ -845,7 +874,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-04-08 16:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-08 16:32 [PATCH v3 00/16] selftests/resctrl: resctrl_val() related cleanups & improvements Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 01/16] selftests/resctrl: Open get_mem_bw_imc() fd for loops Ilpo Järvinen
2024-04-25 4:37 ` Reinette Chatre
2024-04-08 16:32 ` Ilpo Järvinen [this message]
2024-04-25 4:38 ` [PATCH v3 02/16] selftests/resctrl: Calculate resctrl FS derived mem bw over sleep(1) only Reinette Chatre
2024-04-08 16:32 ` [PATCH v3 03/16] selftests/resctrl: Fix closing IMC fds on error Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 04/16] selftests/resctrl: Make "bandwidth" consistent in comments & prints Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 05/16] selftests/resctrl: Consolidate get_domain_id() into resctrl_val() Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 06/16] selftests/resctrl: Use correct type for pids Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 07/16] selftests/resctrl: Cleanup bm_pid and ppid usage & limit scope Ilpo Järvinen
2024-04-25 4:37 ` Reinette Chatre
2024-04-08 16:32 ` [PATCH v3 08/16] selftests/resctrl: Rename measure_vals() to measure_mem_bw_vals() & document Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 09/16] selftests/resctrl: Simplify mem bandwidth file code for MBA & MBM tests Ilpo Järvinen
2024-04-25 4:38 ` Reinette Chatre
2024-04-08 16:32 ` [PATCH v3 10/16] selftests/resctrl: Add ->measure() callback to resctrl_val_param Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 11/16] selftests/resctrl: Add ->init() callback into resctrl_val_param Ilpo Järvinen
2024-04-25 4:39 ` Reinette Chatre
2024-04-08 16:32 ` [PATCH v3 12/16] selftests/resctrl: Simplify bandwidth report type handling Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 13/16] selftests/resctrl: Make some strings passed to resctrlfs functions const Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 14/16] selftests/resctrl: Convert ctrlgrp & mongrp to pointers Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 15/16] selftests/resctrl: Remove mongrp from MBA test Ilpo Järvinen
2024-04-08 16:32 ` [PATCH v3 16/16] selftests/resctrl: Remove test name comparing from write_bm_pid_to_resctrl() Ilpo Järvinen
2024-04-24 13:49 ` [PATCH v3 00/16] selftests/resctrl: resctrl_val() related cleanups & improvements Shuah Khan
2024-04-25 4:46 ` 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=20240408163247.3224-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 \
/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