md/raid6: delta syndrome for ARM NEON
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 1 Jul 2015 02:19:56 +0000 (12:19 +1000)
committerNeilBrown <neilb@suse.com>
Mon, 31 Aug 2015 17:29:05 +0000 (19:29 +0200)
This implements XOR syndrome calculation using NEON intrinsics.
As before, the module can be built for ARM and arm64 from the
same source.

Relative performance on a Cortex-A57 based system:

  raid6: int64x1  gen()   905 MB/s
  raid6: int64x1  xor()   881 MB/s
  raid6: int64x2  gen()  1343 MB/s
  raid6: int64x2  xor()  1286 MB/s
  raid6: int64x4  gen()  1896 MB/s
  raid6: int64x4  xor()  1321 MB/s
  raid6: int64x8  gen()  1773 MB/s
  raid6: int64x8  xor()  1165 MB/s
  raid6: neonx1   gen()  1834 MB/s
  raid6: neonx1   xor()  1278 MB/s
  raid6: neonx2   gen()  2528 MB/s
  raid6: neonx2   xor()  1942 MB/s
  raid6: neonx4   gen()  2888 MB/s
  raid6: neonx4   xor()  2334 MB/s
  raid6: neonx8   gen()  2957 MB/s
  raid6: neonx8   xor()  2232 MB/s
  raid6: using algorithm neonx8 gen() 2957 MB/s
  raid6: .... xor() 2232 MB/s, rmw enabled

Cc: Markus Stockhausen <stockhausen@collogia.de>
Cc: Neil Brown <neilb@suse.de>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: NeilBrown <neilb@suse.com>
lib/raid6/neon.c
lib/raid6/neon.uc

index d9ad6ee..7076ef1 100644 (file)
                                        (unsigned long)bytes, ptrs);    \
                kernel_neon_end();                                      \
        }                                                               \
+       static void raid6_neon ## _n ## _xor_syndrome(int disks,        \
+                                       int start, int stop,            \
+                                       size_t bytes, void **ptrs)      \
+       {                                                               \
+               void raid6_neon ## _n  ## _xor_syndrome_real(int,       \
+                               int, int, unsigned long, void**);       \
+               kernel_neon_begin();                                    \
+               raid6_neon ## _n ## _xor_syndrome_real(disks,           \
+                       start, stop, (unsigned long)bytes, ptrs);       \
+               kernel_neon_end();                                      \
+       }                                                               \
        struct raid6_calls const raid6_neonx ## _n = {                  \
                raid6_neon ## _n ## _gen_syndrome,                      \
-               NULL,           /* XOR not yet implemented */           \
+               raid6_neon ## _n ## _xor_syndrome,                      \
                raid6_have_neon,                                        \
                "neonx" #_n,                                            \
                0                                                       \
Simple merge