mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 01:08:13 -04:00
Tweak the NEON intrinsics crc64 code written for arm64 so it can be built for 32-bit ARM as well. The only workaround needed is to provide alternatives for vmull_p64() and vmull_high_p64() on Clang, which only defines those when building for the AArch64 or arm64ec ISA. Use the same helpers for GCC too, to avoid doubling the size of the test/validation matrix. KUnit benchmark results (Cortex-A53 @ 1 Ghz) Before: # crc64_nvme_benchmark: len=1: 35 MB/s # crc64_nvme_benchmark: len=16: 78 MB/s # crc64_nvme_benchmark: len=64: 87 MB/s # crc64_nvme_benchmark: len=127: 88 MB/s # crc64_nvme_benchmark: len=128: 88 MB/s # crc64_nvme_benchmark: len=200: 89 MB/s # crc64_nvme_benchmark: len=256: 89 MB/s # crc64_nvme_benchmark: len=511: 89 MB/s # crc64_nvme_benchmark: len=512: 89 MB/s # crc64_nvme_benchmark: len=1024: 90 MB/s # crc64_nvme_benchmark: len=3173: 90 MB/s # crc64_nvme_benchmark: len=4096: 90 MB/s # crc64_nvme_benchmark: len=16384: 90 MB/s After: # crc64_nvme_benchmark: len=1: 32 MB/s # crc64_nvme_benchmark: len=16: 76 MB/s # crc64_nvme_benchmark: len=64: 71 MB/s # crc64_nvme_benchmark: len=127: 88 MB/s # crc64_nvme_benchmark: len=128: 618 MB/s # crc64_nvme_benchmark: len=200: 542 MB/s # crc64_nvme_benchmark: len=256: 920 MB/s # crc64_nvme_benchmark: len=511: 836 MB/s # crc64_nvme_benchmark: len=512: 1261 MB/s # crc64_nvme_benchmark: len=1024: 1531 MB/s # crc64_nvme_benchmark: len=3173: 1731 MB/s # crc64_nvme_benchmark: len=4096: 1851 MB/s # crc64_nvme_benchmark: len=16384: 1858 MB/s Don't bother with big-endian, as it doesn't work correctly on Clang, and is barely used these days. Note that ARM disables preemption and softirq processing when using kernel mode SIMD, so take care not to hog the CPU for too long. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Link: https://patch.msgid.link/20260422171655.3437334-15-ardb+git@google.com Signed-off-by: Eric Biggers <ebiggers@kernel.org>
131 lines
3.4 KiB
Plaintext
131 lines
3.4 KiB
Plaintext
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
# Kconfig for the kernel's cyclic redundancy check (CRC) library code
|
|
|
|
config CRC4
|
|
tristate
|
|
help
|
|
The CRC4 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc4.h>.
|
|
|
|
config CRC7
|
|
tristate
|
|
help
|
|
The CRC7 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc7.h>.
|
|
|
|
config CRC8
|
|
tristate
|
|
help
|
|
The CRC8 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc8.h>.
|
|
|
|
config CRC16
|
|
tristate
|
|
help
|
|
The CRC16 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc16.h>.
|
|
|
|
config CRC_CCITT
|
|
tristate
|
|
help
|
|
The CRC-CCITT library functions. Select this if your module uses any
|
|
of the functions from <linux/crc-ccitt.h>.
|
|
|
|
config CRC_ITU_T
|
|
tristate
|
|
help
|
|
The CRC-ITU-T library functions. Select this if your module uses
|
|
any of the functions from <linux/crc-itu-t.h>.
|
|
|
|
config CRC_T10DIF
|
|
tristate
|
|
help
|
|
The CRC-T10DIF library functions. Select this if your module uses
|
|
any of the functions from <linux/crc-t10dif.h>.
|
|
|
|
config CRC_T10DIF_ARCH
|
|
bool
|
|
depends on CRC_T10DIF && CRC_OPTIMIZATIONS
|
|
default y if ARM && KERNEL_MODE_NEON
|
|
default y if ARM64
|
|
default y if PPC64 && ALTIVEC
|
|
default y if RISCV && RISCV_ISA_ZBC
|
|
default y if X86
|
|
|
|
config CRC32
|
|
tristate
|
|
select BITREVERSE
|
|
help
|
|
The CRC32 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc32.h> or <linux/crc32c.h>.
|
|
|
|
config CRC32_ARCH
|
|
bool
|
|
depends on CRC32 && CRC_OPTIMIZATIONS
|
|
default y if ARM && KERNEL_MODE_NEON
|
|
default y if ARM64
|
|
default y if LOONGARCH && 64BIT
|
|
default y if MIPS && CPU_MIPSR6
|
|
default y if PPC64 && ALTIVEC
|
|
default y if RISCV && RISCV_ISA_ZBC
|
|
default y if S390
|
|
default y if SPARC64
|
|
default y if X86
|
|
|
|
config CRC64
|
|
tristate
|
|
help
|
|
The CRC64 library functions. Select this if your module uses any of
|
|
the functions from <linux/crc64.h>.
|
|
|
|
config CRC64_ARCH
|
|
bool
|
|
depends on CRC64 && CRC_OPTIMIZATIONS
|
|
default y if ARM && KERNEL_MODE_NEON && !CPU_BIG_ENDIAN
|
|
default y if ARM64
|
|
default y if RISCV && RISCV_ISA_ZBC && 64BIT
|
|
default y if X86_64
|
|
|
|
config CRC_OPTIMIZATIONS
|
|
bool "Enable optimized CRC implementations" if EXPERT
|
|
depends on !UML
|
|
default y
|
|
help
|
|
Disabling this option reduces code size slightly by disabling the
|
|
architecture-optimized implementations of any CRC variants that are
|
|
enabled. CRC checksumming performance may get much slower.
|
|
|
|
Keep this enabled unless you're really trying to minimize the size of
|
|
the kernel.
|
|
|
|
config CRC_KUNIT_TEST
|
|
tristate "KUnit tests for CRC functions" if !KUNIT_ALL_TESTS
|
|
depends on KUNIT && (CRC7 || CRC16 || CRC_T10DIF || CRC32 || CRC64)
|
|
default KUNIT_ALL_TESTS
|
|
help
|
|
Unit tests for the CRC library functions.
|
|
|
|
This is intended to help people writing architecture-specific
|
|
optimized versions. If unsure, say N.
|
|
|
|
config CRC_ENABLE_ALL_FOR_KUNIT
|
|
tristate "Enable all CRC functions for KUnit test"
|
|
depends on KUNIT
|
|
select CRC7
|
|
select CRC16
|
|
select CRC_T10DIF
|
|
select CRC32
|
|
select CRC64
|
|
help
|
|
Enable all CRC functions that have test code in CRC_KUNIT_TEST.
|
|
|
|
Enable this only if you'd like the CRC KUnit test suite to test all
|
|
the CRC variants, even ones that wouldn't otherwise need to be built.
|
|
|
|
config CRC_BENCHMARK
|
|
bool "Benchmark for the CRC functions"
|
|
depends on CRC_KUNIT_TEST
|
|
help
|
|
Include benchmarks in the KUnit test suite for the CRC functions.
|