L3_CAT measures cache isolation, which requires at least one ache bit not shared with non-CPU agents, i.e. cbm_mask & ~shareable_bits != 0 . On MPAM, shareable_bits == cbm_mask is a legitimate state, so there might be situations that no bit can be reported as exclusive.
Previously get_mask_no_shareable() does the check inside cat_run_test(), which returns -1 silently and surfaced as a failure for arm64 MPAM. Implement cat_feature_check() to run the same check at feature-check time, it prints a diagnostic and return false so the test case itself can know when to skip. 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 37ca70523ed2..6a25efa59837 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -383,11 +383,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 if that 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

