From: Reinette Chatre <reinette.chatre@intel.com>
To: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
linux-kselftest@vger.kernel.org, "Shuah Khan" <shuah@kernel.org>,
"Shaopeng Tan" <tan.shaopeng@jp.fujitsu.com>,
"Maciej Wieczór-Retman" <maciej.wieczor-retman@intel.com>,
"Fenghua Yu" <fenghua.yu@intel.com>
Cc: <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 23/29] selftests/resctrl: Restore the CPU affinity after CAT test
Date: Wed, 13 Dec 2023 13:59:19 -0800 [thread overview]
Message-ID: <04650d92-fb80-49e2-87b7-4f9dbec922b8@intel.com> (raw)
In-Reply-To: <20231211121826.14392-24-ilpo.jarvinen@linux.intel.com>
Hi Ilpo,
On 12/11/2023 4:18 AM, Ilpo Järvinen wrote:
> CAT test does not reset the CPU affinity after the benchmark.
> This is relatively harmless as is because CAT test is the last
> benchmark to run, however, more tests may be added later.
>
> Store the CPU affinity the first time taskset_benchmark() is run and
> add taskset_restore() which the test can call to reset the CPU mask to
> its original value.
>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> ---
>
> v3:
> - New patch
> ---
> tools/testing/selftests/resctrl/cat_test.c | 13 +++++---
> tools/testing/selftests/resctrl/resctrl.h | 3 +-
> tools/testing/selftests/resctrl/resctrl_val.c | 2 +-
> tools/testing/selftests/resctrl/resctrlfs.c | 33 +++++++++++++++++--
> 4 files changed, 42 insertions(+), 9 deletions(-)
>
> diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
> index b79916069788..fa95433297c9 100644
> --- a/tools/testing/selftests/resctrl/cat_test.c
> +++ b/tools/testing/selftests/resctrl/cat_test.c
> @@ -156,6 +156,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
> char *resctrl_val = param->resctrl_val;
> struct perf_event_read pe_read;
> struct perf_event_attr pea;
> + cpu_set_t old_affinity;
> unsigned char *buf;
> char schemata[64];
> int ret, i, pe_fd;
> @@ -167,7 +168,7 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
> bm_pid = getpid();
>
> /* Taskset benchmark to specified cpu */
> - ret = taskset_benchmark(bm_pid, param->cpu_no);
> + ret = taskset_benchmark(bm_pid, param->cpu_no, &old_affinity);
> if (ret)
> return ret;
>
> @@ -175,13 +176,15 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
> ret = write_bm_pid_to_resctrl(bm_pid, param->ctrlgrp, param->mongrp,
> resctrl_val);
> if (ret)
> - return ret;
> + goto reset_affinity;
>
> perf_event_attr_initialize(&pea, PERF_COUNT_HW_CACHE_MISSES);
> perf_event_initialize_read_format(&pe_read);
> pe_fd = perf_open(&pea, bm_pid, param->cpu_no);
> - if (pe_fd < 0)
> - return pe_fd;
> + if (pe_fd < 0) {
> + ret = -1;
> + goto reset_affinity;
> + }
>
> buf = alloc_buffer(span, 1);
> if (!buf) {
> @@ -220,6 +223,8 @@ static int cat_test(struct resctrl_val_param *param, size_t span, unsigned long
> free(buf);
> pe_close:
> close(pe_fd);
> +reset_affinity:
> + taskset_restore(bm_pid, &old_affinity);
>
> return ret;
> }
> diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
> index da1f1b508aee..da62f4cd5add 100644
> --- a/tools/testing/selftests/resctrl/resctrl.h
> +++ b/tools/testing/selftests/resctrl/resctrl.h
> @@ -98,7 +98,8 @@ int umount_resctrlfs(void);
> int validate_bw_report_request(char *bw_report);
> bool validate_resctrl_feature_request(const char *resource, const char *feature);
> char *fgrep(FILE *inf, const char *str);
> -int taskset_benchmark(pid_t bm_pid, int cpu_no);
> +int taskset_benchmark(pid_t bm_pid, int cpu_no, cpu_set_t *old_affinity);
> +int taskset_restore(pid_t bm_pid, cpu_set_t *old_affinity);
> int write_schemata(char *ctrlgrp, char *schemata, int cpu_no,
> char *resctrl_val);
> int write_bm_pid_to_resctrl(pid_t bm_pid, char *ctrlgrp, char *mongrp,
> diff --git a/tools/testing/selftests/resctrl/resctrl_val.c b/tools/testing/selftests/resctrl/resctrl_val.c
> index d515850cc174..4aed974efa0f 100644
> --- a/tools/testing/selftests/resctrl/resctrl_val.c
> +++ b/tools/testing/selftests/resctrl/resctrl_val.c
> @@ -777,7 +777,7 @@ int resctrl_val(const char * const *benchmark_cmd, struct resctrl_val_param *par
> value.sival_ptr = (void *)benchmark_cmd;
>
> /* Taskset benchmark to specified cpu */
> - ret = taskset_benchmark(bm_pid, param->cpu_no);
> + ret = taskset_benchmark(bm_pid, param->cpu_no, NULL);
> if (ret)
> goto out;
>
> diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c
> index dffe42e11c6c..97760fadcddf 100644
> --- a/tools/testing/selftests/resctrl/resctrlfs.c
> +++ b/tools/testing/selftests/resctrl/resctrlfs.c
> @@ -345,15 +345,25 @@ int get_mask_no_shareable(const char *cache_type, unsigned long *mask)
>
> /*
> * taskset_benchmark - Taskset PID (i.e. benchmark) to a specified cpu
> - * @bm_pid: PID that should be binded
> - * @cpu_no: CPU number at which the PID would be binded
> + * @bm_pid: PID that should be binded
> + * @cpu_no: CPU number at which the PID would be binded
> + * @old_affinity: When not NULL, set to old CPU affinity
> *
> * Return: 0 on success, < 0 on error.
> */
> -int taskset_benchmark(pid_t bm_pid, int cpu_no)
> +int taskset_benchmark(pid_t bm_pid, int cpu_no, cpu_set_t *old_affinity)
> {
> cpu_set_t my_set;
>
> + if (old_affinity) {
> + CPU_ZERO(old_affinity);
> + if (sched_getaffinity(bm_pid, sizeof(*old_affinity),
> + old_affinity)) {
> + ksft_perror("Unable to read previous CPU affinity");
"previous" can be confusing here (it is not trying to determine something
from the past but instead the current state). It can just be "Unable to read
CPU affinity"
> + return -1;
> + }
> + }
> +
> CPU_ZERO(&my_set);
> CPU_SET(cpu_no, &my_set);
>
> @@ -366,6 +376,23 @@ int taskset_benchmark(pid_t bm_pid, int cpu_no)
> return 0;
> }
>
> +/*
> + * taskset_restore - Taskset PID to the earlier CPU affinity
> + * @bm_pid: PID that should be reset
> + * @old_affinity: The old CPU affinity to restore
> + *
> + * Return: 0 on success, < 0 on error.
> + */
> +int taskset_restore(pid_t bm_pid, cpu_set_t *old_affinity)
> +{
> + if (sched_setaffinity(bm_pid, sizeof(*old_affinity), old_affinity)) {
> + ksft_perror("Unable to restore taskset");
This message is not clear to me. How about "Unable to restore CPU affinity"?
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> /*
> * create_grp - Create a group only if one doesn't exist
> * @grp_name: Name of the group
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Reinette
next prev parent reply other threads:[~2023-12-13 21:59 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-11 12:17 [PATCH v3 00/29] selftests/resctrl: CAT test improvements & generalized test framework Ilpo Järvinen
2023-12-11 12:17 ` [PATCH v3 01/29] selftests/resctrl: Convert perror() to ksft_perror() or ksft_print_msg() Ilpo Järvinen
2023-12-13 21:53 ` Reinette Chatre
2023-12-14 10:12 ` Ilpo Järvinen
2023-12-14 18:10 ` Reinette Chatre
2023-12-11 12:17 ` [PATCH v3 02/29] selftests/resctrl: Return -1 instead of errno on error Ilpo Järvinen
2023-12-13 21:54 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 03/29] selftests/resctrl: Don't use ctrlc_handler() outside signal handling Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 04/29] selftests/resctrl: Change function comments to say < 0 on error Ilpo Järvinen
2023-12-13 21:54 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 05/29] selftests/resctrl: Split fill_buf to allow tests finer-grained control Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 06/29] selftests/resctrl: Refactor fill_buf functions Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 07/29] selftests/resctrl: Refactor get_cbm_mask() and rename to get_full_cbm() Ilpo Järvinen
2023-12-13 21:55 ` Reinette Chatre
2023-12-14 10:14 ` Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 08/29] selftests/resctrl: Mark get_cache_size() cache_type const Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 09/29] selftests/resctrl: Create cache_portion_size() helper Ilpo Järvinen
2023-12-13 21:56 ` Reinette Chatre
2023-12-14 10:16 ` Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 10/29] selftests/resctrl: Exclude shareable bits from schemata in CAT test Ilpo Järvinen
2023-12-13 21:56 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 11/29] selftests/resctrl: Split measure_cache_vals() Ilpo Järvinen
2023-12-13 21:56 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 12/29] selftests/resctrl: Split show_cache_info() to test specific and generic parts Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 13/29] selftests/resctrl: Remove unnecessary __u64 -> unsigned long conversion Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 14/29] selftests/resctrl: Remove nested calls in perf event handling Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 15/29] selftests/resctrl: Consolidate naming of perf event related things Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 16/29] selftests/resctrl: Improve perf init Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 17/29] selftests/resctrl: Convert perf related globals to locals Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 18/29] selftests/resctrl: Move cat_val() to cat_test.c and rename to cat_test() Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 19/29] selftests/resctrl: Open perf fd before start & add error handling Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 20/29] selftests/resctrl: Replace file write with volatile variable Ilpo Järvinen
2023-12-13 21:56 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 21/29] selftests/resctrl: Read in less obvious order to defeat prefetch optimizations Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 22/29] selftests/resctrl: Rewrite Cache Allocation Technology (CAT) test Ilpo Järvinen
2023-12-13 21:56 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 23/29] selftests/resctrl: Restore the CPU affinity after CAT test Ilpo Järvinen
2023-12-13 21:59 ` Reinette Chatre [this message]
2023-12-14 10:25 ` Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 24/29] selftests/resctrl: Create struct for input parameters Ilpo Järvinen
2023-12-13 21:59 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 25/29] selftests/resctrl: Introduce generalized test framework Ilpo Järvinen
2023-12-13 22:00 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 26/29] selftests/resctrl: Pass write_schemata() resource instead of test name Ilpo Järvinen
2023-12-11 12:18 ` [PATCH v3 27/29] selftests/resctrl: Add helper to convert L2/3 to integer Ilpo Järvinen
2023-12-13 22:00 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 28/29] selftests/resctrl: Rename resource ID to domain ID Ilpo Järvinen
2023-12-13 22:01 ` Reinette Chatre
2023-12-11 12:18 ` [PATCH v3 29/29] selftests/resctrl: Get domain id from cache id Ilpo Järvinen
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=04650d92-fb80-49e2-87b7-4f9dbec922b8@intel.com \
--to=reinette.chatre@intel.com \
--cc=fenghua.yu@intel.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maciej.wieczor-retman@intel.com \
--cc=shuah@kernel.org \
--cc=tan.shaopeng@jp.fujitsu.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