This commit adds support for HiSilicon CAT/CMT test by adapting the HiSilicon-specificed implementation.
1. Handle Cache Masking on HiSilicon: On HiSilicon's platform, all cache are shareable, platform-level non-contiguous CAT is not applicable, and the test should default to using the full cache. 2. Extend Non-Contiguous CAT Support: HiSilicon always support non-contiguous CBM. 3. Specify Mount Options for HiSilicon resctrlfs: When mounting the resctrl filesystem on HiSilicon platform, specify "l2" option. 4. Adjust Perf Event Attributes for ARM: ARM performance counters do not support mode exclusion. Signed-off-by: Yifan Wu <[email protected]> --- tools/testing/selftests/resctrl/cache.c | 4 +++- tools/testing/selftests/resctrl/cat_test.c | 18 +++++++++++------- tools/testing/selftests/resctrl/resctrlfs.c | 5 ++++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/resctrl/cache.c b/tools/testing/selftests/resctrl/cache.c index 1ff1104e6575..798aefc6cb29 100644 --- a/tools/testing/selftests/resctrl/cache.c +++ b/tools/testing/selftests/resctrl/cache.c @@ -13,7 +13,9 @@ void perf_event_attr_initialize(struct perf_event_attr *pea, __u64 config) pea->read_format = PERF_FORMAT_GROUP; pea->exclude_kernel = 1; pea->exclude_hv = 1; - pea->exclude_idle = 1; + /* ARM performance counters do not support mode exclusion */ + if (get_vendor() != ARCH_HISILICON) + pea->exclude_idle = 1; pea->exclude_callchain_kernel = 1; pea->inherit = 1; pea->exclude_guest = 1; diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c index f00b622c1460..e5365665a6d3 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -245,11 +245,15 @@ static int cat_run_test(const struct resctrl_test *test, const struct user_param ret = get_full_cbm(test->resource, &full_cache_mask); if (ret) return ret; - /* Get the largest contiguous exclusive portion of the cache */ - ret = get_mask_no_shareable(test->resource, &long_mask); - if (ret) - return ret; - + if (get_vendor() == ARCH_HISILICON) { + /* On HiSilicon's platform, all cache are shareable. */ + long_mask = full_cache_mask; + } else { + /* Get the largest contiguous exclusive portion of the cache */ + ret = get_mask_no_shareable(test->resource, &long_mask); + if (ret) + return ret; + } /* Get L3/L2 cache size */ ret = get_cache_size(uparams->cpu, test->resource, &cache_total_size); if (ret) @@ -292,8 +296,8 @@ static bool arch_supports_noncont_cat(const struct resctrl_test *test) { unsigned int vendor_id = get_vendor(); - /* AMD and Hygon always support non-contiguous CBM. */ - if (vendor_id == ARCH_AMD || vendor_id == ARCH_HYGON) + /* AMD and Hygon and HiSilicon always support non-contiguous CBM. */ + if (vendor_id == ARCH_AMD || vendor_id == ARCH_HYGON || vendor_id == ARCH_HISILICON) return true; #if defined(__i386__) || defined(__x86_64__) /* arch */ diff --git a/tools/testing/selftests/resctrl/resctrlfs.c b/tools/testing/selftests/resctrl/resctrlfs.c index 01b775cfe849..7567d3b31efb 100644 --- a/tools/testing/selftests/resctrl/resctrlfs.c +++ b/tools/testing/selftests/resctrl/resctrlfs.c @@ -69,7 +69,10 @@ int mount_resctrlfs(void) return -1; ksft_print_msg("Mounting resctrl to \"%s\"\n", RESCTRL_PATH); - ret = mount("resctrl", RESCTRL_PATH, "resctrl", 0, NULL); + if (get_vendor() == ARCH_HISILICON) + ret = mount("resctrl", RESCTRL_PATH, "resctrl", 0, "l2"); + else + ret = mount("resctrl", RESCTRL_PATH, "resctrl", 0, NULL); if (ret) ksft_perror("mount"); -- 2.33.0

