mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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>,
	"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,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: [PATCH v4 09/29] selftests/resctrl: Create cache_portion_size() helper
Date: Fri, 15 Dec 2023 17:04:55 +0200	[thread overview]
Message-ID: <20231215150515.36983-10-ilpo.jarvinen@linux.intel.com> (raw)
In-Reply-To: <20231215150515.36983-1-ilpo.jarvinen@linux.intel.com>

CAT and CMT tests calculate size of the cache portion for the n-bits
cache allocation on their own.

Add cache_portion_size() helper that calculates size of the cache
portion for the given number of bits and use it to replace the existing
span calculations. This also prepares for the new CAT test that will
need to determine the size of the cache portion also during results
processing.

Rename also 'cache_size' local variables to 'cache_total_size' to
prevent misinterpretations.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
---

v4:
- Correct return type
- Don't allow div-by-zero
---
 tools/testing/selftests/resctrl/cat_test.c | 10 ++++-----
 tools/testing/selftests/resctrl/cmt_test.c |  8 ++++----
 tools/testing/selftests/resctrl/resctrl.h  | 24 ++++++++++++++++++++++
 3 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c
index 242c4c6200aa..f18c95dda5d3 100644
--- a/tools/testing/selftests/resctrl/cat_test.c
+++ b/tools/testing/selftests/resctrl/cat_test.c
@@ -91,7 +91,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 {
 	unsigned long l_mask, l_mask_1;
 	int ret, pipefd[2], sibling_cpu_no;
-	unsigned long cache_size = 0;
+	unsigned long cache_total_size = 0;
 	unsigned long long_mask;
 	int count_of_bits;
 	char pipe_message;
@@ -102,10 +102,10 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 		return ret;
 
 	/* Get L3/L2 cache size */
-	ret = get_cache_size(cpu_no, cache_type, &cache_size);
+	ret = get_cache_size(cpu_no, cache_type, &cache_total_size);
 	if (ret)
 		return ret;
-	ksft_print_msg("Cache size :%lu\n", cache_size);
+	ksft_print_msg("Cache size :%lu\n", cache_total_size);
 
 	count_of_bits = count_bits(long_mask);
 
@@ -136,7 +136,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 	/* Set param values for parent thread which will be allocated bitmask
 	 * with (max_bits - n) bits
 	 */
-	span = cache_size * (count_of_bits - n) / count_of_bits;
+	span = cache_portion_size(cache_total_size, l_mask, long_mask);
 	strcpy(param.ctrlgrp, "c2");
 	strcpy(param.mongrp, "m2");
 	strcpy(param.filename, RESULT_FILE_NAME2);
@@ -158,7 +158,7 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type)
 		param.mask = l_mask_1;
 		strcpy(param.ctrlgrp, "c1");
 		strcpy(param.mongrp, "m1");
-		span = cache_size * n / count_of_bits;
+		span = cache_portion_size(cache_total_size, l_mask_1, long_mask);
 		strcpy(param.filename, RESULT_FILE_NAME1);
 		param.num_of_runs = 0;
 		param.cpu_no = sibling_cpu_no;
diff --git a/tools/testing/selftests/resctrl/cmt_test.c b/tools/testing/selftests/resctrl/cmt_test.c
index a18c6825802c..a14d46353865 100644
--- a/tools/testing/selftests/resctrl/cmt_test.c
+++ b/tools/testing/selftests/resctrl/cmt_test.c
@@ -72,7 +72,7 @@ int cmt_resctrl_val(int cpu_no, int n, const char * const *benchmark_cmd)
 {
 	const char * const *cmd = benchmark_cmd;
 	const char *new_cmd[BENCHMARK_ARGS];
-	unsigned long cache_size = 0;
+	unsigned long cache_total_size = 0;
 	unsigned long long_mask;
 	char *span_str = NULL;
 	int count_of_bits;
@@ -83,10 +83,10 @@ int cmt_resctrl_val(int cpu_no, int n, const char * const *benchmark_cmd)
 	if (ret)
 		return ret;
 
-	ret = get_cache_size(cpu_no, "L3", &cache_size);
+	ret = get_cache_size(cpu_no, "L3", &cache_total_size);
 	if (ret)
 		return ret;
-	ksft_print_msg("Cache size :%lu\n", cache_size);
+	ksft_print_msg("Cache size :%lu\n", cache_total_size);
 
 	count_of_bits = count_bits(long_mask);
 
@@ -107,7 +107,7 @@ int cmt_resctrl_val(int cpu_no, int n, const char * const *benchmark_cmd)
 		.setup		= cmt_setup,
 	};
 
-	span = cache_size * n / count_of_bits;
+	span = cache_portion_size(cache_total_size, param.mask, long_mask);
 
 	if (strcmp(cmd[0], "fill_buf") == 0) {
 		/* Duplicate the command to be able to replace span in it */
diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h
index 9e5777e1eee3..08647f2c07f5 100644
--- a/tools/testing/selftests/resctrl/resctrl.h
+++ b/tools/testing/selftests/resctrl/resctrl.h
@@ -116,4 +116,28 @@ int show_cache_info(unsigned long sum_llc_val, int no_of_bits,
 		    unsigned long max_diff_percent, unsigned long num_of_runs,
 		    bool platform, bool cmt);
 
+/*
+ * cache_portion_size - Calculate the size of a cache portion
+ * @cache_size:		Total cache size in bytes
+ * @portion_mask:	Cache portion mask
+ * @full_cache_mask:	Full Cache Bit Mask (CBM) for the cache
+ *
+ * Return: The size of the cache portion in bytes.
+ */
+static inline unsigned long cache_portion_size(unsigned long cache_size,
+					       unsigned long portion_mask,
+					       unsigned long full_cache_mask)
+{
+	unsigned int bits = count_bits(full_cache_mask);
+
+	/*
+	 * With no bits the full CBM, assume cache cannot be split into
+	 * smaller portions. To avoid divide by zero, return cache_size.
+	 */
+	if (!bits)
+		return cache_size;
+
+	return cache_size * count_bits(portion_mask) / bits;
+}
+
 #endif /* RESCTRL_H */
-- 
2.30.2


  parent reply	other threads:[~2023-12-15 15:06 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-15 15:04 [PATCH v4 00/29] selftests/resctrl: CAT test improvements & generalized test framework Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 01/29] selftests/resctrl: Convert perror() to ksft_perror() or ksft_print_msg() Ilpo Järvinen
2023-12-15 17:39   ` Reinette Chatre
2023-12-15 15:04 ` [PATCH v4 02/29] selftests/resctrl: Return -1 instead of errno on error Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 03/29] selftests/resctrl: Don't use ctrlc_handler() outside signal handling Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 04/29] selftests/resctrl: Change function comments to say < 0 on error Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 05/29] selftests/resctrl: Split fill_buf to allow tests finer-grained control Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 06/29] selftests/resctrl: Refactor fill_buf functions Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 07/29] selftests/resctrl: Refactor get_cbm_mask() and rename to get_full_cbm() Ilpo Järvinen
2023-12-15 17:40   ` Reinette Chatre
2023-12-15 15:04 ` [PATCH v4 08/29] selftests/resctrl: Mark get_cache_size() cache_type const Ilpo Järvinen
2023-12-15 15:04 ` Ilpo Järvinen [this message]
2023-12-15 15:04 ` [PATCH v4 10/29] selftests/resctrl: Exclude shareable bits from schemata in CAT test Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 11/29] selftests/resctrl: Split measure_cache_vals() Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 12/29] selftests/resctrl: Split show_cache_info() to test specific and generic parts Ilpo Järvinen
2023-12-15 15:04 ` [PATCH v4 13/29] selftests/resctrl: Remove unnecessary __u64 -> unsigned long conversion Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 14/29] selftests/resctrl: Remove nested calls in perf event handling Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 15/29] selftests/resctrl: Consolidate naming of perf event related things Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 16/29] selftests/resctrl: Improve perf init Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 17/29] selftests/resctrl: Convert perf related globals to locals Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 18/29] selftests/resctrl: Move cat_val() to cat_test.c and rename to cat_test() Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 19/29] selftests/resctrl: Open perf fd before start & add error handling Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 20/29] selftests/resctrl: Replace file write with volatile variable Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 21/29] selftests/resctrl: Read in less obvious order to defeat prefetch optimizations Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 22/29] selftests/resctrl: Rewrite Cache Allocation Technology (CAT) test Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 23/29] selftests/resctrl: Restore the CPU affinity after CAT test Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 24/29] selftests/resctrl: Create struct for input parameters Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 25/29] selftests/resctrl: Introduce generalized test framework Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 26/29] selftests/resctrl: Pass write_schemata() resource instead of test name Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 27/29] selftests/resctrl: Add helper to convert L2/3 to integer Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 28/29] selftests/resctrl: Rename resource ID to domain ID Ilpo Järvinen
2023-12-15 15:05 ` [PATCH v4 29/29] selftests/resctrl: Get domain id from cache id Ilpo Järvinen
2023-12-15 17:45 ` [PATCH v4 00/29] selftests/resctrl: CAT test improvements & generalized test framework Reinette Chatre
2023-12-15 23:45   ` 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=20231215150515.36983-10-ilpo.jarvinen@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.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 \
    --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

all inboxes | Powered by JetHome®