Linux Kernel Selftest development
 help / color / mirror / Atom feed
From: Yifan Wu <wuyifan50@huawei.com>
To: <tony.luck@intel.com>, <reinette.chatre@intel.com>,
	<Dave.Martin@arm.com>, <james.morse@arm.com>,
	<babu.moger@amd.com>, <shuah@kernel.org>,
	<tan.shaopeng@fujitsu.com>, <fenghuay@nvidia.com>,
	<ben.horgan@arm.com>, <jonathan.cameron@huawei.com>,
	<wuyifan50@huawei.com>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kselftest@vger.kernel.org>, <linuxarm@huawei.com>
Cc: <xiaqinxin@huawei.com>, <prime.zeng@hisilicon.com>,
	<wangyushan12@huawei.com>, <xuwei5@huawei.com>,
	<fanghao11@huawei.com>, <wangzhou1@hisilicon.com>
Subject: [RFC patch 1/9] selftests/resctrl: Move CPU affinity and resctrl FS setup to child process
Date: Wed, 4 Mar 2026 12:03:26 +0800	[thread overview]
Message-ID: <20260304040334.765860-2-wuyifan50@huawei.com> (raw)
In-Reply-To: <20260304040334.765860-1-wuyifan50@huawei.com>

Currently, the resctrl_val() function sets CPU affinity and writes
the parent process's PID into the control and monitoring groups in the
resctrl file system before forking the benchmark child process. This
causes several issues:

1. Writing the parent process's PID into the resctrl control group
unnecessarily affects the behavior of the parent process, while the
control group should only apply to the benchmark child process.

2. Writing the parent process's PID into the resctrl monitoring group
introduces the parent process's activity into the bandwidth measurement,
affecting the accuracy of the monitoring, which should only monitor the
benchmark child process.

3. Since only the child process is monitored, the CPU affinity should
also be set only on the child process to ensure that the PMU (Performance
Monitoring Unit) can count memory bandwidth from the benchmark process.

4. When the parent and child processes are scheduled on the same CPU,
the parent process's activity may interfere with the monitoring of
the child process. This is particularly problematic in some ARM MPAM
implementations, where memory bandwidth monitoring real-time values. When
the child process is preempted off the CPU, this results in inaccurate
monitoring.

This commit moves the CPU affinity and resctrl FS setup to the child
process after fork(), ensuring these settings only affect the benchmark
process, thereby maintaining measurement accuracy and making the
implementation more portable across platforms.

Signed-off-by: Yifan Wu <wuyifan50@huawei.com>
---
 tools/testing/selftests/resctrl/resctrl_val.c | 68 +++++++++++--------
 1 file changed, 39 insertions(+), 29 deletions(-)

diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
index 7c08e936572d..85ac96c7cb8f 100644
--- a/tools/testing/selftests/resctrl/resctrl_val.c
+++ b/tools/testing/selftests/resctrl/resctrl_val.c
@@ -545,7 +545,6 @@ int resctrl_val(const struct resctrl_test *test,
 	cpu_set_t old_affinity;
 	int domain_id;
 	int ret = 0;
-	pid_t ppid;
 
 	if (strcmp(param->filename, "") == 0)
 		sprintf(param->filename, "stdio");
@@ -556,22 +555,10 @@ int resctrl_val(const struct resctrl_test *test,
 		return ret;
 	}
 
-	ppid = getpid();
-
-	/* Taskset test to specified CPU. */
-	ret = taskset_benchmark(ppid, uparams->cpu, &old_affinity);
-	if (ret)
-		return ret;
-
-	/* Write test to specified control & monitoring group in resctrl FS. */
-	ret = write_bm_pid_to_resctrl(ppid, param->ctrlgrp, param->mongrp);
-	if (ret)
-		goto reset_affinity;
-
 	if (param->init) {
 		ret = param->init(param, domain_id);
 		if (ret)
-			goto reset_affinity;
+			return ret;
 	}
 
 	/*
@@ -586,10 +573,8 @@ int resctrl_val(const struct resctrl_test *test,
 	if (param->fill_buf) {
 		buf = alloc_buffer(param->fill_buf->buf_size,
 				   param->fill_buf->memflush);
-		if (!buf) {
-			ret = -ENOMEM;
-			goto reset_affinity;
-		}
+		if (!buf)
+			return -ENOMEM;
 	}
 
 	fflush(stdout);
@@ -605,11 +590,26 @@ int resctrl_val(const struct resctrl_test *test,
 	 * terminated.
 	 */
 	if (bm_pid == 0) {
+		bm_pid = getpid();
+
+		/* Taskset test to specified CPU. */
+		ret = taskset_benchmark(bm_pid, uparams->cpu, &old_affinity);
+		if (ret)
+			exit(ret);
+
+		/* Write test to specified control & monitoring group in resctrl FS. */
+		ret = write_bm_pid_to_resctrl(bm_pid, param->ctrlgrp, param->mongrp);
+		if (ret)
+			goto reset_affinity;
+
 		if (param->fill_buf)
 			fill_cache_read(buf, param->fill_buf->buf_size, false);
 		else if (uparams->benchmark_cmd[0])
 			execvp(uparams->benchmark_cmd[0], (char **)uparams->benchmark_cmd);
-		exit(EXIT_SUCCESS);
+
+reset_affinity:
+		taskset_restore(bm_pid, &old_affinity);
+		exit(ret);
 	}
 
 	ksft_print_msg("Benchmark PID: %d\n", (int)bm_pid);
@@ -619,23 +619,33 @@ int resctrl_val(const struct resctrl_test *test,
 
 	/* Test runs until the callback setup() tells the test to stop. */
 	while (1) {
-		ret = param->setup(test, uparams, param);
-		if (ret == END_OF_TESTS) {
-			ret = 0;
+		pid_t wpid = waitpid(bm_pid, &ret, WNOHANG);
+
+		if (wpid == -1) {
+			ret = -errno;
+			ksft_perror("Unable to waitpid");
 			break;
 		}
-		if (ret < 0)
-			break;
 
-		ret = param->measure(uparams, param, bm_pid);
-		if (ret)
-			break;
+		if (wpid == 0) {
+			ret = param->setup(test, uparams, param);
+			if (ret == END_OF_TESTS) {
+				ret = 0;
+				break;
+			}
+			if (ret < 0)
+				break;
+
+			ret = param->measure(uparams, param, bm_pid);
+			if (ret)
+				break;
+		} else {
+			goto free_buf;
+		}
 	}
 
 	kill(bm_pid, SIGKILL);
 free_buf:
 	free(buf);
-reset_affinity:
-	taskset_restore(ppid, &old_affinity);
 	return ret;
 }
-- 
2.33.0


  reply	other threads:[~2026-03-04  4:03 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-04  4:03 [RFC patch 0/9] Add support for HiSilicon platforms and refactor Yifan Wu
2026-03-04  4:03 ` Yifan Wu [this message]
2026-03-12 20:53   ` [RFC patch 1/9] selftests/resctrl: Move CPU affinity and resctrl FS setup to child process Reinette Chatre
2026-03-23  9:18     ` wuyifan
2026-03-23 15:51       ` Reinette Chatre
2026-03-04  4:03 ` [RFC patch 2/9] selftests/resctrl: Refactor resctrl_val.c for vendor-specific mem bw measurement Yifan Wu
2026-03-04  4:03 ` [RFC patch 3/9] selftests/resctrl: Use dynamic linked list for iMC counters config Yifan Wu
2026-03-12 20:57   ` Reinette Chatre
2026-03-04  4:03 ` [RFC patch 4/9] selftests/resctrl: Move memory bandwidth measurement init and cleanup to resctrl_val.c Yifan Wu
2026-03-04  4:03 ` [RFC patch 5/9] selftests/resctrl: Refactor CPU vendor detection to use lookup table Yifan Wu
2026-03-12 20:59   ` Reinette Chatre
2026-03-23  9:18     ` wuyifan
2026-03-04  4:03 ` [RFC patch 6/9] selftests/resctrl: Add support for HiSilicon CPU detection Yifan Wu
2026-03-04  4:03 ` [RFC patch 7/9] selftests/resctrl: Add support for HiSilicon memory bandwidth measurement Yifan Wu
2026-03-04  4:03 ` [RFC patch 8/9] selftests/resctrl: Add support for HiSilicon MBM/MBA test Yifan Wu
2026-03-12 21:01   ` Reinette Chatre
2026-03-23  9:19     ` wuyifan
2026-03-23 15:52       ` Reinette Chatre
2026-03-24  1:52         ` wuyifan
2026-03-04  4:03 ` [RFC patch 9/9] selftests/resctrl: Add support for HiSilicon CAT/CMT test Yifan Wu
2026-03-06 10:45 ` [RFC patch 0/9] Add support for HiSilicon platforms and refactor Jonathan Cameron
2026-03-09  3:09   ` wuyifan

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=20260304040334.765860-2-wuyifan50@huawei.com \
    --to=wuyifan50@huawei.com \
    --cc=Dave.Martin@arm.com \
    --cc=babu.moger@amd.com \
    --cc=ben.horgan@arm.com \
    --cc=fanghao11@huawei.com \
    --cc=fenghuay@nvidia.com \
    --cc=james.morse@arm.com \
    --cc=jonathan.cameron@huawei.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linuxarm@huawei.com \
    --cc=prime.zeng@hisilicon.com \
    --cc=reinette.chatre@intel.com \
    --cc=shuah@kernel.org \
    --cc=tan.shaopeng@fujitsu.com \
    --cc=tony.luck@intel.com \
    --cc=wangyushan12@huawei.com \
    --cc=wangzhou1@hisilicon.com \
    --cc=xiaqinxin@huawei.com \
    --cc=xuwei5@huawei.com \
    /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