Hi Ilpo,
On 10/24/2023 2:26 AM, Ilpo Järvinen wrote:
CAT test doesn't take shareable bits into account, i.e., the test might be sharing cache with some devices (e.g., graphics).
Introduce get_mask_no_shareable() and use it to provision an environment for CAT test where the allocated LLC is isolated better. Excluding shareable_bits may create hole(s) into the cbm_mask, thus add a new helper count_contiguous_bits() to find the longest contiguous set of CBM bits.
create_bit_mask() is needed by an upcoming CAT test rewrite so make it available in resctrl.h right away.
Signed-off-by: Ilpo Järvinen ilpo.jarvinen@linux.intel.com
tools/testing/selftests/resctrl/cat_test.c | 12 ++- tools/testing/selftests/resctrl/resctrl.h | 3 + tools/testing/selftests/resctrl/resctrlfs.c | 84 +++++++++++++++++++++ 3 files changed, 95 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c index 80861c362a53..e5861e7cba7e 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -92,13 +92,17 @@ 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_total_size = 0;
- unsigned long long_mask;
- unsigned long full_cache_mask, long_mask;
Please do maintain reverse fir order.
int count_of_bits; char pipe_message; size_t span; /* Get default cbm mask for L3/L2 cache */
- ret = get_cbm_mask(cache_type, &long_mask);
- ret = get_cbm_mask(cache_type, &full_cache_mask);
- if (ret)
return ret;
- /* Get the exclusive portion of the cache */
- ret = get_mask_no_shareable(cache_type, &long_mask); if (ret) return ret;
+/*
- count_contiguous_bits - Returns the longest train of bits in a bit mask
- @val A bit mask
- @start The location of the least-significant bit of the longest train
- Return: The length of the contiguous bits in the longest train of bits
- */
+static unsigned int count_contiguous_bits(unsigned long val, unsigned int *start) +{
- unsigned long last_val;
- int count = 0;
could count be unsigned int?
- while (val) {
last_val = val;
val &= (val >> 1);
count++;
- }
- if (start) {
if (count)
*start = ffsl(last_val) - 1;
else
*start = 0;
- }
- return count;
+}
/*
- get_cbm_mask - Get cbm bit mask
- @cache_type: Cache level L2/L3
@@ -253,6 +291,52 @@ int get_cbm_mask(const char *cache_type, unsigned long *mask) return 0; } +/*
- get_shareable_mask - Get shareable mask from shareable_bits for given cache
- @cache_type: Cache level L2/L3
- @shareable_mask: shareable mask returned as unsigned long
A nitpick but please be consistent in starting sentences with capital letter.
- Return: = 0 on success, < 0 on failure.
- */
+int get_shareable_mask(const char *cache_type, unsigned long *shareable_mask) +{
- char mask_path[1024];
- if (!cache_type)
return -1;
Same question as earlier about error checking.
- snprintf(mask_path, sizeof(mask_path), "%s/%s/shareable_bits",
INFO_PATH, cache_type);
- return get_bit_mask(mask_path, shareable_mask);
+}
+/*
- get_mask_no_shareable - Get CBM mask without shareable_bits for given cache
- @cache_type: Cache level L2/L3
- @mask: mask returned as unsigned long
Apart from comment about capital letter this comment does not seem to reveal more about what code does.
- Return: = 0 on success, < 0 on failure.
- */
+int get_mask_no_shareable(const char *cache_type, unsigned long *mask) +{
- unsigned long full_mask, shareable_mask;
- unsigned int start, len;
- if (get_cbm_mask(cache_type, &full_mask) < 0)
return -1;
- if (get_shareable_mask(cache_type, &shareable_mask) < 0)
return -1;
- len = count_contiguous_bits(full_mask & ~shareable_mask, &start);
- if (!len)
return -1;
- *mask = create_bit_mask(start, len);
- return 0;
+}
Nicely done, thanks.
/*
- get_core_sibling - Get sibling core id from the same socket for given CPU
- @cpu_no: CPU number
Reinette