cleanup the RAID5 XOR library v3
Christoph Hellwig
hch at lst.de
Tue Mar 24 17:21:36 AEDT 2026
Hi all,
the XOR library used for the RAID5 parity is a bit of a mess right now.
The main file sits in crypto/ despite not being cryptography and not
using the crypto API, with the generic implementations sitting in
include/asm-generic and the arch implementations sitting in an asm/
header in theory. The latter doesn't work for many cases, so
architectures often build the code directly into the core kernel, or
create another module for the architecture code.
Changes this to a single module in lib/ that also contains the
architecture optimizations, similar to the library work Eric Biggers
has done for the CRC and crypto libraries later. After that it changes
to better calling conventions that allow for smarter architecture
implementations (although none is contained here yet), and uses
static_call to avoid indirection function call overhead.
A git tree is also available here:
git://git.infradead.org/users/hch/misc.git xor-improvements
Gitweb:
https://git.infradead.org/?p=users/hch/misc.git;a=shortlog;h=refs/heads/xor-improvements
Changes since v2:
- drop use of CONFIG_KERNEL_MODE_NEON for arm64
- drop the new __limit_random_u32_below for the unit test
- require 64-bit alignment because sparc64 requires it
- use DEFINE_STATIC_CALL_NULL to avoid exposing a specific xor_gen
routine
- keep CONFIG_XOR_BLOCKS_ARCH self-contained in lib/raid/
- don't select library option from kunit test and add a .kunitconfig
instead
- fix the module description for the kunit test
- add a case where buffers are at the end of the allocation in the kunit test
- use separate src/dst alignment in the kunit test
- fix and improve the kunit assert message
Changes since v1:
- use lockdep_assert_preemption_enabled()
- improve the commit message for the initial um xor.h cleanup
- further clean up the um arch specific header
- add SPDX identifier to the new build system files
- use bool for xor_forced
- fix an incorrect printk level conversion from warn to info
- include xor_impl.h in xor-neon.c
- remove unused exports for riscv
- simply move the sparc code instead of splititng it
- simplify the makefile for the x86-specific implementations
- remove stray references to xor_blocks in crypto/async_tx
- rework __DO_XOR_BLOCKS to avoid (theoretical) out of bounds references
- improve the kerneldoc API documentration for xor_gen()
- spell the name of the srcs argument to xor_gen correctly in xor.h
- add a kunit test, and a new random helper for it.
Diffstat:
arch/arm64/include/asm/xor.h | 73 --
arch/loongarch/include/asm/xor.h | 68 --
arch/loongarch/include/asm/xor_simd.h | 34 -
arch/loongarch/lib/xor_simd_glue.c | 72 --
arch/powerpc/include/asm/xor.h | 47 -
arch/powerpc/include/asm/xor_altivec.h | 22
arch/powerpc/lib/xor_vmx.h | 22
arch/powerpc/lib/xor_vmx_glue.c | 63 --
arch/riscv/include/asm/xor.h | 68 --
arch/s390/include/asm/xor.h | 21
arch/sparc/include/asm/xor.h | 9
arch/um/include/asm/xor.h | 24
arch/x86/include/asm/xor_64.h | 28 -
b/arch/arm/lib/Makefile | 5
b/arch/arm64/lib/Makefile | 6
b/arch/loongarch/lib/Makefile | 2
b/arch/powerpc/lib/Makefile | 5
b/arch/riscv/lib/Makefile | 1
b/arch/s390/lib/Makefile | 2
b/arch/sparc/include/asm/asm-prototypes.h | 1
b/arch/sparc/lib/Makefile | 2
b/crypto/Kconfig | 2
b/crypto/Makefile | 1
b/crypto/async_tx/async_xor.c | 34 -
b/fs/btrfs/raid56.c | 27 -
b/include/asm-generic/Kbuild | 1
b/include/linux/raid/xor.h | 27 -
b/lib/Kconfig | 1
b/lib/Makefile | 2
b/lib/raid/.kunitconfig | 3
b/lib/raid/Kconfig | 30 +
b/lib/raid/Makefile | 3
b/lib/raid/xor/Makefile | 42 +
b/lib/raid/xor/alpha/xor.c | 46 -
b/lib/raid/xor/alpha/xor_arch.h | 22
b/lib/raid/xor/arm/xor-neon-glue.c | 19
b/lib/raid/xor/arm/xor-neon.c | 22
b/lib/raid/xor/arm/xor.c | 105 ----
b/lib/raid/xor/arm/xor_arch.h | 22
b/lib/raid/xor/arm64/xor-neon-glue.c | 26 +
b/lib/raid/xor/arm64/xor-neon.c | 94 +--
b/lib/raid/xor/arm64/xor-neon.h | 6
b/lib/raid/xor/arm64/xor_arch.h | 21
b/lib/raid/xor/loongarch/xor_arch.h | 33 +
b/lib/raid/xor/loongarch/xor_simd_glue.c | 37 +
b/lib/raid/xor/powerpc/xor_arch.h | 22
b/lib/raid/xor/powerpc/xor_vmx.c | 40 -
b/lib/raid/xor/powerpc/xor_vmx.h | 10
b/lib/raid/xor/powerpc/xor_vmx_glue.c | 28 +
b/lib/raid/xor/riscv/xor-glue.c | 25 +
b/lib/raid/xor/riscv/xor.S | 4
b/lib/raid/xor/riscv/xor_arch.h | 17
b/lib/raid/xor/s390/xor.c | 15
b/lib/raid/xor/s390/xor_arch.h | 13
b/lib/raid/xor/sparc/xor-sparc32.c | 32 -
b/lib/raid/xor/sparc/xor-sparc64-glue.c | 48 -
b/lib/raid/xor/sparc/xor-sparc64.S | 10
b/lib/raid/xor/sparc/xor_arch.h | 35 +
b/lib/raid/xor/tests/Makefile | 3
b/lib/raid/xor/tests/xor_kunit.c | 187 +++++++
b/lib/raid/xor/um/xor_arch.h | 2
b/lib/raid/xor/x86/xor-avx.c | 52 --
b/lib/raid/xor/x86/xor-mmx.c | 120 +---
b/lib/raid/xor/x86/xor-sse.c | 105 +---
b/lib/raid/xor/x86/xor_arch.h | 36 +
b/lib/raid/xor/xor-32regs-prefetch.c | 267 ++++++++++
b/lib/raid/xor/xor-32regs.c | 217 ++++++++
b/lib/raid/xor/xor-8regs-prefetch.c | 146 +++++
b/lib/raid/xor/xor-8regs.c | 103 ++++
b/lib/raid/xor/xor-core.c | 192 +++++++
b/lib/raid/xor/xor_impl.h | 56 ++
crypto/xor.c | 174 -------
include/asm-generic/xor.h | 738 ------------------------------
73 files changed, 1831 insertions(+), 2067 deletions(-)
More information about the Linuxppc-dev
mailing list