public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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

  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