L3_CAT measures cache isolation, which requires at least one cache bit that is not shared with non-CPU agents, i.e. cbm_mask & ~shareable_bits must be non-zero. On MPAM, shareable_bits == cbm_mask is a legitimate state, so there are situations in which no bit can be reported as exclusive.
Previously get_mask_no_shareable() was invoked inside cat_run_test() and silently returned -1, which surfaced as a test failure on arm64 MPAM systems. Implement cat_feature_check() to perform the same check at feature-check time. It prints a diagnostic and returns false so the test case is skipped instead of failing. Tested-by: Chen Yu <[email protected]> Signed-off-by: Richard Cheng <[email protected]> --- tools/testing/selftests/resctrl/cat_test.c | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c index f00b622c1460..dc414e55ae94 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -378,11 +378,32 @@ static bool noncont_cat_feature_check(const struct resctrl_test *test) return resource_info_file_exists(test->resource, "sparse_masks"); } +static bool cat_feature_check(const struct resctrl_test *test) +{ + unsigned long mask; + + if (!test_resource_feature_check(test)) + return false; + + /* + * The CAT isolation measurement needs a cache portion that no + * other agent shares. On MPAM the kernel may legitimately report + * all bits as shareable; skip the test if that is the case. + */ + if (get_mask_no_shareable(test->resource, &mask)) { + ksft_print_msg("All %s bits are shareable; cannot measure CAT isolation\n", + test->resource); + return false; + } + + return true; +} + struct resctrl_test l3_cat_test = { .name = "L3_CAT", .group = "CAT", .resource = "L3", - .feature_check = test_resource_feature_check, + .feature_check = cat_feature_check, .run_test = cat_run_test, .cleanup = cat_test_cleanup, }; -- 2.43.0

