]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix kernel unaligned access on sparc64
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 11 Jul 2018 20:10:40 +0000 (13:10 -0700)
committerTony Hutter <hutter2@llnl.gov>
Fri, 6 Jul 2018 09:46:51 +0000 (02:46 -0700)
Update the SA_COPY_DATA macro to check if architecture supports
efficient unaligned memory accesses at compile time.  Otherwise
fallback to using the sa_copy_data() function.

The kernel provided CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is
used to determine availability in kernel space.  In user space
the x86_64, x86, powerpc, and sometimes arm architectures will
define the HAVE_EFFICIENT_UNALIGNED_ACCESS macro.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #7642
Closes #7684

lib/libspl/include/sys/isa_defs.h
module/icp/algs/modes/ccm.c
module/zfs/sa.c

index a5bea0396e7b21f87fa86da980bea368fdea638f..7a90e077e8079512f52dceaba6965fd56dbb7fd7 100644 (file)
@@ -55,6 +55,7 @@ extern "C" {
 #endif
 
 #define        _SUNOS_VTOC_16
+#define        HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 /* i386 arch specific defines */
 #elif defined(__i386) || defined(__i386__)
@@ -76,6 +77,7 @@ extern "C" {
 #endif
 
 #define        _SUNOS_VTOC_16
+#define        HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 /* powerpc arch specific defines */
 #elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__)
@@ -99,6 +101,7 @@ extern "C" {
 #endif
 
 #define        _SUNOS_VTOC_16
+#define        HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 /* arm arch specific defines */
 #elif defined(__arm) || defined(__arm__) || defined(__aarch64__)
@@ -129,6 +132,10 @@ extern "C" {
 
 #define        _SUNOS_VTOC_16
 
+#if defined(__ARM_FEATURE_UNALIGNED)
+#define        HAVE_EFFICIENT_UNALIGNED_ACCESS
+#endif
+
 /* sparc arch specific defines */
 #elif defined(__sparc) || defined(__sparc__)
 
index 22aeb0a6aa47740329078e4d0a5e9a1d4423991f..fb41194f8175d3584ae5b970574b5fbeeb58b599 100644 (file)
@@ -28,7 +28,7 @@
 #include <sys/crypto/common.h>
 #include <sys/crypto/impl.h>
 
-#if defined(__i386) || defined(__amd64)
+#ifdef HAVE_EFFICIENT_UNALIGNED_ACCESS
 #include <sys/byteorder.h>
 #define        UNALIGNED_POINTERS_PERMITTED
 #endif
index 8046dbde28adc24f869235bea798a8840bc220df..1fb1a8b54a67969458875fe3018b122fe4e90ac5 100644 (file)
@@ -147,21 +147,26 @@ arc_byteswap_func_t sa_bswap_table[] = {
        zfs_acl_byteswap,
 };
 
-#define        SA_COPY_DATA(f, s, t, l) \
-       { \
-               if (f == NULL) { \
-                       if (l == 8) { \
-                               *(uint64_t *)t = *(uint64_t *)s; \
-                       } else if (l == 16) { \
-                               *(uint64_t *)t = *(uint64_t *)s; \
-                               *(uint64_t *)((uintptr_t)t + 8) = \
-                                   *(uint64_t *)((uintptr_t)s + 8); \
-                       } else { \
-                               bcopy(s, t, l); \
-                       } \
-               } else \
-                       sa_copy_data(f, s, t, l); \
-       }
+#ifdef HAVE_EFFICIENT_UNALIGNED_ACCESS
+#define        SA_COPY_DATA(f, s, t, l)                                \
+do {                                                           \
+       if (f == NULL) {                                        \
+               if (l == 8) {                                   \
+                       *(uint64_t *)t = *(uint64_t *)s;        \
+               } else if (l == 16) {                           \
+                       *(uint64_t *)t = *(uint64_t *)s;        \
+                       *(uint64_t *)((uintptr_t)t + 8) =       \
+                           *(uint64_t *)((uintptr_t)s + 8);    \
+               } else {                                        \
+                       bcopy(s, t, l);                         \
+               }                                               \
+       } else {                                                \
+               sa_copy_data(f, s, t, l);                       \
+       }                                                       \
+} while (0)
+#else
+#define        SA_COPY_DATA(f, s, t, l)        sa_copy_data(f, s, t, l)
+#endif
 
 /*
  * This table is fixed and cannot be changed.  Its purpose is to