aarch64 has no vendor_id in /proc/cpuinfo, so detect_vendor() returns 0 and arch_supports_noncont_cat() falls through to "return false". L3_NONCONT_CAT therefore spuriously fails on every ARM MPAM platform.
Define ARCH_ARM, short-circuit detect_vendor() to it on aarch64, and add it to the AMD/Hygon always-supports early-out in arch_supports_noncont_cat(). aarch64 has many implementers (ARM 0x41, NVIDIA 0x43, etc.), but MPAM mandates non-contiguous CPBM uniformly, so per-implementer handling is not needed here. Signed-off-by: Richard Cheng <[email protected]> --- tools/testing/selftests/resctrl/cat_test.c | 9 ++++++-- tools/testing/selftests/resctrl/resctrl.h | 1 + .../testing/selftests/resctrl/resctrl_tests.c | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c index dc414e55ae94..ce66016dbd88 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -292,8 +292,13 @@ 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 always support non-contiguous CBM. ARM/MPAM defines + * MPAMCFG_CPBM as a bitmap with no contiguity constraint per ARM + * DDI 0598. + */ + if (vendor_id == ARCH_AMD || vendor_id == ARCH_HYGON || + vendor_id == ARCH_ARM) return true; #if defined(__i386__) || defined(__x86_64__) /* arch */ diff --git a/tools/testing/selftests/resctrl/resctrl.h b/tools/testing/selftests/resctrl/resctrl.h index afe635b6e48d..670e5b128b4d 100644 --- a/tools/testing/selftests/resctrl/resctrl.h +++ b/tools/testing/selftests/resctrl/resctrl.h @@ -40,6 +40,7 @@ #define ARCH_INTEL BIT(0) #define ARCH_AMD BIT(1) #define ARCH_HYGON BIT(2) +#define ARCH_ARM BIT(3) #define END_OF_TESTS 1 diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c index dbcd5eea9fbc..cfece594a8c6 100644 --- a/tools/testing/selftests/resctrl/resctrl_tests.c +++ b/tools/testing/selftests/resctrl/resctrl_tests.c @@ -23,6 +23,15 @@ static struct resctrl_test *resctrl_tests[] = { &l2_noncont_cat_test, }; +static bool detect_aarch64(void) +{ +#if defined(__aarch64__) + return true; +#else + return false; +#endif +} + static unsigned int detect_vendor(void) { static unsigned int vendor_id; @@ -34,6 +43,18 @@ static unsigned int detect_vendor(void) if (initialized) return vendor_id; + if (detect_aarch64()) { + /* + * aarch64 has no userspace vendor_id in /proc/cpuinfo. + * MPAM-capable ARM implementations follow ARM DDI 0598; + * treat all aarch64 builds as a single vendor for the + * purposes of resctrl selftests. + */ + vendor_id = ARCH_ARM; + initialized = true; + return vendor_id; + } + inf = fopen("/proc/cpuinfo", "r"); if (!inf) { vendor_id = 0; -- 2.43.0

