|
|
149784 |
From 3721c7fe276dbbc93e584359f87913e58f96626e Mon Sep 17 00:00:00 2001
|
|
|
149784 |
From: Sitsofe Wheeler <sitsofe@yahoo.com>
|
|
|
149784 |
Date: Mon, 6 Dec 2021 20:02:53 +0000
|
|
|
149784 |
Subject: [PATCH] os: detect PMULL support before enabling accelerated crc32c
|
|
|
149784 |
on ARM
|
|
|
149784 |
|
|
|
149784 |
Issue #1239 shows a crash on a FUJITSU/A64FX ARM platform at the
|
|
|
149784 |
following line:
|
|
|
149784 |
|
|
|
149784 |
crc/crc32c-arm64.c:
|
|
|
149784 |
64 t1 = (uint64_t)vmull_p64(crc1, k2);
|
|
|
149784 |
|
|
|
149784 |
On armv8 PMULL crypto instructions like vmull_p64 are defined as
|
|
|
149784 |
optional (see
|
|
|
149784 |
https://github.com/google/crc32c/pull/6#issuecomment-328713398 and
|
|
|
149784 |
https://github.com/dotnet/runtime/issues/35143#issuecomment-617263508 ).
|
|
|
149784 |
|
|
|
149784 |
Avoid the crash by gating use of the hardware accelerated ARM crc32c
|
|
|
149784 |
path behind runtime detection of PMULL.
|
|
|
149784 |
|
|
|
149784 |
Fixes: https://github.com/axboe/fio/issues/1239
|
|
|
149784 |
|
|
|
149784 |
Signed-off-by: Sitsofe Wheeler <sitsofe@yahoo.com>
|
|
|
149784 |
Tested-by: Yi Zhang <yi.zhang@redhat.com>
|
|
|
149784 |
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
|
149784 |
---
|
|
|
149784 |
os/os-linux.h | 6 +++++-
|
|
|
149784 |
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
|
149784 |
|
|
|
149784 |
diff --git a/os/os-linux.h b/os/os-linux.h
|
|
|
149784 |
index 808f1d02..3001140c 100644
|
|
|
149784 |
--- a/os/os-linux.h
|
|
|
149784 |
+++ b/os/os-linux.h
|
|
|
149784 |
@@ -20,6 +20,9 @@
|
|
|
149784 |
|
|
|
149784 |
#ifdef ARCH_HAVE_CRC_CRYPTO
|
|
|
149784 |
#include <sys/auxv.h>
|
|
|
149784 |
+#ifndef HWCAP_PMULL
|
|
|
149784 |
+#define HWCAP_PMULL (1 << 4)
|
|
|
149784 |
+#endif /* HWCAP_PMULL */
|
|
|
149784 |
#ifndef HWCAP_CRC32
|
|
|
149784 |
#define HWCAP_CRC32 (1 << 7)
|
|
|
149784 |
#endif /* HWCAP_CRC32 */
|
|
|
149784 |
@@ -405,7 +408,8 @@ static inline bool os_cpu_has(cpu_features feature)
|
|
|
149784 |
#ifdef ARCH_HAVE_CRC_CRYPTO
|
|
|
149784 |
case CPU_ARM64_CRC32C:
|
|
|
149784 |
hwcap = getauxval(AT_HWCAP);
|
|
|
149784 |
- have_feature = (hwcap & HWCAP_CRC32) != 0;
|
|
|
149784 |
+ have_feature = (hwcap & (HWCAP_PMULL | HWCAP_CRC32)) ==
|
|
|
149784 |
+ (HWCAP_PMULL | HWCAP_CRC32);
|
|
|
149784 |
break;
|
|
|
149784 |
#endif
|
|
|
149784 |
default:
|
|
|
149784 |
--
|
|
|
149784 |
2.38.1
|
|
|
149784 |
|