public inbox for linux-kselftest@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 v2 19/26] selftests/resctrl: Rewrite Cache Allocation Technology (CAT) test
Date: Tue, 28 Nov 2023 14:17:54 -0800	[thread overview]
Message-ID: <516f3152-0690-403e-a8eb-c142888a16d5@intel.com> (raw)
In-Reply-To: <20231120111340.7805-20-ilpo.jarvinen@linux.intel.com>

Hi Ilpo,

On 11/20/2023 3:13 AM, Ilpo Järvinen wrote:
> CAT test spawns two processes into two different control groups with
> exclusive schemata. Both the processes alloc a buffer from memory
> matching their allocated LLC block size and flush the entire buffer out
> of caches. Since the processes are reading through the buffer only once
> during the measurement and initially all the buffer was flushed, the
> test isn't testing CAT.
> 
> Rewrite the CAT test to allocate a buffer sized to half of LLC. Then
> perform a sequence of tests with different LLC alloc sizes starting
> from half of the CBM bits down to 1-bit CBM. Flush the buffer before
> each test and read the buffer twice. Observe the LLC misses on the
> second read through the buffer. As the allocated LLC block gets smaller
> and smaller, the LLC misses will become larger and larger giving a
> strong signal on CAT working properly.
> 
> The new CAT test is using only a single process because it relies on
> measured effect against another run of itself rather than another
> process adding noise. The rest of the system is set to use the CBM bits
> not used by the CAT test to keep the test isolated.
> 
> Replace count_bits() with count_contiguous_bits() to get the first bit
> position in order to be able to calculate masks based on it.
> 
> This change has been tested with a number of systems from different
> generations.
> 
> Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> ---
>  tools/testing/selftests/resctrl/cat_test.c  | 282 +++++++++-----------
>  tools/testing/selftests/resctrl/fill_buf.c  |   6 +-
>  tools/testing/selftests/resctrl/resctrl.h   |   5 +-
>  tools/testing/selftests/resctrl/resctrlfs.c |  44 +--
>  4 files changed, 138 insertions(+), 199 deletions(-)
> 
> diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
> index cfda87667b46..4169b17b8f91 100644
> --- a/tools/testing/selftests/resctrl/cat_test.c
> +++ b/tools/testing/selftests/resctrl/cat_test.c
> @@ -11,65 +11,69 @@
>  #include "resctrl.h"
>  #include <unistd.h>
>  
> -#define RESULT_FILE_NAME1	"result_cat1"
> -#define RESULT_FILE_NAME2	"result_cat2"
> +#define RESULT_FILE_NAME	"result_cat"
>  #define NUM_OF_RUNS		5
> -#define MAX_DIFF_PERCENT	4
> -#define MAX_DIFF		1000000
>  
>  /*
> - * Change schemata. Write schemata to specified
> - * con_mon grp, mon_grp in resctrl FS.
> - * Run 5 times in order to get average values.
> + * Minimum difference in LLC misses between a test with n+1 bits CBM to the
> + * test with n bits is MIN_DIFF_PERCENT_PER_BIT * (n - 1). With e.g. 5 vs 4
> + * bits in the CBM mask, the minimum difference must be at least
> + * MIN_DIFF_PERCENT_PER_BIT * (4 - 1) = 3 percent.
> + *
> + * The relationship between number of used CBM bits and difference in LLC
> + * misses is not expected to be linear. With a small number of bits, the
> + * margin is smaller than with larger number of bits. For selftest purposes,
> + * however, linear approach is enough because ultimately only pass/fail
> + * decision has to be made and distinction between strong and stronger
> + * signal is irrelevant.
>   */
> -static int cat_setup(struct resctrl_val_param *p)
> -{
> -	char schemata[64];
> -	int ret = 0;
> -
> -	/* Run NUM_OF_RUNS times */
> -	if (p->num_of_runs >= NUM_OF_RUNS)
> -		return END_OF_TESTS;
> -
> -	if (p->num_of_runs == 0) {
> -		sprintf(schemata, "%lx", p->mask);
> -		ret = write_schemata(p->ctrlgrp, schemata, p->cpu_no,
> -				     p->resctrl_val);
> -	}
> -	p->num_of_runs++;
> -
> -	return ret;
> -}
> +#define MIN_DIFF_PERCENT_PER_BIT	1
>  
>  static int show_results_info(__u64 sum_llc_val, int no_of_bits,
> -			     unsigned long cache_span, unsigned long max_diff,
> -			     unsigned long max_diff_percent, unsigned long num_of_runs,
> -			     bool platform)
> +			     unsigned long cache_span, long min_diff_percent,

With all care taken in unsigned use I wonder why min_diff_percent is just long?

> +			     unsigned long num_of_runs, bool platform,
> +			     __s64 *prev_avg_llc_val)
>  {
>  	__u64 avg_llc_val = 0;
> -	float diff_percent;
> -	int ret;
> +	float avg_diff;
> +	int ret = 0;
>  
>  	avg_llc_val = sum_llc_val / num_of_runs;
> -	diff_percent = ((float)cache_span - avg_llc_val) / cache_span * 100;
> +	if (*prev_avg_llc_val) {
> +		float delta = (__s64)(avg_llc_val - *prev_avg_llc_val);
>  
> -	ret = platform && abs((int)diff_percent) > max_diff_percent;
> +		avg_diff = delta / *prev_avg_llc_val;
> +		ret = platform && (avg_diff * 100) < (float)min_diff_percent;
>  
> -	ksft_print_msg("%s Check cache miss rate within %lu%%\n",
> -		       ret ? "Fail:" : "Pass:", max_diff_percent);
> +		ksft_print_msg("%s Check cache miss rate changed more than %.1f%%\n",
> +			       ret ? "Fail:" : "Pass:", (float)min_diff_percent);
>  
> -	ksft_print_msg("Percent diff=%d\n", abs((int)diff_percent));
> +		ksft_print_msg("Percent diff=%.1f\n", avg_diff * 100);
> +	}
> +	*prev_avg_llc_val = avg_llc_val;
>  
>  	show_cache_info(no_of_bits, avg_llc_val, cache_span, true);
>  
>  	return ret;
>  }
>  
> -static int check_results(struct resctrl_val_param *param, size_t span)
> +/* Remove one bit from the consecutive cbm mask */

The use of "consecutive" is not clear. In this usage it removes one
bit from the previous mask in order to create the consecutive mask, no?

> +static unsigned long next_mask(unsigned long current_mask)
> +{
> +	return current_mask & (current_mask >> 1);
> +}
> +

The new test looks very good to me. Thank you very much for creating it.

It looks to me as though this test impacts the affinity of main program
since it is only one process, changes its affinity, but never change it back.

Reinette


  reply	other threads:[~2023-11-28 22:18 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20 11:13 [PATCH v2 00/26] selftests/resctrl: CAT test improvements & generalized test framework Ilpo Järvinen
2023-11-20 11:13 ` [PATCH v2 01/26] selftests/resctrl: Don't use ctrlc_handler() outside signal handling Ilpo Järvinen
2023-11-28 22:09   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 02/26] selftests/resctrl: Split fill_buf to allow tests finer-grained control Ilpo Järvinen
2023-11-28 22:10   ` Reinette Chatre
2023-12-07 14:04     ` Ilpo Järvinen
2023-11-20 11:13 ` [PATCH v2 03/26] selftests/resctrl: Refactor fill_buf functions Ilpo Järvinen
2023-11-28 22:10   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 04/26] selftests/resctrl: Refactor get_cbm_mask() and rename to get_full_cbm() Ilpo Järvinen
2023-11-28 22:11   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 05/26] selftests/resctrl: Mark get_cache_size() cache_type const Ilpo Järvinen
2023-11-28 22:11   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 06/26] selftests/resctrl: Create cache_portion_size() helper Ilpo Järvinen
2023-11-28 22:11   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 07/26] selftests/resctrl: Exclude shareable bits from schemata in CAT test Ilpo Järvinen
2023-11-28 22:12   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 08/26] selftests/resctrl: Split measure_cache_vals() Ilpo Järvinen
2023-11-28 22:13   ` Reinette Chatre
2023-12-07 14:32     ` Ilpo Järvinen
2023-12-07 18:02       ` Reinette Chatre
2023-12-07 18:33         ` Ilpo Järvinen
2023-12-07 18:35           ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 09/26] selftests/resctrl: Split show_cache_info() to test specific and generic parts Ilpo Järvinen
2023-11-28 22:13   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 10/26] selftests/resctrl: Remove unnecessary __u64 -> unsigned long conversion Ilpo Järvinen
2023-11-28 22:14   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 11/26] selftests/resctrl: Remove nested calls in perf event handling Ilpo Järvinen
2023-11-28 22:15   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 12/26] selftests/resctrl: Consolidate naming of perf event related things Ilpo Järvinen
2023-11-28 22:15   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 13/26] selftests/resctrl: Improve perf init Ilpo Järvinen
2023-11-28 22:15   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 14/26] selftests/resctrl: Convert perf related globals to locals Ilpo Järvinen
2023-11-28 22:15   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 15/26] selftests/resctrl: Move cat_val() to cat_test.c and rename to cat_test() Ilpo Järvinen
2023-11-28 22:15   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 16/26] selftests/resctrl: Open perf fd before start & add error handling Ilpo Järvinen
2023-11-28 22:16   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 17/26] selftests/resctrl: Replace file write with volatile variable Ilpo Järvinen
2023-11-28 22:16   ` Reinette Chatre
2023-12-07 15:03     ` Ilpo Järvinen
2023-11-20 11:13 ` [PATCH v2 18/26] selftests/resctrl: Read in less obvious order to defeat prefetch optimizations Ilpo Järvinen
2023-11-28 22:17   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 19/26] selftests/resctrl: Rewrite Cache Allocation Technology (CAT) test Ilpo Järvinen
2023-11-28 22:17   ` Reinette Chatre [this message]
2023-12-07 15:18     ` Ilpo Järvinen
2023-11-20 11:13 ` [PATCH v2 20/26] selftests/resctrl: Create struct for input parameters Ilpo Järvinen
2023-11-28 22:18   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 21/26] selftests/resctrl: Introduce generalized test framework Ilpo Järvinen
2023-11-28 22:19   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 22/26] selftests/resctrl: Pass write_schemata() resource instead of test name Ilpo Järvinen
2023-11-28 22:19   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 23/26] selftests/resctrl: Add helper to convert L2/3 to integer Ilpo Järvinen
2023-11-28 22:22   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 24/26] selftests/resctrl: Rename resource ID to domain ID Ilpo Järvinen
2023-11-28 22:22   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 25/26] selftests/resctrl: Get domain id from cache id Ilpo Järvinen
2023-11-28 22:22   ` Reinette Chatre
2023-11-20 11:13 ` [PATCH v2 26/26] selftests/resctrl: Add test groups and name L3 CAT test L3_CAT Ilpo Järvinen
2023-11-28 22:22   ` Reinette Chatre
2023-11-29 11:11     ` Ilpo Järvinen
2023-11-30  7:36       ` Maciej Wieczór-Retman

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=516f3152-0690-403e-a8eb-c142888a16d5@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