| From 125ae0e471647e68cba3b60acc8cdd283d6f33fa Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 5 Sep 2024 12:02:31 -0600 |
| Subject: selftests:resctrl: Fix build failure on archs without __cpuid_count() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Shuah Khan <skhan@linuxfoundation.org> |
| |
| [ Upstream commit 7beaf1da074f7ea25454d6c11da142c3892d3c4e ] |
| |
| When resctrl is built on architectures without __cpuid_count() |
| support, build fails. resctrl uses __cpuid_count() defined in |
| kselftest.h. |
| |
| Even though the problem is seen while building resctrl on aarch64, |
| this error can be seen on any platform that doesn't support CPUID. |
| |
| CPUID is a x86/x86-64 feature and code paths with CPUID asm commands |
| will fail to build on all other architectures. |
| |
| All others tests call __cpuid_count() do so from x86/x86_64 code paths |
| when _i386__ or __x86_64__ are defined. resctrl is an exception. |
| |
| Fix the problem by defining __cpuid_count() only when __i386__ or |
| __x86_64__ are defined in kselftest.h and changing resctrl to call |
| __cpuid_count() only when __i386__ or __x86_64__ are defined. |
| |
| In file included from resctrl.h:24, |
| from cat_test.c:11: |
| In function ‘arch_supports_noncont_cat’, |
| inlined from ‘noncont_cat_run_test’ at cat_test.c:326:6: |
| ../kselftest.h:74:9: error: impossible constraint in ‘asm’ |
| 74 | __asm__ __volatile__ ("cpuid\n\t" \ |
| | ^~~~~~~ |
| cat_test.c:304:17: note: in expansion of macro ‘__cpuid_count’ |
| 304 | __cpuid_count(0x10, 1, eax, ebx, ecx, edx); |
| | ^~~~~~~~~~~~~ |
| ../kselftest.h:74:9: error: impossible constraint in ‘asm’ |
| 74 | __asm__ __volatile__ ("cpuid\n\t" \ |
| | ^~~~~~~ |
| cat_test.c:306:17: note: in expansion of macro ‘__cpuid_count’ |
| 306 | __cpuid_count(0x10, 2, eax, ebx, ecx, edx); |
| |
| Fixes: ae638551ab64 ("selftests/resctrl: Add non-contiguous CBMs CAT test") |
| Reported-by: Muhammad Usama Anjum <usama.anjum@collabora.com> |
| Closes: https://lore.kernel.org/lkml/20240809071059.265914-1-usama.anjum@collabora.com/ |
| Reported-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> |
| Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> |
| Acked-by: Reinette Chatre <reinette.chatre@intel.com> |
| Reviewed-by: Muhammad Usama Anjum <usama.anjum@collabora.com> |
| Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> |
| Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/kselftest.h | 2 ++ |
| tools/testing/selftests/resctrl/cat_test.c | 7 +++++-- |
| 2 files changed, 7 insertions(+), 2 deletions(-) |
| |
| diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h |
| index b8967b6e29d50..e195ec1568599 100644 |
| --- a/tools/testing/selftests/kselftest.h |
| +++ b/tools/testing/selftests/kselftest.h |
| @@ -61,6 +61,7 @@ |
| #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) |
| #endif |
| |
| +#if defined(__i386__) || defined(__x86_64__) /* arch */ |
| /* |
| * gcc cpuid.h provides __cpuid_count() since v4.4. |
| * Clang/LLVM cpuid.h provides __cpuid_count() since v3.4.0. |
| @@ -75,6 +76,7 @@ |
| : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ |
| : "0" (level), "2" (count)) |
| #endif |
| +#endif /* end arch */ |
| |
| /* define kselftest exit codes */ |
| #define KSFT_PASS 0 |
| diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c |
| index 742782438ca3b..94cfdba5308d8 100644 |
| --- a/tools/testing/selftests/resctrl/cat_test.c |
| +++ b/tools/testing/selftests/resctrl/cat_test.c |
| @@ -290,12 +290,12 @@ static int cat_run_test(const struct resctrl_test *test, const struct user_param |
| |
| static bool arch_supports_noncont_cat(const struct resctrl_test *test) |
| { |
| - unsigned int eax, ebx, ecx, edx; |
| - |
| /* AMD always supports non-contiguous CBM. */ |
| if (get_vendor() == ARCH_AMD) |
| return true; |
| |
| +#if defined(__i386__) || defined(__x86_64__) /* arch */ |
| + unsigned int eax, ebx, ecx, edx; |
| /* Intel support for non-contiguous CBM needs to be discovered. */ |
| if (!strcmp(test->resource, "L3")) |
| __cpuid_count(0x10, 1, eax, ebx, ecx, edx); |
| @@ -305,6 +305,9 @@ static bool arch_supports_noncont_cat(const struct resctrl_test *test) |
| return false; |
| |
| return ((ecx >> 3) & 1); |
| +#endif /* end arch */ |
| + |
| + return false; |
| } |
| |
| static int noncont_cat_run_test(const struct resctrl_test *test, |
| -- |
| 2.43.0 |
| |