Wire up CRC32 library functions to arch-optimized code
Subsystems (23)
Eric Biggers
maintainerv4 cover Wire up CRC32 library functions to arch-optimized code
This patchset applies to v6.13-rc1 and is also available in git via:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git crc32-lib-v4
CRC32 is a family of common non-cryptographic integrity check algorithms that are fairly fast with a portable C implementation and become far faster still with the CRC32 or carryless multiplication instructions that most CPUs have. 9 architectures already have optimized code for at least some CRC32 variants; however, except for arm64 this optimized code was only accessible through the crypto API, not the library functions.
This patchset fixes that so that the CRC32 library functions use the optimized code. This allows users to just use the library instead of the crypto API. This is much simpler and also improves performance due to eliminating the crypto API overhead including an indirect call. Some examples of updating users are included at the end of the patchset.
Note: crc32c() was a weird case. It was a library function layered on top of the crypto API, which in turn is layered on top of the real library functions. So while it was easy to use, it was still subject to the crypto API overhead. This patchset provides CRC32C acceleration in the real library functions directly.
The updated CRC32 library design is:
- Each arch's CRC32 code (all variants) is in arch/$ARCH/lib/crc32*. This adopts what arm64 and riscv already did. Note, the crypto directory is not used because CRC32 is not a cryptographic algorithm.
- Weak symbols are no longer used. Instead there are crc32*_base() and crc32*_arch(), and the appropriate ones are called based on the kconfig. This is similar to how the ChaCha20 library code works.
- Each arch's CRC32 library code is enabled by default when CRC32 is enabled, but it can now be disabled, controlled by the choice that previously controlled the base implementation only. It can also now be built as a module if CRC32 is a module too, in which case it will be automatically loaded via direct symbol dependency when appropriate.
- Instead of lots of pointless glue code that wires up each CRC32 variant to the crypto API for each architecture, we now just rely on the existing shash algorithms that use the library functions.
- As before, the library functions don't provide access to off-CPU crypto accelerators. But these appear to have very little, if any, real-world relevance for CRC32 which is very fast on CPUs.
A separate patchset applies a similar cleanup to CRC-T10DIF.
Changed in v4:
- Rebased onto v6.13-rc1.
- Removed no-longer-needed CFI stubs from arch/arm/lib/crc32-core.S.
- Removed no-longer-needed definition of JBD_MAX_CHECKSUM_SIZE from jbd2.h.
- Removed no-longer-needed inclusion of <crypto/hash.h> from f2fs.h.
- Merged 'if' statements with the same condition in jbd2_journal_set_features.
- Added bcachefs dependency patch, as it wasn't merged in 6.13 as expected.
- Reordered CPU feature checks to before crypto_simd_usable(), so that crypto_simd_usable() doesn't get called unnecessarily.
- For loongarch, use cpu_has_crc32() instead of cpu_has(CPU_FEATURE_CRC32), for consistency with the rest of the loongarch code.
- Correctly set the new dependencies of CRYPTO_VPMSUM_TESTER.
- Added Reviewed-by's and Acked-by's.
Changed in v3:
- Replaced crc32_optimizations global variable with crc32_optimizations() function.
- Make ISCSI_TARGET keep selecting CRYPTO_HASH, since iscsi_target_auth.c still uses the shash API for other algorithms.
Changed in v2:
- Added a way to determine if the arch-optimized code is actually being used at runtime, and used this to register the appropriate shash algorithms with crypto API.
- Added a patch that converts iSCSI to use the library.
- Listed a bcachefs patch as a dependency.
- Added Ard's Reviewed-by.
Eric Biggers (19):
lib/crc32: drop leading underscores from __crc32c_le_base lib/crc32: improve support for arch-specific overrides lib/crc32: expose whether the lib is really optimized at runtime
crypto: crc32 - don't unnecessarily register arch algorithms arm/crc32: expose CRC32 functions through lib loongarch/crc32: expose CRC32 functions through lib mips/crc32: expose CRC32 functions through lib powerpc/crc32: expose CRC32 functions through lib s390/crc32: expose CRC32 functions through lib sparc/crc32: expose CRC32 functions through lib x86/crc32: update prototype for crc_pcl()
x86/crc32: update prototype for crc32_pclmul_le_16() x86/crc32: expose CRC32 functions through lib
bcachefs: Explicitly select CRYPTO from BCACHEFS_FS lib/crc32: make crc32c() go directly to lib
ext4: switch to using the crc32c library
jbd2: switch to using the crc32c library
f2fs: switch to using the crc32 library
scsi: target: iscsi: switch to using the crc32c library
arch/arm/Kconfig | 1 +
arch/arm/configs/milbeaut_m10v_defconfig | 1 -
arch/arm/configs/multi_v7_defconfig | 1 -
arch/arm/crypto/Kconfig | 14 -
arch/arm/crypto/Makefile | 2 -
arch/arm/crypto/crc32-ce-glue.c | 247 ------------
arch/arm/lib/Makefile | 3 +
.../crc32-ce-core.S => lib/crc32-core.S} | 5 +-
arch/arm/lib/crc32-glue.c | 123 ++++++
arch/arm64/Kconfig | 1 +
arch/arm64/lib/Makefile | 3 +-
arch/arm64/lib/crc32-glue.c | 25 +-
arch/loongarch/Kconfig | 1 +
arch/loongarch/configs/loongson3_defconfig | 1 -
arch/loongarch/crypto/Kconfig | 9 -
arch/loongarch/crypto/Makefile | 2 -
arch/loongarch/crypto/crc32-loongarch.c | 300 ---------------
arch/loongarch/lib/Makefile | 2 +
arch/loongarch/lib/crc32-loongarch.c | 135 +++++++
arch/mips/Kconfig | 5 +-
arch/mips/configs/eyeq5_defconfig | 1 -
arch/mips/configs/eyeq6_defconfig | 1 -
arch/mips/configs/generic/32r6.config | 2 -
arch/mips/configs/generic/64r6.config | 1 -
arch/mips/crypto/Kconfig | 9 -
arch/mips/crypto/Makefile | 2 -
arch/mips/crypto/crc32-mips.c | 354 ------------------
arch/mips/lib/Makefile | 2 +
arch/mips/lib/crc32-mips.c | 192 ++++++++++
arch/powerpc/Kconfig | 1 +
arch/powerpc/configs/powernv_defconfig | 1 -
arch/powerpc/configs/ppc64_defconfig | 1 -
arch/powerpc/crypto/Kconfig | 15 +-
arch/powerpc/crypto/Makefile | 2 -
arch/powerpc/crypto/crc32c-vpmsum_glue.c | 173 ---------
arch/powerpc/crypto/crct10dif-vpmsum_asm.S | 2 +-
arch/powerpc/lib/Makefile | 3 +
arch/powerpc/lib/crc32-glue.c | 92 +++++
.../{crypto => lib}/crc32-vpmsum_core.S | 0
.../{crypto => lib}/crc32c-vpmsum_asm.S | 0
arch/riscv/Kconfig | 1 +
arch/riscv/lib/Makefile | 3 +-
arch/riscv/lib/{crc32.c => crc32-riscv.c} | 25 +-
arch/s390/Kconfig | 1 +
arch/s390/configs/debug_defconfig | 1 -
arch/s390/configs/defconfig | 1 -
arch/s390/crypto/Kconfig | 12 -
arch/s390/crypto/Makefile | 2 -
arch/s390/crypto/crc32-vx.c | 306 ---------------
arch/s390/lib/Makefile | 3 +
arch/s390/lib/crc32-glue.c | 92 +++++
arch/s390/{crypto => lib}/crc32-vx.h | 0
arch/s390/{crypto => lib}/crc32be-vx.c | 0
arch/s390/{crypto => lib}/crc32le-vx.c | 0
arch/sparc/Kconfig | 1 +
arch/sparc/crypto/Kconfig | 10 -
arch/sparc/crypto/Makefile | 4 -
arch/sparc/crypto/crc32c_glue.c | 184 ---------
arch/sparc/lib/Makefile | 2 +
arch/sparc/lib/crc32_glue.c | 93 +++++
arch/sparc/{crypto => lib}/crc32c_asm.S | 2 +-
arch/x86/Kconfig | 1 +
arch/x86/crypto/Kconfig | 22 --
arch/x86/crypto/Makefile | 7 -
arch/x86/crypto/crc32-pclmul_glue.c | 202 ----------
arch/x86/crypto/crc32c-intel_glue.c | 250 -------------
arch/x86/lib/Makefile | 4 +
arch/x86/lib/crc32-glue.c | 124 ++++++
.../crc32-pclmul_asm.S => lib/crc32-pclmul.S} | 19 +-
.../crc32c-3way.S} | 63 ++--
crypto/crc32_generic.c | 8 +-
crypto/crc32c_generic.c | 12 +-
drivers/target/iscsi/Kconfig | 4 +-
drivers/target/iscsi/iscsi_target.c | 153 +++-----
drivers/target/iscsi/iscsi_target_login.c | 50 ---
drivers/target/iscsi/iscsi_target_login.h | 1 -
drivers/target/iscsi/iscsi_target_nego.c | 21 +-
fs/bcachefs/Kconfig | 1 +
fs/ext4/Kconfig | 3 +-
fs/ext4/ext4.h | 25 +-
fs/ext4/super.c | 15 -
fs/f2fs/Kconfig | 3 +-
fs/f2fs/f2fs.h | 20 +-
fs/f2fs/super.c | 15 -
fs/jbd2/Kconfig | 2 -
fs/jbd2/journal.c | 30 +-
include/linux/crc32.h | 50 ++-
include/linux/crc32c.h | 7 +-
include/linux/jbd2.h | 33 +-
include/target/iscsi/iscsi_target_core.h | 3 -
lib/Kconfig | 80 ++--
lib/Makefile | 1 -
lib/crc32.c | 24 +-
lib/libcrc32c.c | 74 ----
94 files changed, 1159 insertions(+), 2646 deletions(-)
delete mode 100644 arch/arm/crypto/crc32-ce-glue.c
rename arch/arm/{crypto/crc32-ce-core.S => lib/crc32-core.S} (98%)
create mode 100644 arch/arm/lib/crc32-glue.c
delete mode 100644 arch/loongarch/crypto/crc32-loongarch.c
create mode 100644 arch/loongarch/lib/crc32-loongarch.c
delete mode 100644 arch/mips/crypto/crc32-mips.c
create mode 100644 arch/mips/lib/crc32-mips.c
delete mode 100644 arch/powerpc/crypto/crc32c-vpmsum_glue.c
create mode 100644 arch/powerpc/lib/crc32-glue.c
rename arch/powerpc/{crypto => lib}/crc32-vpmsum_core.S (100%)
rename arch/powerpc/{crypto => lib}/crc32c-vpmsum_asm.S (100%)
rename arch/riscv/lib/{crc32.c => crc32-riscv.c} (91%)
delete mode 100644 arch/s390/crypto/crc32-vx.c
create mode 100644 arch/s390/lib/crc32-glue.c
rename arch/s390/{crypto => lib}/crc32-vx.h (100%)
rename arch/s390/{crypto => lib}/crc32be-vx.c (100%)
rename arch/s390/{crypto => lib}/crc32le-vx.c (100%)
delete mode 100644 arch/sparc/crypto/crc32c_glue.c
create mode 100644 arch/sparc/lib/crc32_glue.c
rename arch/sparc/{crypto => lib}/crc32c_asm.S (92%)
delete mode 100644 arch/x86/crypto/crc32-pclmul_glue.c
delete mode 100644 arch/x86/crypto/crc32c-intel_glue.c
create mode 100644 arch/x86/lib/crc32-glue.c
rename arch/x86/{crypto/crc32-pclmul_asm.S => lib/crc32-pclmul.S} (95%)
rename arch/x86/{crypto/crc32c-pcl-intel-asm_64.S => lib/crc32c-3way.S} (92%)
delete mode 100644 lib/libcrc32c.cbase-commit: 40384c840ea1944d7c5a392e8975ed088ecf0b37
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 1/19 lib/crc32: drop leading underscores from __crc32c_le_base
From: Eric Biggers <[email protected]>
Remove the leading underscores from __crc32c_le_base().
This is in preparation for adding crc32c_le_arch() and eventually renaming __crc32c_le() to crc32c_le().
--- arch/arm64/lib/crc32-glue.c | 2 +- arch/riscv/lib/crc32.c | 2 +- crypto/crc32c_generic.c | 8 ++++---- include/linux/crc32.h | 2 +- lib/crc32.c | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-)
arch/arm64/lib/crc32-glue.c +1 -1
@@ -42,11 +42,11 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) }u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len) {if (!alternative_has_cap_likely (ARM64_HAS_CRC32 )) -return __crc32c_le_base (crc, p, len); +return crc32c_le_base (crc, p, len);if (len >= min_len &&cpu_have_named_feature (PMULL ) &&crypto_simd_usable ()) {kernel_neon_begin (); crc =crc32c_le_arm64_4way (crc, p, len);kernel_neon_end ();
arch/riscv/lib/crc32.c +1 -1
@@ -224,11 +224,11 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) }u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len) {return crc32_le_generic (crc, p, len,CRC32C_POLY_LE , -CRC32C_POLY_QT_LE , __crc32c_le_base); +CRC32C_POLY_QT_LE , crc32c_le_base); }static inline u32 crc32_be_unaligned (u32 crc,unsigned char const *p,size_t len) {
crypto/crc32c_generic.c +4 -4
@@ -83,11 +83,11 @@ static int chksum_setkey(struct crypto_shash *tfm, const u8 *key,static int chksum_update (struct shash_desc *desc,const u8 *data,unsigned int length) {struct chksum_desc_ctx *ctx =shash_desc_ctx (desc); - ctx->crc =__crc32c_le_base (ctx->crc, data, length); + ctx->crc =crc32c_le_base (ctx->crc, data, length);return 0 ; }static int chksum_update_arch (struct shash_desc *desc,const u8 *data,unsigned int length)
@@ -106,11 +106,11 @@ static int chksum_final(struct shash_desc *desc, u8 *out)return 0 ; }static int __chksum_finup (u32 *crcp,const u8 *data,unsigned int len,u8 *out) { -put_unaligned_le32 (~__crc32c_le_base (*crcp, data, len), out); +put_unaligned_le32 (~crc32c_le_base (*crcp, data, len), out);return 0 ; }static int __chksum_finup_arch (u32 *crcp,const u8 *data,unsigned int len,u8 *out)
@@ -198,16 +198,16 @@ static struct shash_alg algs[] = {{ }};static int __init crc32c_mod_init (void ) {/* register the arch flavor only if it differs from the generic one */ -return crypto_register_shashes (algs,1 + (&__crc32c_le != &__crc32c_le_base)); +return crypto_register_shashes (algs,1 + (&__crc32c_le != &crc32c_le_base)); } static void __exit crc32c_mod_fini(void) { -crypto_unregister_shashes (algs,1 + (&__crc32c_le != &__crc32c_le_base)); +crypto_unregister_shashes (algs,1 + (&__crc32c_le != &crc32c_le_base)); }subsys_initcall (crc32c_mod_init);module_exit (crc32c_mod_fini);
include/linux/crc32.h +1 -1
@@ -37,11 +37,11 @@ static inline u32 crc32_le_combine(u32 crc1, u32 crc2, size_t len2) {return crc32_le_shift (crc1, len2) ^ crc2; }u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len); -u32 __pure __crc32c_le_base (u32 crc,unsigned char const *p,size_t len); +u32 __pure crc32c_le_base (u32 crc,unsigned char const *p,size_t len);/** * __crc32c_le_combine - Combine two crc32c check values into one. For two * sequences of bytes, seq1 and seq2 with lengths len1 * and len2, __crc32c_le() check values were calculated
lib/crc32.c +2 -2
@@ -205,12 +205,12 @@ EXPORT_SYMBOL(crc32_le);EXPORT_SYMBOL (__crc32c_le); u32 __pure crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);EXPORT_SYMBOL (crc32_le_base ); -u32 __pure __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le); -EXPORT_SYMBOL (__crc32c_le_base ); +u32 __pure crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le); +EXPORT_SYMBOL (crc32c_le_base ); u32 __pure crc32_be_base(u32, unsigned char const *, size_t) __alias(crc32_be);/* * This multiplies the polynomials x and y modulo the given modulus.
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 2/19 lib/crc32: improve support for arch-specific overrides
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Currently the CRC32 library functions are defined as weak symbols, and the arm64 and riscv architectures override them.
This method of arch-specific overrides has the limitation that it only works when both the base and arch code is built-in. Also, it makes the arch-specific code be silently not used if it is accidentally built with lib-y instead of obj-y; unfortunately the RISC-V code does this.
This commit reorganizes the code to have explicit *_arch() functions that are called when they are enabled, similar to how some of the crypto library code works (e.g. chacha_crypt() calls chacha_crypt_arch()).
Make the existing kconfig choice for the CRC32 implementation also control whether the arch-optimized implementation (if one is available) is enabled or not. Make it enabled by default if CRC32 is also enabled.
The result is that arch-optimized CRC32 library functions will be included automatically when appropriate, but it is now possible to disable them. They can also now be built as a loadable module if the CRC32 library functions happen to be used only by loadable modules, in which case the arch and base CRC32 modules will be automatically loaded via direct symbol dependency when appropriate.
---
arch/arm64/Kconfig | 1 +
arch/arm64/lib/Makefile | 3 +-
arch/arm64/lib/crc32-glue.c | 13 ++++-
arch/riscv/Kconfig | 1 +
arch/riscv/lib/Makefile | 3 +-
arch/riscv/lib/{crc32.c => crc32-riscv.c} | 13 ++++-
crypto/crc32_generic.c | 4 +-
crypto/crc32c_generic.c | 4 +-
include/linux/crc32.h | 35 +++++++++---
lib/Kconfig | 70 +++++++++++++++++------
lib/crc32.c | 22 +++----
11 files changed, 118 insertions(+), 51 deletions(-)
rename arch/riscv/lib/{crc32.c => crc32-riscv.c} (94%)arch/arm64/Kconfig +1 -0
@@ -19,10 +19,11 @@ config ARM64 select ARCH_ENABLE_MEMORY_HOTREMOVE select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2 select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE select ARCH_HAS_CACHE_LINE_SIZE select ARCH_HAS_CC_PLATFORM + select ARCH_HAS_CRC32 select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DMA_OPS if XEN select ARCH_HAS_DMA_PREP_COHERENT
arch/arm64/lib/Makefile +2 -1
@@ -11,11 +11,12 @@ CFLAGS_xor-neon.o += $(CC_FLAGS_FPU) CFLAGS_REMOVE_xor-neon.o += $(CC_FLAGS_NO_FPU) endif lib-$(CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE) += uaccess_flushcache.o -obj-$(CONFIG_CRC32) += crc32.o crc32-glue.o +obj-$(CONFIG_CRC32_ARCH) += crc32-arm64.o +crc32-arm64-y := crc32.o crc32-glue.o obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o obj-$(CONFIG_ARM64_MTE) += mte.o
arch/arm64/lib/crc32-glue.c +10 -3
@@ -1,9 +1,10 @@// SPDX-License-Identifier: GPL-2.0-only #include <linux/crc32.h> #include <linux/linkage.h> +#include <linux/module.h> #include <asm/alternative.h> #include <asm/cpufeature.h> #include <asm/neon.h> #include <asm/simd.h>
@@ -19,11 +20,11 @@ asmlinkage u32 crc32_be_arm64(u32 crc, unsigned char const *p, size_t len); asmlinkage u32 crc32_le_arm64_4way(u32 crc, unsigned char const *p, size_t len); asmlinkage u32 crc32c_le_arm64_4way(u32 crc, unsigned char const *p, size_t len); asmlinkage u32 crc32_be_arm64_4way(u32 crc, unsigned char const *p, size_t len); -u32 __pure crc32_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_le_arch (u32 crc,const u8 *p,size_t len) {if (!alternative_has_cap_likely (ARM64_HAS_CRC32 ))return crc32_le_base (crc, p, len);if (len >= min_len &&cpu_have_named_feature (PMULL ) &&crypto_simd_usable ()) {
@@ -38,12 +39,13 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)return crc; }return crc32_le_arm64 (crc, p, len); } +EXPORT_SYMBOL (crc32_le_arch); -u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32c_le_arch (u32 crc,const u8 *p,size_t len) {if (!alternative_has_cap_likely (ARM64_HAS_CRC32 ))return crc32c_le_base (crc, p, len);if (len >= min_len &&cpu_have_named_feature (PMULL ) &&crypto_simd_usable ()) {
@@ -58,12 +60,13 @@ u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)return crc; }return crc32c_le_arm64 (crc, p, len); } +EXPORT_SYMBOL (crc32c_le_arch); -u32 __pure crc32_be (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_be_arch (u32 crc,const u8 *p,size_t len) {if (!alternative_has_cap_likely (ARM64_HAS_CRC32 ))return crc32_be_base (crc, p, len);if (len >= min_len &&cpu_have_named_feature (PMULL ) &&crypto_simd_usable ()) {
@@ -78,5 +81,9 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)return crc; }return crc32_be_arm64 (crc, p, len); } +EXPORT_SYMBOL (crc32_be_arch); + +MODULE_LICENSE ("GPL" ); +MODULE_DESCRIPTION ("arm64-optimized CRC32 functions" );
arch/riscv/Kconfig +1 -0
@@ -22,10 +22,11 @@ config RISCV select ARCH_ENABLE_MEMORY_HOTPLUG if SPARSEMEM_VMEMMAP select ARCH_ENABLE_MEMORY_HOTREMOVE if MEMORY_HOTPLUG select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2 select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE select ARCH_HAS_BINFMT_FLAT + select ARCH_HAS_CRC32 if RISCV_ISA_ZBC select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL if MMU select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DEBUG_WX select ARCH_HAS_FAST_MULTIPLIER
arch/riscv/lib/Makefile +1 -2
@@ -13,10 +13,9 @@ ifeq ($(CONFIG_MMU), y) lib-$(CONFIG_RISCV_ISA_V) += uaccess_vector.o endif lib-$(CONFIG_MMU) += uaccess.o lib-$(CONFIG_64BIT) += tishift.o lib-$(CONFIG_RISCV_ISA_ZICBOZ) += clear_page.o -lib-$(CONFIG_RISCV_ISA_ZBC) += crc32.o - +obj-$(CONFIG_CRC32_ARCH) += crc32-riscv.o obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o lib-$(CONFIG_RISCV_ISA_V) += xor.o lib-$(CONFIG_RISCV_ISA_V) += riscv_v_helpers.o
arch/riscv/lib/crc32-riscv.c renamed from arch/riscv/lib/crc32.c +10 -3
@@ -12,10 +12,11 @@#include <linux/types.h> #include <linux/minmax.h> #include <linux/crc32poly.h> #include <linux/crc32.h> #include <linux/byteorder/generic.h> +#include <linux/module.h> /* * Refer to https://www.corsix.org/content/barrett-reduction-polynomials for * better understanding of how this math works. *
@@ -215,21 +216,23 @@ static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p, legacy:return crc_fb (crc, p, len); } -u32 __pure crc32_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_le_arch (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len,CRC32_POLY_LE ,CRC32_POLY_QT_LE , crc32_le_base); } +EXPORT_SYMBOL (crc32_le_arch); -u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32c_le_arch (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len,CRC32C_POLY_LE ,CRC32C_POLY_QT_LE , crc32c_le_base); } +EXPORT_SYMBOL (crc32c_le_arch);static inline u32 crc32_be_unaligned (u32 crc,unsigned char const *p,size_t len) {size_t bits = len *8 ;
@@ -251,11 +254,11 @@ static inline u32 crc32_be_unaligned(u32 crc, unsigned char const *p, crc ^= crc_low;return crc; } -u32 __pure crc32_be (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_be_arch (u32 crc,const u8 *p,size_t len) {size_t offset, head_len, tail_len;unsigned long const *p_ul;unsigned long s;
@@ -290,5 +293,9 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)return crc; legacy:return crc32_be_base (crc, p, len); } +EXPORT_SYMBOL (crc32_be_arch); + +MODULE_LICENSE ("GPL" ); +MODULE_DESCRIPTION ("Accelerated CRC32 implementation with Zbc extension" );
crypto/crc32_generic.c +2 -2
@@ -158,16 +158,16 @@ static struct shash_alg algs[] = {{ }};static int __init crc32_mod_init (void ) {/* register the arch flavor only if it differs from the generic one */ -return crypto_register_shashes (algs,1 + (&crc32_le != &crc32_le_base)); +return crypto_register_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); } static void __exit crc32_mod_fini(void) { -crypto_unregister_shashes (algs,1 + (&crc32_le != &crc32_le_base)); +crypto_unregister_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); }subsys_initcall (crc32_mod_init);module_exit (crc32_mod_fini);
crypto/crc32c_generic.c +2 -2
@@ -198,16 +198,16 @@ static struct shash_alg algs[] = {{ }};static int __init crc32c_mod_init (void ) {/* register the arch flavor only if it differs from the generic one */ -return crypto_register_shashes (algs,1 + (&__crc32c_le != &crc32c_le_base)); +return crypto_register_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); } static void __exit crc32c_mod_fini(void) { -crypto_unregister_shashes (algs,1 + (&__crc32c_le != &crc32c_le_base)); +crypto_unregister_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); }subsys_initcall (crc32c_mod_init);module_exit (crc32c_mod_fini);
include/linux/crc32.h +28 -7
@@ -6,14 +6,38 @@#define _LINUX_CRC32_H#include <linux/types.h> #include <linux/bitrev.h> -u32 __pure crc32_le (u32 crc,unsigned char const *p,size_t len); -u32 __pure crc32_le_base (u32 crc,unsigned char const *p,size_t len); -u32 __pure crc32_be (u32 crc,unsigned char const *p,size_t len); -u32 __pure crc32_be_base (u32 crc,unsigned char const *p,size_t len); +u32 __pure crc32_le_arch (u32 crc,const u8 *p,size_t len); +u32 __pure crc32_le_base (u32 crc,const u8 *p,size_t len); +u32 __pure crc32_be_arch (u32 crc,const u8 *p,size_t len); +u32 __pure crc32_be_base (u32 crc,const u8 *p,size_t len); +u32 __pure crc32c_le_arch (u32 crc,const u8 *p,size_t len); +u32 __pure crc32c_le_base (u32 crc,const u8 *p,size_t len); + +static inline u32 __pure crc32_le (u32 crc,const u8 *p,size_t len) +{ +if (IS_ENABLED (CONFIG_CRC32_ARCH )) +return crc32_le_arch (crc, p, len); +return crc32_le_base (crc, p, len); +} + +static inline u32 __pure crc32_be (u32 crc,const u8 *p,size_t len) +{ +if (IS_ENABLED (CONFIG_CRC32_ARCH )) +return crc32_be_arch (crc, p, len); +return crc32_be_base (crc, p, len); +} + +/* TODO: leading underscores should be dropped once callers have been updated */ +static inline u32 __pure __crc32c_le (u32 crc,const u8 *p,size_t len) +{ +if (IS_ENABLED (CONFIG_CRC32_ARCH )) +return crc32c_le_arch (crc, p, len); +return crc32c_le_base (crc, p, len); +}/** * crc32_le_combine - Combine two crc32 check values into one. For two * sequences of bytes, seq1 and seq2 with lengths len1 * and len2, crc32_le() check values were calculated
@@ -36,13 +60,10 @@ u32 __attribute_const__ crc32_le_shift(u32 crc, size_t len);static inline u32 crc32_le_combine (u32 crc1,u32 crc2,size_t len2) {return crc32_le_shift (crc1, len2) ^ crc2; } -u32 __pure __crc32c_le (u32 crc,unsigned char const *p,size_t len); -u32 __pure crc32c_le_base (u32 crc,unsigned char const *p,size_t len); -/** * __crc32c_le_combine - Combine two crc32c check values into one. For two * sequences of bytes, seq1 and seq2 with lengths len1 * and len2, __crc32c_le() check values were calculated * for each, crc1 and crc2.
lib/Kconfig +54 -16
118 lines not on this page · raw message
lib/crc32.c +7 -15
@@ -181,39 +181,31 @@ static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,#endif return crc; }#if CRC_LE_BITS ==1 -u32 __pure __weak crc32_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_le_base (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len,NULL ,CRC32_POLY_LE ); } -u32 __pure __weak __crc32c_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32c_le_base (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len,NULL ,CRC32C_POLY_LE ); }#else -u32 __pure __weak crc32_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_le_base (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len, crc32table_le,CRC32_POLY_LE ); } -u32 __pure __weak __crc32c_le (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32c_le_base (u32 crc,const u8 *p,size_t len) {return crc32_le_generic (crc, p, len, crc32ctable_le,CRC32C_POLY_LE ); }#endif -EXPORT_SYMBOL (crc32_le); -EXPORT_SYMBOL (__crc32c_le); - -u32 __pure crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);EXPORT_SYMBOL (crc32_le_base); - -u32 __pure crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);EXPORT_SYMBOL (crc32c_le_base); -u32 __pure crc32_be_base(u32, unsigned char const *, size_t) __alias(crc32_be); -/* * This multiplies the polynomials x and y modulo the given modulus. * This follows the "little-endian" CRC convention that the lsbit * represents the highest power of x, and the msbit represents x^0. */
@@ -333,16 +325,16 @@ static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,# endif return crc; }#if CRC_BE_BITS ==1 -u32 __pure __weak crc32_be (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_be_base (u32 crc,const u8 *p,size_t len) {return crc32_be_generic (crc, p, len,NULL ,CRC32_POLY_BE ); }#else -u32 __pure __weak crc32_be (u32 crc,unsigned char const *p,size_t len) +u32 __pure crc32_be_base (u32 crc,const u8 *p,size_t len) {return crc32_be_generic (crc, p, len, crc32table_be,CRC32_POLY_BE ); }#endif -EXPORT_SYMBOL (crc32_be); +EXPORT_SYMBOL (crc32_be_base);
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 3/19 lib/crc32: expose whether the lib is really optimized at runtime
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Make the CRC32 library export a function crc32_optimizations() which returns flags that indicate which CRC32 functions are actually executing optimized code at runtime.
This will be used to determine whether the crc32[c]-$arch shash algorithms should be registered in the crypto API. btrfs could also start using these flags instead of the hack that it currently uses where it parses the crypto_shash_driver_name.
--- arch/arm64/lib/crc32-glue.c | 10 ++++++++++ arch/riscv/lib/crc32-riscv.c | 10 ++++++++++ include/linux/crc32.h | 15 +++++++++++++++ 3 files changed, 35 insertions(+)
arch/arm64/lib/crc32-glue.c +10 -0
@@ -83,7 +83,17 @@ u32 __pure crc32_be_arch(u32 crc, const u8 *p, size_t len)return crc32_be_arm64 (crc, p, len); }EXPORT_SYMBOL (crc32_be_arch); +u32 crc32_optimizations (void ) +{ +if (alternative_has_cap_likely (ARM64_HAS_CRC32 )) +return CRC32_LE_OPTIMIZATION | +CRC32_BE_OPTIMIZATION | +CRC32C_OPTIMIZATION ; +return 0 ; +} +EXPORT_SYMBOL (crc32_optimizations); +MODULE_LICENSE ("GPL" );MODULE_DESCRIPTION ("arm64-optimized CRC32 functions" );
arch/riscv/lib/crc32-riscv.c +10 -0
@@ -295,7 +295,17 @@ u32 __pure crc32_be_arch(u32 crc, const u8 *p, size_t len) legacy:return crc32_be_base (crc, p, len); }EXPORT_SYMBOL (crc32_be_arch); +u32 crc32_optimizations (void ) +{ +if (riscv_has_extension_likely (RISCV_ISA_EXT_ZBC )) +return CRC32_LE_OPTIMIZATION | +CRC32_BE_OPTIMIZATION | +CRC32C_OPTIMIZATION ; +return 0 ; +} +EXPORT_SYMBOL (crc32_optimizations); +MODULE_LICENSE ("GPL" );MODULE_DESCRIPTION ("Accelerated CRC32 implementation with Zbc extension" );
include/linux/crc32.h +15 -0
@@ -35,10 +35,25 @@ static inline u32 __pure __crc32c_le(u32 crc, const u8 *p, size_t len)if (IS_ENABLED (CONFIG_CRC32_ARCH ))return crc32c_le_arch (crc, p, len);return crc32c_le_base (crc, p, len); } +/* +* crc32_optimizations() returns flags that indicate which CRC32 library +* functions are using architecture-specific optimizations. Unlike +* IS_ENABLED(CONFIG_CRC32_ARCH) it takes into account the different CRC32 +* variants and also whether any needed CPU features are available at runtime. +*/ +#define CRC32_LE_OPTIMIZATION BIT(0)/* crc32_le() is optimized */ +#define CRC32_BE_OPTIMIZATION BIT(1)/* crc32_be() is optimized */ +#define CRC32C_OPTIMIZATION BIT(2)/* __crc32c_le() is optimized */ +#if IS_ENABLED (CONFIG_CRC32_ARCH ) +u32 crc32_optimizations (void ); +#else +static inline u32 crc32_optimizations (void ) {return 0 ; } +#endif +/** * crc32_le_combine - Combine two crc32 check values into one. For two * sequences of bytes, seq1 and seq2 with lengths len1 * and len2, crc32_le() check values were calculated * for each, crc1 and crc2.
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 4/19 crypto: crc32 - don't unnecessarily register arch algorithms
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Instead of registering the crc32-$arch and crc32c-$arch algorithms if the arch-specific code was built, only register them when that code was built *and* is not falling back to the base implementation at runtime.
This avoids confusing users like btrfs which checks the shash driver name to determine whether it is crc32c-generic.
(It would also make sense to change btrfs to test the crc32_optimization flags itself, so that it doesn't have to use the weird hack of parsing the driver name. This change still makes sense either way though.)
--- crypto/crc32_generic.c | 8 ++++++-- crypto/crc32c_generic.c | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-)
crypto/crc32_generic.c +6 -2
@@ -155,19 +155,23 @@ static struct shash_alg algs[] = {{ .base.cra_ctxsize = sizeof(u32), .base.cra_module = THIS_MODULE, .base.cra_init = crc32_cra_init, }}; +static int num_algs; +static int __init crc32_mod_init (void ) {/* register the arch flavor only if it differs from the generic one */ -return crypto_register_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); + num_algs =1 + ((crc32_optimizations () &CRC32_LE_OPTIMIZATION ) !=0 ); + +return crypto_register_shashes (algs, num_algs); } static void __exit crc32_mod_fini(void) { -crypto_unregister_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); +crypto_unregister_shashes (algs, num_algs); }subsys_initcall (crc32_mod_init);module_exit (crc32_mod_fini);
crypto/crc32c_generic.c +6 -2
@@ -195,19 +195,23 @@ static struct shash_alg algs[] = {{ .base.cra_ctxsize = sizeof(struct chksum_ctx), .base.cra_module = THIS_MODULE, .base.cra_init = crc32c_cra_init, }}; +static int num_algs; +static int __init crc32c_mod_init (void ) {/* register the arch flavor only if it differs from the generic one */ -return crypto_register_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); + num_algs =1 + ((crc32_optimizations () &CRC32C_OPTIMIZATION ) !=0 ); + +return crypto_register_shashes (algs, num_algs); } static void __exit crc32c_mod_fini(void) { -crypto_unregister_shashes (algs,1 +IS_ENABLED (CONFIG_CRC32_ARCH )); +crypto_unregister_shashes (algs, num_algs); }subsys_initcall (crc32c_mod_init);module_exit (crc32c_mod_fini);
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 5/19 arm/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the arm CRC32 assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/arm/crypto/crc32-ce-glue.c to arch/arm/lib/crc32-glue.c, view this commit with 'git show -M10'.
---
arch/arm/Kconfig | 1 +
arch/arm/configs/milbeaut_m10v_defconfig | 1 -
arch/arm/configs/multi_v7_defconfig | 1 -
arch/arm/crypto/Kconfig | 14 -
arch/arm/crypto/Makefile | 2 -
arch/arm/crypto/crc32-ce-glue.c | 247 ------------------
arch/arm/lib/Makefile | 3 +
.../crc32-ce-core.S => lib/crc32-core.S} | 5 +-
arch/arm/lib/crc32-glue.c | 123 +++++++++
9 files changed, 129 insertions(+), 268 deletions(-)
delete mode 100644 arch/arm/crypto/crc32-ce-glue.c
rename arch/arm/{crypto/crc32-ce-core.S => lib/crc32-core.S} (98%)
create mode 100644 arch/arm/lib/crc32-glue.carch/arm/Kconfig +1 -0
@@ -5,10 +5,11 @@ config ARM select ARCH_32BIT_OFF_T select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE if HAVE_KRETPROBES && FRAME_POINTER && !ARM_UNWIND select ARCH_HAS_BINFMT_FLAT select ARCH_HAS_CPU_CACHE_ALIASING select ARCH_HAS_CPU_FINALIZE_INIT if MMU + select ARCH_HAS_CRC32 if KERNEL_MODE_NEON select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL if MMU select ARCH_HAS_DMA_ALLOC if MMU select ARCH_HAS_DMA_OPS select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
arch/arm/configs/milbeaut_m10v_defconfig +0 -1
@@ -105,11 +105,10 @@ CONFIG_CRYPTO_SHA2_ARM_CE=m CONFIG_CRYPTO_SHA512_ARM=m CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_AES_ARM_BS=m CONFIG_CRYPTO_AES_ARM_CE=m CONFIG_CRYPTO_CHACHA20_NEON=m -CONFIG_CRYPTO_CRC32_ARM_CE=m # CONFIG_CRYPTO_HW is not set CONFIG_CRC_CCITT=m CONFIG_CRC_ITU_T=m CONFIG_DMA_CMA=y CONFIG_CMA_SIZE_MBYTES=64
arch/arm/configs/multi_v7_defconfig +0 -1
@@ -1304,11 +1304,10 @@ CONFIG_CRYPTO_SHA2_ARM_CE=m CONFIG_CRYPTO_SHA512_ARM=m CONFIG_CRYPTO_AES_ARM=m CONFIG_CRYPTO_AES_ARM_BS=m CONFIG_CRYPTO_AES_ARM_CE=m CONFIG_CRYPTO_CHACHA20_NEON=m -CONFIG_CRYPTO_CRC32_ARM_CE=m CONFIG_CRYPTO_DEV_SUN4I_SS=m CONFIG_CRYPTO_DEV_FSL_CAAM=m CONFIG_CRYPTO_DEV_EXYNOS_RNG=m CONFIG_CRYPTO_DEV_S5P=m CONFIG_CRYPTO_DEV_ATMEL_AES=m
arch/arm/crypto/Kconfig +0 -14
@@ -220,24 +220,10 @@ config CRYPTO_CHACHA20_NEON stream cipher algorithms Architecture: arm using: - NEON (Advanced SIMD) extensions -config CRYPTO_CRC32_ARM_CE - tristate "CRC32C and CRC32" - depends on KERNEL_MODE_NEON - depends on CRC32 - select CRYPTO_HASH - help - CRC32c CRC algorithm with the iSCSI polynomial (RFC 3385 and RFC 3720) - and CRC32 CRC algorithm (IEEE 802.3) - - Architecture: arm using: - - CRC and/or PMULL instructions - - Drivers: crc32-arm-ce and crc32c-arm-ce - config CRYPTO_CRCT10DIF_ARM_CE tristate "CRCT10DIF" depends on KERNEL_MODE_NEON depends on CRC_T10DIF select CRYPTO_HASH
arch/arm/crypto/Makefile +0 -2
@@ -19,11 +19,10 @@ obj-$(CONFIG_CRYPTO_CURVE25519_NEON) += curve25519-neon.o obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o obj-$(CONFIG_CRYPTO_SHA2_ARM_CE) += sha2-arm-ce.o obj-$(CONFIG_CRYPTO_GHASH_ARM_CE) += ghash-arm-ce.o obj-$(CONFIG_CRYPTO_CRCT10DIF_ARM_CE) += crct10dif-arm-ce.o -obj-$(CONFIG_CRYPTO_CRC32_ARM_CE) += crc32-arm-ce.o aes-arm-y := aes-cipher-core.o aes-cipher-glue.o aes-arm-bs-y := aes-neonbs-core.o aes-neonbs-glue.o sha1-arm-y := sha1-armv4-large.o sha1_glue.o sha1-arm-neon-y := sha1-armv7-neon.o sha1_neon_glue.o
@@ -36,11 +35,10 @@ blake2b-neon-y := blake2b-neon-core.o blake2b-neon-glue.o sha1-arm-ce-y := sha1-ce-core.o sha1-ce-glue.o sha2-arm-ce-y := sha2-ce-core.o sha2-ce-glue.o aes-arm-ce-y := aes-ce-core.o aes-ce-glue.o ghash-arm-ce-y := ghash-ce-core.o ghash-ce-glue.o crct10dif-arm-ce-y := crct10dif-ce-core.o crct10dif-ce-glue.o -crc32-arm-ce-y:= crc32-ce-core.o crc32-ce-glue.o chacha-neon-y := chacha-scalar-core.o chacha-glue.o chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o poly1305-arm-y := poly1305-core.o poly1305-glue.o nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o curve25519-neon-y := curve25519-core.o curve25519-glue.o
arch/arm/crypto/crc32-ce-glue.c deleted +0 -247
247 lines not on this page · raw message
arch/arm/lib/Makefile +3 -0
@@ -43,5 +43,8 @@ ifeq ($(CONFIG_KERNEL_MODE_NEON),y) CFLAGS_xor-neon.o += $(CC_FLAGS_FPU) obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o endif obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o + +obj-$(CONFIG_CRC32_ARCH) += crc32-arm.o +crc32-arm-y := crc32-glue.o crc32-core.o
arch/arm/lib/crc32-core.S renamed from arch/arm/crypto/crc32-ce-core.S +2 -3
@@ -46,11 +46,10 @@ * Authors: Gregory Prestas <[email protected]> * Alexander Boyko <[email protected]> */ #include <linux/linkage.h> -#include <linux/cfi_types.h> #include <asm/assembler.h> .text .align 6 .arch armv8-a
@@ -295,13 +294,13 @@ ARM_BE8(rev16 r3, r3 ) bpl .Laligned8\c b .Ltail\c .endm .align 5 -SYM_TYPED_FUNC_START(crc32_armv8_le) +SYM_FUNC_START(crc32_armv8_le) __crc32 SYM_FUNC_END(crc32_armv8_le) .align 5 -SYM_TYPED_FUNC_START(crc32c_armv8_le) +SYM_FUNC_START(crc32c_armv8_le) __crc32 c SYM_FUNC_END(crc32c_armv8_le)
arch/arm/lib/crc32-glue.c new file +123 -0
123 lines not on this page · raw message
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 6/19 loongarch/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the loongarch CRC32 assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/loongarch/crypto/crc32-loongarch.c to arch/loongarch/lib/crc32-loongarch.c, view this commit with 'git show -M10'.
--- arch/loongarch/Kconfig | 1 + arch/loongarch/configs/loongson3_defconfig | 1 - arch/loongarch/crypto/Kconfig | 9 - arch/loongarch/crypto/Makefile | 2 - arch/loongarch/crypto/crc32-loongarch.c | 300 --------------------- arch/loongarch/lib/Makefile | 2 + arch/loongarch/lib/crc32-loongarch.c | 135 ++++++++++ 7 files changed, 138 insertions(+), 312 deletions(-) delete mode 100644 arch/loongarch/crypto/crc32-loongarch.c create mode 100644 arch/loongarch/lib/crc32-loongarch.c
arch/loongarch/Kconfig +1 -0
@@ -13,10 +13,11 @@ config LOONGARCH select ARCH_ENABLE_MEMORY_HOTPLUG select ARCH_ENABLE_MEMORY_HOTREMOVE select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI select ARCH_HAS_CPU_FINALIZE_INIT + select ARCH_HAS_CRC32 select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_FAST_MULTIPLIER select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_KCOV
arch/loongarch/configs/loongson3_defconfig +0 -1
@@ -1038,11 +1038,10 @@ CONFIG_CRYPTO_LZ4=m CONFIG_CRYPTO_LZ4HC=m CONFIG_CRYPTO_USER_API_HASH=m CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_AEAD=m -CONFIG_CRYPTO_CRC32_LOONGARCH=m CONFIG_CRYPTO_DEV_VIRTIO=m CONFIG_DMA_CMA=y CONFIG_DMA_NUMA_CMA=y CONFIG_CMA_SIZE_MBYTES=0 CONFIG_PRINTK_TIME=y
arch/loongarch/crypto/Kconfig +0 -9
@@ -1,14 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (loongarch)" -config CRYPTO_CRC32_LOONGARCH - tristate "CRC32c and CRC32" - select CRC32 - select CRYPTO_HASH - help - CRC32c and CRC32 CRC algorithms - - Architecture: LoongArch with CRC32 instructions - endmenu
arch/loongarch/crypto/Makefile +0 -2
@@ -1,6 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 # # Makefile for LoongArch crypto files.. # - -obj-$(CONFIG_CRYPTO_CRC32_LOONGARCH) += crc32-loongarch.o
arch/loongarch/crypto/crc32-loongarch.c deleted +0 -300
300 lines not on this page · raw message
arch/loongarch/lib/Makefile +2 -0
@@ -9,5 +9,7 @@ lib-y += delay.o memset.o memcpy.o memmove.o \ obj-$(CONFIG_ARCH_SUPPORTS_INT128) += tishift.o obj-$(CONFIG_CPU_HAS_LSX) += xor_simd.o xor_simd_glue.o obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o + +obj-$(CONFIG_CRC32_ARCH) += crc32-loongarch.o
arch/loongarch/lib/crc32-loongarch.c new file +135 -0
135 lines not on this page · raw message
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 7/19 mips/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the mips CRC32 assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/mips/crypto/crc32-mips.c to arch/mips/lib/crc32-mips.c, view this commit with 'git show -M10'.
--- arch/mips/Kconfig | 5 +- arch/mips/configs/eyeq5_defconfig | 1 - arch/mips/configs/eyeq6_defconfig | 1 - arch/mips/configs/generic/32r6.config | 2 - arch/mips/configs/generic/64r6.config | 1 - arch/mips/crypto/Kconfig | 9 - arch/mips/crypto/Makefile | 2 - arch/mips/crypto/crc32-mips.c | 354 -------------------------- arch/mips/lib/Makefile | 2 + arch/mips/lib/crc32-mips.c | 192 ++++++++++++++ 10 files changed, 195 insertions(+), 374 deletions(-) delete mode 100644 arch/mips/crypto/crc32-mips.c create mode 100644 arch/mips/lib/crc32-mips.c
arch/mips/Kconfig +1 -4
@@ -1993,15 +1993,15 @@ config CPU_MIPSR5 select MIPS_SPRAM config CPU_MIPSR6 bool default y if CPU_MIPS32_R6 || CPU_MIPS64_R6 + select ARCH_HAS_CRC32 select CPU_HAS_RIXI select CPU_HAS_DIEI if !CPU_DIEI_BROKEN select HAVE_ARCH_BITREVERSE select MIPS_ASID_BITS_VARIABLE - select MIPS_CRC_SUPPORT select MIPS_SPRAM config TARGET_ISA_REV int default 1 if CPU_MIPSR1
@@ -2473,13 +2473,10 @@ config MIPS_ASID_BITS default 8 config MIPS_ASID_BITS_VARIABLE bool -config MIPS_CRC_SUPPORT - bool - # R4600 erratum. Due to the lack of errata information the exact # technical details aren't known. I've experimentally found that disabling # interrupts during indexed I-cache flushes seems to be sufficient to deal # with the issue. config WAR_R4600_V1_INDEX_ICACHEOP
arch/mips/configs/eyeq5_defconfig +0 -1
@@ -97,11 +97,10 @@ CONFIG_NFS_FS=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_ROOT_NFS=y -CONFIG_CRYPTO_CRC32_MIPS=y CONFIG_FRAME_WARN=1024 CONFIG_DEBUG_FS=y # CONFIG_RCU_TRACE is not set # CONFIG_FTRACE is not set CONFIG_CMDLINE_BOOL=y
arch/mips/configs/eyeq6_defconfig +0 -1
@@ -100,11 +100,10 @@ CONFIG_NFS_FS=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_V4_1=y CONFIG_NFS_V4_2=y CONFIG_ROOT_NFS=y -CONFIG_CRYPTO_CRC32_MIPS=y CONFIG_FRAME_WARN=1024 CONFIG_DEBUG_FS=y # CONFIG_RCU_TRACE is not set # CONFIG_FTRACE is not set CONFIG_CMDLINE_BOOL=y
arch/mips/configs/generic/32r6.config +0 -2
@@ -1,4 +1,2 @@ CONFIG_CPU_MIPS32_R6=y CONFIG_HIGHMEM=y - -CONFIG_CRYPTO_CRC32_MIPS=y
arch/mips/configs/generic/64r6.config +0 -1
@@ -2,7 +2,6 @@ CONFIG_CPU_MIPS64_R6=y CONFIG_64BIT=y CONFIG_MIPS32_O32=y CONFIG_MIPS32_N32=y CONFIG_CPU_HAS_MSA=y -CONFIG_CRYPTO_CRC32_MIPS=y CONFIG_VIRTUALIZATION=y
arch/mips/crypto/Kconfig +0 -9
@@ -1,18 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (mips)" -config CRYPTO_CRC32_MIPS - tristate "CRC32c and CRC32" - depends on MIPS_CRC_SUPPORT - select CRYPTO_HASH - help - CRC32c and CRC32 CRC algorithms - - Architecture: mips - config CRYPTO_POLY1305_MIPS tristate "Hash functions: Poly1305" depends on MIPS select CRYPTO_ARCH_HAVE_LIB_POLY1305 help
arch/mips/crypto/Makefile +0 -2
@@ -1,12 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 # # Makefile for MIPS crypto files.. # -obj-$(CONFIG_CRYPTO_CRC32_MIPS) += crc32-mips.o - obj-$(CONFIG_CRYPTO_CHACHA_MIPS) += chacha-mips.o chacha-mips-y := chacha-core.o chacha-glue.o AFLAGS_chacha-core.o += -O2 # needed to fill branch delay slots obj-$(CONFIG_CRYPTO_POLY1305_MIPS) += poly1305-mips.o
arch/mips/crypto/crc32-mips.c deleted +0 -354
354 lines not on this page · raw message
arch/mips/lib/Makefile +2 -0
@@ -12,7 +12,9 @@ obj-$(CONFIG_PCI) += iomap-pci.o lib-$(CONFIG_GENERIC_CSUM) := $(filter-out csum_partial.o, $(lib-y)) obj-$(CONFIG_CPU_GENERIC_DUMP_TLB) += dump_tlb.o obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o +obj-$(CONFIG_CRC32_ARCH) += crc32-mips.o + # libgcc-style stuff needed in the kernel obj-y += bswapsi.o bswapdi.o multi3.o
arch/mips/lib/crc32-mips.c new file +192 -0
192 lines not on this page · raw message
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 8/19 powerpc/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the powerpc CRC32C assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/powerpc/crypto/crc32c-vpmsum_glue.c to arch/powerpc/lib/crc32-glue.c, view this commit with 'git show -M10'.
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/configs/powernv_defconfig | 1 -
arch/powerpc/configs/ppc64_defconfig | 1 -
arch/powerpc/crypto/Kconfig | 15 +-
arch/powerpc/crypto/Makefile | 2 -
arch/powerpc/crypto/crc32c-vpmsum_glue.c | 173 ------------------
arch/powerpc/crypto/crct10dif-vpmsum_asm.S | 2 +-
arch/powerpc/lib/Makefile | 3 +
arch/powerpc/lib/crc32-glue.c | 92 ++++++++++
.../{crypto => lib}/crc32-vpmsum_core.S | 0
.../{crypto => lib}/crc32c-vpmsum_asm.S | 0
11 files changed, 98 insertions(+), 192 deletions(-)
delete mode 100644 arch/powerpc/crypto/crc32c-vpmsum_glue.c
create mode 100644 arch/powerpc/lib/crc32-glue.c
rename arch/powerpc/{crypto => lib}/crc32-vpmsum_core.S (100%)
rename arch/powerpc/{crypto => lib}/crc32c-vpmsum_asm.S (100%)arch/powerpc/Kconfig +1 -0
@@ -125,10 +125,11 @@ config PPC select ARCH_DISABLE_KASAN_INLINE if PPC_RADIX_MMU select ARCH_DMA_DEFAULT_COHERENT if !NOT_COHERENT_CACHE select ARCH_ENABLE_MEMORY_HOTPLUG select ARCH_ENABLE_MEMORY_HOTREMOVE select ARCH_HAS_COPY_MC if PPC64 + select ARCH_HAS_CRC32 if PPC64 && ALTIVEC select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DEBUG_WX if STRICT_KERNEL_RWX select ARCH_HAS_DEVMEM_IS_ALLOWED
arch/powerpc/configs/powernv_defconfig +0 -1
@@ -318,11 +318,10 @@ CONFIG_FTR_FIXUP_SELFTEST=y CONFIG_MSI_BITMAP_SELFTEST=y CONFIG_XMON=y CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_PCBC=m CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_CRC32C_VPMSUM=m CONFIG_CRYPTO_CRCT10DIF_VPMSUM=m CONFIG_CRYPTO_MD5_PPC=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_SHA1_PPC=m CONFIG_CRYPTO_SHA256=y
arch/powerpc/configs/ppc64_defconfig +0 -1
@@ -387,11 +387,10 @@ CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_PCBC=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_LZO=m -CONFIG_CRYPTO_CRC32C_VPMSUM=m CONFIG_CRYPTO_CRCT10DIF_VPMSUM=m CONFIG_CRYPTO_VPMSUM_TESTER=m CONFIG_CRYPTO_MD5_PPC=m CONFIG_CRYPTO_SHA1_PPC=m CONFIG_CRYPTO_AES_GCM_P10=m
arch/powerpc/crypto/Kconfig +1 -14
@@ -11,23 +11,10 @@ config CRYPTO_CURVE25519_PPC64 Curve25519 algorithm Architecture: PowerPC64 - Little-endian -config CRYPTO_CRC32C_VPMSUM - tristate "CRC32c" - depends on PPC64 && ALTIVEC - select CRYPTO_HASH - select CRC32 - help - CRC32c CRC algorithm with the iSCSI polynomial (RFC 3385 and RFC 3720) - - Architecture: powerpc64 using - - AltiVec extensions - - Enable on POWER8 and newer processors for improved performance. - config CRYPTO_CRCT10DIF_VPMSUM tristate "CRC32T10DIF" depends on PPC64 && ALTIVEC && CRC_T10DIF select CRYPTO_HASH help
@@ -38,11 +25,11 @@ config CRYPTO_CRCT10DIF_VPMSUM Enable on POWER8 and newer processors for improved performance. config CRYPTO_VPMSUM_TESTER tristate "CRC32c and CRC32T10DIF hardware acceleration tester" - depends on CRYPTO_CRCT10DIF_VPMSUM && CRYPTO_CRC32C_VPMSUM + depends on CRYPTO_CRCT10DIF_VPMSUM && CRYPTO_CRC32C && CRC32_ARCH help Stress test for CRC32c and CRCT10DIF algorithms implemented with powerpc64 AltiVec extensions (POWER8 vpmsum instructions). Unless you are testing these algorithms, you don't need this.
arch/powerpc/crypto/Makefile +0 -2
@@ -8,11 +8,10 @@ obj-$(CONFIG_CRYPTO_AES_PPC_SPE) += aes-ppc-spe.o obj-$(CONFIG_CRYPTO_MD5_PPC) += md5-ppc.o obj-$(CONFIG_CRYPTO_SHA1_PPC) += sha1-powerpc.o obj-$(CONFIG_CRYPTO_SHA1_PPC_SPE) += sha1-ppc-spe.o obj-$(CONFIG_CRYPTO_SHA256_PPC_SPE) += sha256-ppc-spe.o -obj-$(CONFIG_CRYPTO_CRC32C_VPMSUM) += crc32c-vpmsum.o obj-$(CONFIG_CRYPTO_CRCT10DIF_VPMSUM) += crct10dif-vpmsum.o obj-$(CONFIG_CRYPTO_VPMSUM_TESTER) += crc-vpmsum_test.o obj-$(CONFIG_CRYPTO_AES_GCM_P10) += aes-gcm-p10-crypto.o obj-$(CONFIG_CRYPTO_CHACHA20_P10) += chacha-p10-crypto.o obj-$(CONFIG_CRYPTO_POLY1305_P10) += poly1305-p10-crypto.o
@@ -22,11 +21,10 @@ obj-$(CONFIG_CRYPTO_CURVE25519_PPC64) += curve25519-ppc64le.o aes-ppc-spe-y := aes-spe-core.o aes-spe-keys.o aes-tab-4k.o aes-spe-modes.o aes-spe-glue.o md5-ppc-y := md5-asm.o md5-glue.o sha1-powerpc-y := sha1-powerpc-asm.o sha1.o sha1-ppc-spe-y := sha1-spe-asm.o sha1-spe-glue.o sha256-ppc-spe-y := sha256-spe-asm.o sha256-spe-glue.o -crc32c-vpmsum-y := crc32c-vpmsum_asm.o crc32c-vpmsum_glue.o crct10dif-vpmsum-y := crct10dif-vpmsum_asm.o crct10dif-vpmsum_glue.o aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp10-ppc.o aesp10-ppc.o chacha-p10-crypto-y := chacha-p10-glue.o chacha-p10le-8x.o poly1305-p10-crypto-y := poly1305-p10-glue.o poly1305-p10le_64.o vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o
arch/powerpc/crypto/crc32c-vpmsum_glue.c deleted +0 -173
173 lines not on this page · raw message
arch/powerpc/crypto/crct10dif-vpmsum_asm.S +1 -1
@@ -840,6 +840,6 @@ .octa 0x000000000000000000000001f65a57f8 /* x^64 div p(x) */ /* Barrett constant n */ .octa 0x0000000000000000000000018bb70000 #define CRC_FUNCTION_NAME __crct10dif_vpmsum -#include "crc32-vpmsum_core.S" +#include "../lib/crc32-vpmsum_core.S"
arch/powerpc/lib/Makefile +3 -0
@@ -76,6 +76,9 @@ obj-$(CONFIG_FTR_FIXUP_SELFTEST) += feature-fixups-test.o obj-$(CONFIG_ALTIVEC) += xor_vmx.o xor_vmx_glue.o CFLAGS_xor_vmx.o += -mhard-float -maltivec $(call cc-option,-mabi=altivec) # Enable <altivec.h> CFLAGS_xor_vmx.o += -isystem $(shell $(CC) -print-file-name=include) +obj-$(CONFIG_CRC32_ARCH) += crc32-powerpc.o +crc32-powerpc-y := crc32-glue.o crc32c-vpmsum_asm.o + obj-$(CONFIG_PPC64) += $(obj64-y)
arch/powerpc/lib/crc32-glue.c new file +92 -0
92 lines not on this page · raw message
arch/powerpc/lib/crc32-vpmsum_core.S renamed from arch/powerpc/crypto/crc32-vpmsum_core.S +0 -0
arch/powerpc/lib/crc32c-vpmsum_asm.S renamed from arch/powerpc/crypto/crc32c-vpmsum_asm.S +0 -0
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 9/19 s390/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the s390 CRC32 assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/s390/crypto/crc32-vx.c to arch/s390/lib/crc32-glue.c, view this commit with 'git show -M10'.
---
arch/s390/Kconfig | 1 +
arch/s390/configs/debug_defconfig | 1 -
arch/s390/configs/defconfig | 1 -
arch/s390/crypto/Kconfig | 12 -
arch/s390/crypto/Makefile | 2 -
arch/s390/crypto/crc32-vx.c | 306 -------------------------
arch/s390/lib/Makefile | 3 +
arch/s390/lib/crc32-glue.c | 92 ++++++++
arch/s390/{crypto => lib}/crc32-vx.h | 0
arch/s390/{crypto => lib}/crc32be-vx.c | 0
arch/s390/{crypto => lib}/crc32le-vx.c | 0
11 files changed, 96 insertions(+), 322 deletions(-)
delete mode 100644 arch/s390/crypto/crc32-vx.c
create mode 100644 arch/s390/lib/crc32-glue.c
rename arch/s390/{crypto => lib}/crc32-vx.h (100%)
rename arch/s390/{crypto => lib}/crc32be-vx.c (100%)
rename arch/s390/{crypto => lib}/crc32le-vx.c (100%)arch/s390/Kconfig +1 -0
@@ -70,10 +70,11 @@ config S390 select ARCH_BINFMT_ELF_STATE select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE select ARCH_ENABLE_MEMORY_HOTPLUG if SPARSEMEM select ARCH_ENABLE_MEMORY_HOTREMOVE select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2 + select ARCH_HAS_CRC32 select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DEBUG_WX select ARCH_HAS_DEVMEM_IS_ALLOWED
arch/s390/configs/debug_defconfig +0 -1
@@ -793,11 +793,10 @@ CONFIG_CRYPTO_ZSTD=m CONFIG_CRYPTO_ANSI_CPRNG=m CONFIG_CRYPTO_USER_API_HASH=m CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_AEAD=m -CONFIG_CRYPTO_CRC32_S390=y CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_SHA1_S390=m CONFIG_CRYPTO_SHA256_S390=m CONFIG_CRYPTO_SHA3_256_S390=m CONFIG_CRYPTO_SHA3_512_S390=m
arch/s390/configs/defconfig +0 -1
@@ -780,11 +780,10 @@ CONFIG_CRYPTO_ANSI_CPRNG=m CONFIG_CRYPTO_JITTERENTROPY_OSR=1 CONFIG_CRYPTO_USER_API_HASH=m CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_AEAD=m -CONFIG_CRYPTO_CRC32_S390=y CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_SHA1_S390=m CONFIG_CRYPTO_SHA256_S390=m CONFIG_CRYPTO_SHA3_256_S390=m CONFIG_CRYPTO_SHA3_512_S390=m
arch/s390/crypto/Kconfig +0 -12
@@ -1,21 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (s390)" -config CRYPTO_CRC32_S390 - tristate "CRC32c and CRC32" - depends on S390 - select CRYPTO_HASH - select CRC32 - help - CRC32c and CRC32 CRC algorithms - - Architecture: s390 - - It is available with IBM z13 or later. - config CRYPTO_SHA512_S390 tristate "Hash functions: SHA-384 and SHA-512" depends on S390 select CRYPTO_HASH help
arch/s390/crypto/Makefile +0 -2
@@ -12,11 +12,9 @@ obj-$(CONFIG_CRYPTO_DES_S390) += des_s390.o obj-$(CONFIG_CRYPTO_AES_S390) += aes_s390.o obj-$(CONFIG_CRYPTO_PAES_S390) += paes_s390.o obj-$(CONFIG_CRYPTO_CHACHA_S390) += chacha_s390.o obj-$(CONFIG_S390_PRNG) += prng.o obj-$(CONFIG_CRYPTO_GHASH_S390) += ghash_s390.o -obj-$(CONFIG_CRYPTO_CRC32_S390) += crc32-vx_s390.o obj-$(CONFIG_CRYPTO_HMAC_S390) += hmac_s390.o obj-y += arch_random.o -crc32-vx_s390-y := crc32-vx.o crc32le-vx.o crc32be-vx.o chacha_s390-y := chacha-glue.o chacha-s390.o
arch/s390/crypto/crc32-vx.c deleted +0 -306
306 lines not on this page · raw message
arch/s390/lib/Makefile +3 -0
@@ -22,5 +22,8 @@ obj-$(CONFIG_S390_MODULES_SANITY_TEST) += test_modules.o obj-$(CONFIG_S390_MODULES_SANITY_TEST_HELPERS) += test_modules_helpers.o lib-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o obj-$(CONFIG_EXPOLINE_EXTERN) += expoline.o + +obj-$(CONFIG_CRC32_ARCH) += crc32-s390.o +crc32-s390-y := crc32-glue.o crc32le-vx.o crc32be-vx.o
arch/s390/lib/crc32-glue.c new file +92 -0
92 lines not on this page · raw message
arch/s390/lib/crc32-vx.h renamed from arch/s390/crypto/crc32-vx.h +0 -0
arch/s390/lib/crc32be-vx.c renamed from arch/s390/crypto/crc32be-vx.c +0 -0
arch/s390/lib/crc32le-vx.c renamed from arch/s390/crypto/crc32le-vx.c +0 -0
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 10/19 sparc/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the sparc CRC32C assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
Note: to see the diff from arch/sparc/crypto/crc32c_glue.c to arch/sparc/lib/crc32_glue.c, view this commit with 'git show -M10'.
---
arch/sparc/Kconfig | 1 +
arch/sparc/crypto/Kconfig | 10 --
arch/sparc/crypto/Makefile | 4 -
arch/sparc/crypto/crc32c_glue.c | 184 ------------------------
arch/sparc/lib/Makefile | 2 +
arch/sparc/lib/crc32_glue.c | 93 ++++++++++++
arch/sparc/{crypto => lib}/crc32c_asm.S | 2 +-
7 files changed, 97 insertions(+), 199 deletions(-)
delete mode 100644 arch/sparc/crypto/crc32c_glue.c
create mode 100644 arch/sparc/lib/crc32_glue.c
rename arch/sparc/{crypto => lib}/crc32c_asm.S (92%)arch/sparc/Kconfig +1 -0
@@ -108,10 +108,11 @@ config SPARC64 select ARCH_HAS_GIGANTIC_PAGE select HAVE_SOFTIRQ_ON_OWN_STACK select HAVE_SETUP_PER_CPU_AREA select NEED_PER_CPU_EMBED_FIRST_CHUNK select NEED_PER_CPU_PAGE_FIRST_CHUNK + select ARCH_HAS_CRC32 config ARCH_PROC_KCORE_TEXT def_bool y config CPU_BIG_ENDIAN
arch/sparc/crypto/Kconfig +0 -10
@@ -14,20 +14,10 @@ config CRYPTO_DES_SPARC64 Length-preserving ciphers: DES with ECB and CBC modes Length-preserving ciphers: Tripe DES EDE with ECB and CBC modes Architecture: sparc64 -config CRYPTO_CRC32C_SPARC64 - tristate "CRC32c" - depends on SPARC64 - select CRYPTO_HASH - select CRC32 - help - CRC32c CRC algorithm with the iSCSI polynomial (RFC 3385 and RFC 3720) - - Architecture: sparc64 - config CRYPTO_MD5_SPARC64 tristate "Digests: MD5" depends on SPARC64 select CRYPTO_MD5 select CRYPTO_HASH
arch/sparc/crypto/Makefile +0 -4
@@ -10,17 +10,13 @@ obj-$(CONFIG_CRYPTO_MD5_SPARC64) += md5-sparc64.o obj-$(CONFIG_CRYPTO_AES_SPARC64) += aes-sparc64.o obj-$(CONFIG_CRYPTO_DES_SPARC64) += des-sparc64.o obj-$(CONFIG_CRYPTO_CAMELLIA_SPARC64) += camellia-sparc64.o -obj-$(CONFIG_CRYPTO_CRC32C_SPARC64) += crc32c-sparc64.o - sha1-sparc64-y := sha1_asm.o sha1_glue.o sha256-sparc64-y := sha256_asm.o sha256_glue.o sha512-sparc64-y := sha512_asm.o sha512_glue.o md5-sparc64-y := md5_asm.o md5_glue.o aes-sparc64-y := aes_asm.o aes_glue.o des-sparc64-y := des_asm.o des_glue.o camellia-sparc64-y := camellia_asm.o camellia_glue.o - -crc32c-sparc64-y := crc32c_asm.o crc32c_glue.o
arch/sparc/crypto/crc32c_glue.c deleted +0 -184
184 lines not on this page · raw message
arch/sparc/lib/Makefile +2 -0
@@ -51,5 +51,7 @@ lib-$(CONFIG_SPARC64) += copy_in_user.o memmove.o lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o obj-$(CONFIG_SPARC64) += iomap.o obj-$(CONFIG_SPARC32) += atomic32.o obj-$(CONFIG_SPARC64) += PeeCeeI.o +obj-$(CONFIG_CRC32_ARCH) += crc32-sparc.o +crc32-sparc-y := crc32_glue.o crc32c_asm.o
arch/sparc/lib/crc32_glue.c new file +93 -0
93 lines not on this page · raw message
arch/sparc/lib/crc32c_asm.S renamed from arch/sparc/crypto/crc32c_asm.S +1 -1
@@ -1,11 +1,11 @@ /* SPDX-License-Identifier: GPL-2.0 */ #include <linux/linkage.h> #include <asm/visasm.h> #include <asm/asi.h> -#include "opcodes.h" +#include "../crypto/opcodes.h" ENTRY(crc32c_sparc64) /* %o0=crc32p, %o1=data_ptr, %o2=len */ VISEntryHalf lda [%o0] ASI_PL, %f1
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 11/19 x86/crc32: update prototype for crc_pcl()
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
- Change the len parameter from unsigned int to size_t, so that the library function which takes a size_t can safely use this code.
- Rename to crc32c_x86_3way() which is much clearer.
- Move the crc parameter to the front, as this is the usual convention.
--- arch/x86/crypto/crc32c-intel_glue.c | 7 ++- arch/x86/crypto/crc32c-pcl-intel-asm_64.S | 63 ++++++++++++----------- 2 files changed, 35 insertions(+), 35 deletions(-)
arch/x86/crypto/crc32c-intel_glue.c +3 -4
@@ -39,12 +39,11 @@* size is >= 512 to account * for fpu state save/restore overhead. */ #define CRC32C_PCL_BREAKEVEN 512 -asmlinkage unsigned int crc_pcl(const u8 *buffer, unsigned int len, -unsigned int crc_init); +asmlinkage u32 crc32c_x86_3way(u32 crc, const u8 *buffer, size_t len);#endif /* CONFIG_X86_64 */ static u32 crc32c_intel_le_hw_byte (u32 crc,unsigned char const *data,size_t length) {while (length--) {
@@ -157,11 +156,11 @@ static int crc32c_pcl_intel_update(struct shash_desc *desc, const u8 *data,* use faster PCL version if datasize is large enough to * overcome kernel fpu state save/restore overhead */ if (len >=CRC32C_PCL_BREAKEVEN &&crypto_simd_usable ()) {kernel_fpu_begin (); - *crcp =crc_pcl (data, len, *crcp); + *crcp =crc32c_x86_3way (*crcp, data, len);kernel_fpu_end (); }else *crcp =crc32c_intel_le_hw (*crcp, data, len);return 0 ; }
@@ -169,11 +168,11 @@ static int crc32c_pcl_intel_update(struct shash_desc *desc, const u8 *data,static int __crc32c_pcl_intel_finup (u32 *crcp,const u8 *data,unsigned int len,u8 *out) {if (len >=CRC32C_PCL_BREAKEVEN &&crypto_simd_usable ()) {kernel_fpu_begin (); - *(__le32 *)out = ~cpu_to_le32 (crc_pcl (data, len, *crcp)); + *(__le32 *)out = ~cpu_to_le32 (crc32c_x86_3way (*crcp, data, len));kernel_fpu_end (); }else *(__le32 *)out = ~cpu_to_le32 (crc32c_intel_le_hw (*crcp, data, len));return 0 ;
arch/x86/crypto/crc32c-pcl-intel-asm_64.S +32 -31
175 lines not on this page · raw message
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 12/19 x86/crc32: update prototype for crc32_pclmul_le_16()
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
- Change the len parameter from unsigned int to size_t, so that the library function which takes a size_t can safely use this code.
- Move the crc parameter to the front, as this is the usual convention.
--- arch/x86/crypto/crc32-pclmul_asm.S | 19 +++++++++---------- arch/x86/crypto/crc32-pclmul_glue.c | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-)
arch/x86/crypto/crc32-pclmul_asm.S +9 -10
@@ -56,30 +56,29 @@ .octa 0x00000001F701164100000001DB710641 #define CONSTANT %xmm0 #ifdef __x86_64__ -#define BUF %rdi -#define LEN %rsi -#define CRC %edx +#define CRC %edi +#define BUF %rsi +#define LEN %rdx #else -#define BUF %eax -#define LEN %edx -#define CRC %ecx +#define CRC %eax +#define BUF %edx +#define LEN %ecx #endif .text /** * Calculate crc32 - * BUF - buffer (16 bytes aligned) - * LEN - sizeof buffer (16 bytes aligned), LEN should be grater than 63 * CRC - initial crc32 + * BUF - buffer (16 bytes aligned) + * LEN - sizeof buffer (16 bytes aligned), LEN should be greater than 63 * return %eax crc32 - * uint crc32_pclmul_le_16(unsigned char const *buffer, - * size_t len, uint crc32) + * u32 crc32_pclmul_le_16(u32 crc, const u8 *buffer, size_t len); */ SYM_FUNC_START(crc32_pclmul_le_16) /* buffer and buffer size are 16 bytes aligned */ movdqa (BUF), %xmm1 movdqa 0x10(BUF), %xmm2
arch/x86/crypto/crc32-pclmul_glue.c +2 -2
@@ -44,11 +44,11 @@#define PCLMUL_MIN_LEN 64L/* minimum size of buffer * for crc32_pclmul_le_16 */ #define SCALE_F 16L/* size of xmm register */ #define SCALE_F_MASK (SCALE_F - 1) -u32 crc32_pclmul_le_16 (unsigned char const *buffer,size_t len,u32 crc32); +u32 crc32_pclmul_le_16 (u32 crc,const u8 *buffer,size_t len);static u32 __attribute__((pure))crc32_pclmul_le (u32 crc,unsigned char const *p,size_t len) {unsigned int iquotient;
@@ -69,11 +69,11 @@ static u32 __attribute__((pure)) } iquotient = len & (~SCALE_F_MASK ); iremainder = len &SCALE_F_MASK ;kernel_fpu_begin (); - crc =crc32_pclmul_le_16 (p, iquotient, crc); + crc =crc32_pclmul_le_16 (crc, p, iquotient);kernel_fpu_end ();if (iremainder) crc =crc32_le (crc, p + iquotient, iremainder);
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 13/19 x86/crc32: expose CRC32 functions through lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Move the x86 CRC32 assembly code into the lib directory and wire it up to the library interface. This allows it to be used without going through the crypto API. It remains usable via the crypto API too via the shash algorithms that use the library interface. Thus all the arch-specific "shash" code becomes unnecessary and is removed.
---
arch/x86/Kconfig | 1 +
arch/x86/crypto/Kconfig | 22 --
arch/x86/crypto/Makefile | 7 -
arch/x86/crypto/crc32-pclmul_glue.c | 202 --------------
arch/x86/crypto/crc32c-intel_glue.c | 249 ------------------
arch/x86/lib/Makefile | 4 +
arch/x86/lib/crc32-glue.c | 124 +++++++++
.../crc32-pclmul_asm.S => lib/crc32-pclmul.S} | 0
.../crc32c-3way.S} | 0
drivers/target/iscsi/Kconfig | 1 -
10 files changed, 129 insertions(+), 481 deletions(-)
delete mode 100644 arch/x86/crypto/crc32-pclmul_glue.c
delete mode 100644 arch/x86/crypto/crc32c-intel_glue.c
create mode 100644 arch/x86/lib/crc32-glue.c
rename arch/x86/{crypto/crc32-pclmul_asm.S => lib/crc32-pclmul.S} (100%)
rename arch/x86/{crypto/crc32c-pcl-intel-asm_64.S => lib/crc32c-3way.S} (100%)arch/x86/Kconfig +1 -0
@@ -74,10 +74,11 @@ config X86 select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI select ARCH_HAS_CACHE_LINE_SIZE select ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION select ARCH_HAS_CPU_FINALIZE_INIT select ARCH_HAS_CPU_PASID if IOMMU_SVA + select ARCH_HAS_CRC32 select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_DMA_OPS if GART_IOMMU || XEN
arch/x86/crypto/Kconfig +0 -22
@@ -490,32 +490,10 @@ config CRYPTO_GHASH_CLMUL_NI_INTEL GCM GHASH hash function (NIST SP800-38D) Architecture: x86_64 using: - CLMUL-NI (carry-less multiplication new instructions) -config CRYPTO_CRC32C_INTEL - tristate "CRC32c (SSE4.2/PCLMULQDQ)" - depends on X86 - select CRYPTO_HASH - help - CRC32c CRC algorithm with the iSCSI polynomial (RFC 3385 and RFC 3720) - - Architecture: x86 (32-bit and 64-bit) using: - - SSE4.2 (Streaming SIMD Extensions 4.2) CRC32 instruction - - PCLMULQDQ (carry-less multiplication) - -config CRYPTO_CRC32_PCLMUL - tristate "CRC32 (PCLMULQDQ)" - depends on X86 - select CRYPTO_HASH - select CRC32 - help - CRC32 CRC algorithm (IEEE 802.3) - - Architecture: x86 (32-bit and 64-bit) using: - - PCLMULQDQ (carry-less multiplication) - config CRYPTO_CRCT10DIF_PCLMUL tristate "CRCT10DIF (PCLMULQDQ)" depends on X86 && 64BIT && CRC_T10DIF select CRYPTO_HASH help
arch/x86/crypto/Makefile +0 -7
@@ -73,17 +73,10 @@ obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o obj-$(CONFIG_CRYPTO_POLYVAL_CLMUL_NI) += polyval-clmulni.o polyval-clmulni-y := polyval-clmulni_asm.o polyval-clmulni_glue.o -obj-$(CONFIG_CRYPTO_CRC32C_INTEL) += crc32c-intel.o -crc32c-intel-y := crc32c-intel_glue.o -crc32c-intel-$(CONFIG_64BIT) += crc32c-pcl-intel-asm_64.o - -obj-$(CONFIG_CRYPTO_CRC32_PCLMUL) += crc32-pclmul.o -crc32-pclmul-y := crc32-pclmul_asm.o crc32-pclmul_glue.o - obj-$(CONFIG_CRYPTO_CRCT10DIF_PCLMUL) += crct10dif-pclmul.o crct10dif-pclmul-y := crct10dif-pcl-asm_64.o crct10dif-pclmul_glue.o obj-$(CONFIG_CRYPTO_POLY1305_X86_64) += poly1305-x86_64.o poly1305-x86_64-y := poly1305-x86_64-cryptogams.o poly1305_glue.o
arch/x86/crypto/crc32-pclmul_glue.c deleted +0 -202
202 lines not on this page · raw message
arch/x86/crypto/crc32c-intel_glue.c deleted +0 -249
249 lines not on this page · raw message
arch/x86/lib/Makefile +4 -0
@@ -36,10 +36,14 @@ lib-$(CONFIG_ARCH_HAS_COPY_MC) += copy_mc.o copy_mc_64.o lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o insn-eval.o lib-$(CONFIG_RANDOMIZE_BASE) += kaslr.o lib-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o lib-$(CONFIG_MITIGATION_RETPOLINE) += retpoline.o +obj-$(CONFIG_CRC32_ARCH) += crc32-x86.o +crc32-x86-y := crc32-glue.o crc32-pclmul.o +crc32-x86-$(CONFIG_64BIT) += crc32c-3way.o + obj-y += msr.o msr-reg.o msr-reg-export.o hweight.o obj-y += iomem.o ifeq ($(CONFIG_X86_32),y) obj-y += atomic64_32.o
arch/x86/lib/crc32-glue.c new file +124 -0
124 lines not on this page · raw message
arch/x86/lib/crc32-pclmul.S renamed from arch/x86/crypto/crc32-pclmul_asm.S +0 -0
arch/x86/lib/crc32c-3way.S renamed from arch/x86/crypto/crc32c-pcl-intel-asm_64.S +0 -0
drivers/target/iscsi/Kconfig +0 -1
@@ -2,11 +2,10 @@ config ISCSI_TARGET tristate "SCSI Target Mode Stack" depends on INET select CRYPTO select CRYPTO_CRC32C - select CRYPTO_CRC32C_INTEL if X86 help Say M to enable the SCSI target mode stack. A SCSI target mode stack is software that makes local storage available over a storage network to a SCSI initiator system. The supported storage network technologies include iSCSI, Fibre Channel and the SCSI RDMA Protocol (SRP).
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 14/19 bcachefs: Explicitly select CRYPTO from BCACHEFS_FS
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Explicitly select CRYPTO from BCACHEFS_FS, so that this dependency of CRYPTO_SHA256, CRYPTO_CHACHA20, and CRYPTO_POLY1305 (which are also selected) is satisfied. Currently this dependency is satisfied indirectly via LIBCRC32C, but this is fragile and is planned to change
(https://lore.kernel.org/r/[email protected]).
--- fs/bcachefs/Kconfig | 1 + 1 file changed, 1 insertion(+)
fs/bcachefs/Kconfig +1 -0
@@ -13,10 +13,11 @@ config BCACHEFS_FS select LZ4HC_DECOMPRESS select ZLIB_DEFLATE select ZLIB_INFLATE select ZSTD_COMPRESS select ZSTD_DECOMPRESS + select CRYPTO select CRYPTO_SHA256 select CRYPTO_CHACHA20 select CRYPTO_POLY1305 select KEYS select RAID6_PQ
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 15/19 lib/crc32: make crc32c() go directly to lib
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Now that the lower level __crc32c_le() library function is optimized for each architecture, make crc32c() just call that instead of taking an inefficient and error-prone detour through the shash API.
Note: a future cleanup should make crc32c_le() be the actual library function instead of __crc32c_le(). That will require updating callers of __crc32c_le() to use crc32c_le() instead, and updating callers of crc32c_le() that expect a 'const void *' arg to expect 'const u8 *' instead. Similarly, a future cleanup should remove LIBCRC32C by making everyone who is selecting it just select CRC32 directly instead.
--- include/linux/crc32c.h | 7 ++-- lib/Kconfig | 10 ++---- lib/Makefile | 1 - lib/libcrc32c.c | 74 ------------------------------------------ 4 files changed, 8 insertions(+), 84 deletions(-) delete mode 100644 lib/libcrc32c.c
include/linux/crc32c.h +5 -2
@@ -1,12 +1,15 @@/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_CRC32C_H#define _LINUX_CRC32C_H -#include <linux/types.h> +#include <linux/crc32.h> -extern u32 crc32c (u32 crc,const void *address,unsigned int length); +static inline u32 crc32c (u32 crc,const void *address,unsigned int length) +{ +return __crc32c_le (crc, address, length); +}/* This macro exists for backwards-compatibility. */ #define crc32c_le crc32c#endif /* _LINUX_CRC32C_H */
lib/Kconfig +3 -7
@@ -308,18 +308,14 @@ config CRC7 the kernel tree does. Such modules that use library CRC7 functions require M here. config LIBCRC32C tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check" - select CRYPTO - select CRYPTO_CRC32C + select CRC32 help - This option is provided for the case where no in-kernel-tree - modules require CRC32c functions, but a module built outside the - kernel tree does. Such modules that use library CRC32c functions - require M here. See Castagnoli93. - Module will be libcrc32c. + This option just selects CRC32 and is provided for compatibility + purposes until the users are updated to select CRC32 directly. config CRC8 tristate "CRC8 function" help This option provides CRC8 function. Drivers may select this
lib/Makefile +0 -1
@@ -165,11 +165,10 @@ obj-$(CONFIG_CRC_ITU_T) += crc-itu-t.o obj-$(CONFIG_CRC32) += crc32.o obj-$(CONFIG_CRC64) += crc64.o obj-$(CONFIG_CRC32_SELFTEST) += crc32test.o obj-$(CONFIG_CRC4) += crc4.o obj-$(CONFIG_CRC7) += crc7.o -obj-$(CONFIG_LIBCRC32C) += libcrc32c.o obj-$(CONFIG_CRC8) += crc8.o obj-$(CONFIG_CRC64_ROCKSOFT) += crc64-rocksoft.o obj-$(CONFIG_XXHASH) += xxhash.o obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
lib/libcrc32c.c deleted +0 -74
74 lines not on this page · raw message
Signature · 1 line
2.47.1
Re: [PATCH v4 15/19] lib/crc32: make crc32c() go directly to lib
Eric Biggers <[email protected]>:
Quoted 1 line
Now that the lower level
__crc32c_le()library function is optimized for
This patch (i. e. 38a9a5121c3b ("lib/crc32: make crc32c() go directly to lib")) solves actual bug I found in practice. So, please, backport it
to stable kernels.
I did bisect.
It is possible to apply this patch on top of v6.12.48 without conflicts.
The bug actually prevents me for using my system (more details below).
Here is steps to reproduce bug I noticed.
Build kernel so:
$ cat /tmp/mini CONFIG_64BIT=y CONFIG_PRINTK=y CONFIG_SERIAL_8250=y CONFIG_TTY=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_BLK_DEV_INITRD=y CONFIG_RD_GZIP=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_SCRIPT=y CONFIG_PROC_FS=y CONFIG_SYSFS=y CONFIG_DEVTMPFS=y CONFIG_MODULES=y CONFIG_BTRFS_FS=m CONFIG_MODULE_COMPRESS=y CONFIG_MODULE_COMPRESS_XZ=y CONFIG_MODULE_COMPRESS_ALL=y CONFIG_MODULE_DECOMPRESS=y CONFIG_PRINTK_TIME=y $ make allnoconfig KCONFIG_ALLCONFIG=/tmp/mini $ make
Then create initramfs, which contains statically built busybox (I used busybox v1.37.0 (Debian 1:1.37.0-6+b3)) and modules we just created.
Then run Qemu using command line similar to this:
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd i.gz -append 'console=ttyS0 panic=1 rdinit=/bin/busybox sh' -m 256 -no-reboot -enable-kvm -serial stdio -display none
Then in busybox shell type this:
# mkdir /proc # busybox mount -t proc proc /proc # modprobe btrfs
On buggy kernels I get this output:
# modprobe btrfs [ 19.614228] raid6: skipped pq benchmark and selected sse2x4 [ 19.614638] raid6: using intx1 recovery algorithm [ 19.616569] xor: measuring software checksum speed [ 19.616937] prefetch64-sse : 42616 MB/sec [ 19.617270] generic_sse : 41320 MB/sec [ 19.617531] xor: using function: prefetch64-sse (42616 MB/sec) [ 19.619731] Invalid ELF header magic: != ELF modprobe: can't load module libcrc32c (kernel/lib/libcrc32c.ko.xz): unknown symbol in module, or unknown parameter
The bug is reproducible on all kernels from v6.12 until this commit. And it is not reproducible on all kernels, which contain this commit. I found this using bisect.
This bug actually breaks my workflow. I have btrfs as root filesystem. Initramfs, generated by Debian, doesn't suit my needs. So I'm going to create my own initramfs from scratch. (Note that I use Debian Trixie, which has v6.12.48 kernel.) During testing this initramfs in Qemu I noticed that command "modprobe btrfs" fails with error given above. (I not yet tried to test this initramfs on real hardware.)
So, this bug actually breaks my workflow.
So, please backport this patch (i. e. 38a9a5121c3b ("lib/crc32: make crc32c() go directly to lib")) to stable kernels.
I tested that this patch can be applied without conflicts on top of v6.12.48, and this patch indeed fixes the bug for v6.12.48.
If you want, I can give more info.
It is possible that this is in fact bug in busybox, not in Linux. But still I think that backporting this patch is good idea.
This busybox thread my be related:
https://lists.busybox.net/pipermail/busybox/2023-May/090309.html
Signature · 1 line
Askar Safin
Re: [PATCH v4 15/19] lib/crc32: make crc32c() go directly to lib
Quoted 7 lines · Askar Safin
Eric Biggers <[email protected]>:
Quoted 1 line
Now that the lower level
__crc32c_le()library function is optimized forThis patch (i. e.
38a9a5121c3b("lib/crc32: makecrc32c()go directly to lib")) solves actual bug I found in practice. So, please, backport it
to stable kernels.
Oops. I just noticed that this patch removes module "libcrc32c". And this breaks build for Debian kernel v6.12.48. Previously I tested minimal build using "make localmodconfig". Now I tried full build of Debian kernel using "dpkg-buildpackage". And it failed, because some of Debian files reference "libcrc32c", which is not available.
So, please, don't backport this patch to stable kernels. I'm sorry.
Signature · 1 line
Askar Safin
Eric Biggers
maintainerRe: [PATCH v4 15/19] lib/crc32: make crc32c() go directly to lib
Quoted 16 lines · Askar Safin
Quoted 7 lines · Askar Safin
Eric Biggers <[email protected]>:
Quoted 1 line
Now that the lower level
__crc32c_le()library function is optimized forThis patch (i. e.
38a9a5121c3b("lib/crc32: makecrc32c()go directly to lib")) solves actual bug I found in practice. So, please, backport it
to stable kernels.Oops. I just noticed that this patch removes module "libcrc32c". And this breaks build for Debian kernel v6.12.48. Previously I tested minimal build using "make localmodconfig". Now I tried full build of Debian kernel using "dpkg-buildpackage". And it failed, because some of Debian files reference "libcrc32c", which is not available.
Quoted 2 lines
So, please, don't backport this patch to stable kernels. I'm sorry.
Right, this commit simplified the CRC library design by removing the libcrc32c module. initramfs build scripts that hard-coded the addition of libcrc32c.ko into the ramdisk (which I don't think was ever necessary in the first place, though it did used to be useful to hard-code some of the *other* CRC modules like crc32c-intel) had to be updated to remove it. It looks like Debian did indeed do that, and they updated it in
https://salsa.debian.org/kernel-team/linux/-/commit/6c242c647f84bfdbdc22a6a758fa59da4e941a10#1251f9400a85485d275e1709758350aa098709a8
As for your original problem, I'd glad to see that the simplified design is preventing problems. There's an issue with backporting this commit alone, though. This was patch 15 of a 19-patch series for a good
reason: the CRC-32C implementation in lib/ wasn't architecture-optimized until after patches 1-14 of this series. Backporting this commit alone would make crc32c() no longer utilize architecture-optimized code.
Now, it already didn't do so reliably (and this patch series fixed that). However, backporting this commit alone would make it never do so. So it would regress performance in some cases.
Since the errors you're actually getting are:
[ 19.619731] Invalid ELF header magic: != ELF
modprobe: can't load module libcrc32c (kernel/lib/libcrc32c.ko.xz): unknown symbol in module, or unknown parameterI do have to wonder if this is actually a busybox bug or misconfiguration, where it's passing a compressed module to the kernel without decompressing it? And removing the module just hid the problem.
- Eric
Eric Biggers
maintainerPATCH v4 16/19 ext4: switch to using the crc32c library
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Now that the crc32c() library function directly takes advantage of architecture-specific optimizations, it is unnecessary to go through the crypto API. Just use crc32c(). This is much simpler, and it improves performance due to eliminating the crypto API overhead.
--- fs/ext4/Kconfig | 3 +-- fs/ext4/ext4.h | 25 +++---------------------- fs/ext4/super.c | 15 --------------- 3 files changed, 4 insertions(+), 39 deletions(-)
fs/ext4/Kconfig +1 -2
@@ -29,12 +29,11 @@ config EXT3_FS_SECURITY config EXT4_FS tristate "The Extended 4 (ext4) filesystem" select BUFFER_HEAD select JBD2 select CRC16 - select CRYPTO - select CRYPTO_CRC32C + select CRC32 select FS_IOMAP select FS_ENCRYPTION_ALGS if FS_ENCRYPTION help This is the next generation of the ext3 filesystem.
fs/ext4/ext4.h +3 -22
@@ -31,11 +31,11 @@#include <linux/wait.h> #include <linux/sched/signal.h> #include <linux/blockgroup_lock.h> #include <linux/percpu_counter.h> #include <linux/ratelimit.h> -#include <crypto/hash.h> +#include <linux/crc32c.h> #include <linux/falloc.h> #include <linux/percpu-rwsem.h> #include <linux/fiemap.h> #ifdef __KERNEL__#include <linux/compat.h>
@@ -1660,13 +1660,10 @@ struct ext4_sb_info {struct task_struct *s_mmp_tsk;/* record the last minlen when FITRIM is called. */ unsigned long s_last_trim_minblks; -/* Reference to checksum algorithm driver via cryptoapi */ -struct crypto_shash *s_chksum_driver; -/* Precomputed FS UUID checksum for seeding other checksums */ __u32 s_csum_seed;/* Reclaim extents from extent status tree */ struct shrinker *s_es_shrinker;
@@ -2461,23 +2458,11 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize)#define DX_HASH_LAST DX_HASH_SIPHASHstatic inline u32 ext4_chksum (struct ext4_sb_info *sbi,u32 crc,const void *address,unsigned int length) { -struct { -struct shash_desc shash; -char ctx[4 ]; - } desc; - -BUG_ON (crypto_shash_descsize (sbi->s_chksum_driver)!=sizeof (desc.ctx)); - - desc.shash.tfm = sbi->s_chksum_driver; - *(u32 *)desc.ctx = crc; - -BUG_ON (crypto_shash_update (&desc.shash, address, length)); - -return *(u32 *)desc.ctx; +return crc32c (crc, address, length); }#ifdef __KERNEL__/* hash info structure used by the directory hash */
@@ -3274,15 +3259,11 @@ extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group,extern int ext4_register_li_request (struct super_block *sb,ext4_group_t first_not_zeroed);static inline int ext4_has_metadata_csum (struct super_block *sb) { -WARN_ON_ONCE (ext4_has_feature_metadata_csum (sb) && - !EXT4_SB (sb)->s_chksum_driver); - -return ext4_has_feature_metadata_csum (sb) && - (EXT4_SB (sb)->s_chksum_driver !=NULL ); +return ext4_has_feature_metadata_csum (sb); }static inline int ext4_has_group_desc_csum (struct super_block *sb) {return ext4_has_feature_gdt_csum (sb) ||ext4_has_metadata_csum (sb);
fs/ext4/super.c +0 -15
@@ -1378,12 +1378,10 @@ static void ext4_put_super(struct super_block *sb)* Now that we are completely done shutting down the * superblock, we need to actually destroy the kobject. */ kobject_put (&sbi->s_kobj);wait_for_completion (&sbi->s_kobj_unregister); -if (sbi->s_chksum_driver) -crypto_free_shash (sbi->s_chksum_driver);kfree (sbi->s_blockgroup_lock);fs_put_dax (sbi->s_daxdev,NULL );fscrypt_free_dummy_policy (&sbi->s_dummy_enc_policy);#if IS_ENABLED (CONFIG_UNICODE )utf8_unload (sb->s_encoding);
@@ -4632,19 +4630,10 @@ static int ext4_init_metadata_csum(struct super_block *sb, struct ext4_super_bloreturn -EINVAL ; }ext4_setup_csum_trigger (sb,EXT4_JTR_ORPHAN_FILE , ext4_orphan_file_block_trigger); -/* Load the checksum driver */ - sbi->s_chksum_driver =crypto_alloc_shash ("crc32c" ,0 ,0 ); -if (IS_ERR (sbi->s_chksum_driver)) { -int ret =PTR_ERR (sbi->s_chksum_driver); -ext4_msg (sb,KERN_ERR ,"Cannot load crc32c driver." ); - sbi->s_chksum_driver =NULL ; -return ret; - } -/* Check superblock checksum */ if (!ext4_superblock_csum_verify (sb, es)) {ext4_msg (sb,KERN_ERR ,"VFS: Found ext4 filesystem with " "invalid superblock checksum. Run e2fsck?" );return -EFSBADCRC ;
@@ -5685,13 +5674,10 @@ failed_mount8: __maybe_unusedflush_work (&sbi->s_sb_upd_work);ext4_stop_mmpd (sbi);del_timer_sync (&sbi->s_err_report);ext4_group_desc_free (sbi); failed_mount: -if (sbi->s_chksum_driver) -crypto_free_shash (sbi->s_chksum_driver); -#if IS_ENABLED (CONFIG_UNICODE )utf8_unload (sb->s_encoding);#endif #ifdef CONFIG_QUOTA
@@ -7492,8 +7478,7 @@ static void __exit ext4_exit_fs(void) }MODULE_AUTHOR ("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others" );MODULE_DESCRIPTION ("Fourth Extended Filesystem" );MODULE_LICENSE ("GPL" ); -MODULE_SOFTDEP ("pre: crc32c" );module_init (ext4_init_fs)module_exit (ext4_exit_fs)
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 17/19 jbd2: switch to using the crc32c library
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Now that the crc32c() library function directly takes advantage of architecture-specific optimizations, it is unnecessary to go through the crypto API. Just use crc32c(). This is much simpler, and it improves performance due to eliminating the crypto API overhead.
--- fs/jbd2/Kconfig | 2 -- fs/jbd2/journal.c | 30 +++--------------------------- include/linux/jbd2.h | 33 +++------------------------------ 3 files changed, 6 insertions(+), 59 deletions(-)
fs/jbd2/Kconfig +0 -2
@@ -1,11 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-only config JBD2 tristate select CRC32 - select CRYPTO - select CRYPTO_CRC32C help This is a generic journaling layer for block devices that support both 32-bit and 64-bit block numbers. It is currently used by the ext4 and OCFS2 filesystems, but it could also be used to add journal support to other file systems or block devices such
fs/jbd2/journal.c +3 -27
@@ -1367,24 +1367,16 @@ static int journal_check_superblock(journal_t *journal)printk (KERN_ERR "JBD2: Can't enable checksumming v1 and v2/3 " "at the same time!\n" );return err; } -/* Load the checksum driver */ if (jbd2_journal_has_csum_v2or3_feature (journal)) {if (sb->s_checksum_type !=JBD2_CRC32C_CHKSUM ) {printk (KERN_ERR "JBD2: Unknown checksum type\n" );return err; } - journal->j_chksum_driver =crypto_alloc_shash ("crc32c" ,0 ,0 ); -if (IS_ERR (journal->j_chksum_driver)) { -printk (KERN_ERR "JBD2: Cannot load crc32c driver.\n" ); - err =PTR_ERR (journal->j_chksum_driver); - journal->j_chksum_driver =NULL ; -return err; - }/* Check superblock checksum */ if (sb->s_checksum !=jbd2_superblock_csum (journal, sb)) {printk (KERN_ERR "JBD2: journal checksum error\n" ); err = -EFSBADCRC ;return err;
@@ -1606,12 +1598,10 @@ static journal_t *journal_init_common(struct block_device *bdev,return journal; err_cleanup:percpu_counter_destroy (&journal->j_checkpoint_jh_count); -if (journal->j_chksum_driver) -crypto_free_shash (journal->j_chksum_driver);kfree (journal->j_wbuf);jbd2_journal_destroy_revoke (journal);journal_fail_superblock (journal);kfree (journal);return ERR_PTR (err);
@@ -2189,12 +2179,10 @@ int jbd2_journal_destroy(journal_t *journal)if (journal->j_proc_entry)jbd2_stats_proc_exit (journal);iput (journal->j_inode);if (journal->j_revoke)jbd2_journal_destroy_revoke (journal); -if (journal->j_chksum_driver) -crypto_free_shash (journal->j_chksum_driver);kfree (journal->j_fc_wbuf);kfree (journal->j_wbuf);kfree (journal);return err;
@@ -2335,31 +2323,19 @@ int jbd2_journal_set_features(journal_t *journal, unsigned long compat,pr_err ("JBD2: Cannot enable fast commits.\n" );return 0 ; } } -/* Load the checksum driver if necessary */ -if ((journal->j_chksum_driver ==NULL ) && -INCOMPAT_FEATURE_ON (JBD2_FEATURE_INCOMPAT_CSUM_V3 )) { - journal->j_chksum_driver =crypto_alloc_shash ("crc32c" ,0 ,0 ); -if (IS_ERR (journal->j_chksum_driver)) { -printk (KERN_ERR "JBD2: Cannot load crc32c driver.\n" ); - journal->j_chksum_driver =NULL ; -return 0 ; - } -/* Precompute checksum seed for all metadata */ - journal->j_csum_seed =jbd2_chksum (journal, ~0 , sb->s_uuid, -sizeof (sb->s_uuid)); - } -lock_buffer (journal->j_sb_buffer); -/* If enabling v3 checksums, update superblock */ +/* If enabling v3 checksums, update superblock and precompute seed */ if (INCOMPAT_FEATURE_ON (JBD2_FEATURE_INCOMPAT_CSUM_V3 )) { sb->s_checksum_type =JBD2_CRC32C_CHKSUM ; sb->s_feature_compat &= ~cpu_to_be32 (JBD2_FEATURE_COMPAT_CHECKSUM ); + journal->j_csum_seed =jbd2_chksum (journal, ~0 , sb->s_uuid, +sizeof (sb->s_uuid)); }/* If enabling v1 checksums, downgrade superblock */ if (COMPAT_FEATURE_ON (JBD2_FEATURE_COMPAT_CHECKSUM )) sb->s_feature_incompat &=
include/linux/jbd2.h +3 -30
@@ -26,11 +26,11 @@#include <linux/mutex.h> #include <linux/timer.h> #include <linux/slab.h> #include <linux/bit_spinlock.h> #include <linux/blkdev.h> -#include <crypto/hash.h> +#include <linux/crc32c.h> #endif #define journal_oom_retry 1/*
@@ -1239,17 +1239,10 @@ struct journal_s* An opaque pointer to fs-private information. ext3 puts its * superblock pointer here. */ void *j_private; -/** -* @j_chksum_driver: -* -* Reference to checksum algorithm driver via cryptoapi. -*/ -struct crypto_shash *j_chksum_driver; -/** * @j_csum_seed: * * Precomputed journal UUID checksum for seeding other checksums. */
@@ -1748,14 +1741,11 @@ static inline bool jbd2_journal_has_csum_v2or3_feature(journal_t *j)return jbd2_has_feature_csum2 (j) ||jbd2_has_feature_csum3 (j); }static inline int jbd2_journal_has_csum_v2or3 (journal_t *journal) { -WARN_ON_ONCE (jbd2_journal_has_csum_v2or3_feature (journal) && - journal->j_chksum_driver ==NULL ); - -return journal->j_chksum_driver !=NULL ; +return jbd2_journal_has_csum_v2or3_feature (journal); }static inline int jbd2_journal_get_num_fc_blks (journal_superblock_t *jsb) {int num_fc_blocks =be32_to_cpu (jsb->s_num_fc_blks);
@@ -1788,31 +1778,14 @@ static inline unsigned long jbd2_log_space_left(journal_t *journal)#define BJ_Forget 2/* Buffer superseded by this transaction */ #define BJ_Shadow 3/* Buffer contents being shadowed to the log */ #define BJ_Reserved 4/* Buffer is reserved for access by journal */ #define BJ_Types 5 -/* JBD uses a CRC32 checksum */ -#define JBD_MAX_CHECKSUM_SIZE 4 -static inline u32 jbd2_chksum (journal_t *journal,u32 crc,const void *address,unsigned int length) { - DEFINE_RAW_FLEX(struct shash_desc, desc, __ctx, -DIV_ROUND_UP (JBD_MAX_CHECKSUM_SIZE , - sizeof(*((struct shash_desc *)0)->__ctx))); -int err; - -BUG_ON (crypto_shash_descsize (journal->j_chksum_driver) > -JBD_MAX_CHECKSUM_SIZE ); - - desc->tfm = journal->j_chksum_driver; - *(u32 *)desc->__ctx = crc; - - err =crypto_shash_update (desc, address, length); -BUG_ON (err); - -return *(u32 *)desc->__ctx; +return crc32c (crc, address, length); }/* Return most recent uncommitted transaction */ static inline tid_t jbd2_get_latest_transaction (journal_t *journal) {
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 18/19 f2fs: switch to using the crc32 library
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Now that the crc32() library function takes advantage of architecture-specific optimizations, it is unnecessary to go through the crypto API. Just use crc32(). This is much simpler, and it improves performance due to eliminating the crypto API overhead.
--- fs/f2fs/Kconfig | 3 +-- fs/f2fs/f2fs.h | 20 +------------------- fs/f2fs/super.c | 15 --------------- 3 files changed, 2 insertions(+), 36 deletions(-)
fs/f2fs/Kconfig +1 -2
@@ -2,12 +2,11 @@ config F2FS_FS tristate "F2FS filesystem support" depends on BLOCK select BUFFER_HEAD select NLS - select CRYPTO - select CRYPTO_CRC32 + select CRC32 select F2FS_FS_XATTR if FS_ENCRYPTION select FS_ENCRYPTION_ALGS if FS_ENCRYPTION select FS_IOMAP select LZ4_COMPRESS if F2FS_FS_LZ4 select LZ4_DECOMPRESS if F2FS_FS_LZ4
fs/f2fs/f2fs.h +1 -19
@@ -22,11 +22,10 @@#include <linux/bio.h> #include <linux/blkdev.h> #include <linux/quotaops.h> #include <linux/part_stat.h> #include <linux/rw_hint.h> -#include <crypto/hash.h> #include <linux/fscrypt.h> #include <linux/fsverity.h> struct pagevec ;
@@ -1766,13 +1765,10 @@ struct f2fs_sb_info {/* For write statistics */ u64 sectors_written_start;u64 kbytes_written; -/* Reference to checksum algorithm driver via cryptoapi */ -struct crypto_shash *s_chksum_driver; -/* Precomputed FS UUID checksum for seeding other checksums */ __u32 s_chksum_seed;struct workqueue_struct *post_read_wq;/* post read workqueue */
@@ -1946,25 +1942,11 @@ static inline unsigned int f2fs_time_to_wait(struct f2fs_sb_info *sbi,* Inline functions */ static inline u32 __f2fs_crc32 (struct f2fs_sb_info *sbi,u32 crc,const void *address,unsigned int length) { -struct { -struct shash_desc shash; -char ctx[4 ]; - } desc; -int err; - -BUG_ON (crypto_shash_descsize (sbi->s_chksum_driver) !=sizeof (desc.ctx)); - - desc.shash.tfm = sbi->s_chksum_driver; - *(u32 *)desc.ctx = crc; - - err =crypto_shash_update (&desc.shash, address, length); -BUG_ON (err); - -return *(u32 *)desc.ctx; +return crc32 (crc, address, length); }static inline u32 f2fs_crc32 (struct f2fs_sb_info *sbi,const void *address,unsigned int length) {
fs/f2fs/super.c +0 -15
@@ -1692,12 +1692,10 @@ static void f2fs_put_super(struct super_block *sb)f2fs_destroy_post_read_wq (sbi);kvfree (sbi->ckpt); -if (sbi->s_chksum_driver) -crypto_free_shash (sbi->s_chksum_driver);kfree (sbi->raw_super);f2fs_destroy_page_array_cache (sbi);f2fs_destroy_xattr_caches (sbi);#ifdef CONFIG_QUOTA
@@ -4464,19 +4462,10 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)INIT_LIST_HEAD (&sbi->inode_list[i]);spin_lock_init (&sbi->inode_lock[i]); }mutex_init (&sbi->flush_lock); -/* Load the checksum driver */ - sbi->s_chksum_driver =crypto_alloc_shash ("crc32" ,0 ,0 ); -if (IS_ERR (sbi->s_chksum_driver)) { -f2fs_err (sbi,"Cannot load crc32 driver." ); - err =PTR_ERR (sbi->s_chksum_driver); - sbi->s_chksum_driver =NULL ; - goto free_sbi; - } -/* set a block size */ if (unlikely (!sb_set_blocksize (sb,F2FS_BLKSIZE ))) {f2fs_err (sbi,"unable to set blocksize" ); goto free_sbi; }
@@ -4917,12 +4906,10 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)fscrypt_free_dummy_policy (&F2FS_OPTION (sbi).dummy_enc_policy);kvfree (options); free_sb_buf:kfree (raw_super); free_sbi: -if (sbi->s_chksum_driver) -crypto_free_shash (sbi->s_chksum_driver);kfree (sbi); sb->s_fs_info =NULL ;/* give only one another chance */ if (retry_cnt >0 && skip_recovery) {
@@ -5125,7 +5112,5 @@ module_init(init_f2fs_fs) module_exit(exit_f2fs_fs) MODULE_AUTHOR("Samsung Electronics's Praesto Team");MODULE_DESCRIPTION ("Flash Friendly File System" );MODULE_LICENSE ("GPL" ); -MODULE_SOFTDEP ("pre: crc32" ); -
Signature · 1 line
2.47.1
Eric Biggers
maintainerPATCH v4 19/19 scsi: target: iscsi: switch to using the crc32c library
In reply to Eric BiggersFrom: Eric Biggers <[email protected]>
Now that the crc32c() library function directly takes advantage of architecture-specific optimizations, it is unnecessary to go through the crypto API. Just use crc32c(). This is much simpler, and it improves performance due to eliminating the crypto API overhead.
--- drivers/target/iscsi/Kconfig | 3 +- drivers/target/iscsi/iscsi_target.c | 153 +++++++--------------- drivers/target/iscsi/iscsi_target_login.c | 50 ------- drivers/target/iscsi/iscsi_target_login.h | 1 - drivers/target/iscsi/iscsi_target_nego.c | 21 +-- include/target/iscsi/iscsi_target_core.h | 3 - 6 files changed, 49 insertions(+), 182 deletions(-)
drivers/target/iscsi/Kconfig +2 -1
@@ -1,11 +1,12 @@ # SPDX-License-Identifier: GPL-2.0-only config ISCSI_TARGET tristate "SCSI Target Mode Stack" depends on INET + select CRC32 select CRYPTO - select CRYPTO_CRC32C + select CRYPTO_HASH help Say M to enable the SCSI target mode stack. A SCSI target mode stack is software that makes local storage available over a storage network to a SCSI initiator system. The supported storage network technologies include iSCSI, Fibre Channel and the SCSI RDMA Protocol (SRP).
drivers/target/iscsi/iscsi_target.c +45 -108
309 lines not on this page · raw message
drivers/target/iscsi/iscsi_target_login.c +0 -50
80 lines not on this page · raw message
drivers/target/iscsi/iscsi_target_login.h +0 -1
@@ -7,11 +7,10 @@struct iscsit_conn ;struct iscsi_login ;struct iscsi_np ;struct sockaddr_storage ; -extern int iscsi_login_setup_crypto (struct iscsit_conn *);extern int iscsi_check_for_session_reinstatement (struct iscsit_conn *);extern int iscsi_login_post_auth_non_zero_tsih (struct iscsit_conn *,u16 ,u32 );extern int iscsit_setup_np (struct iscsi_np *,struct sockaddr_storage *); extern int iscsi_target_setup_login_socket(struct iscsi_np *,
drivers/target/iscsi/iscsi_target_nego.c +2 -19
@@ -1192,18 +1192,11 @@ int iscsi_target_locate_portal(if (!sessiontype) {if (!login->leading_connection) goto get_target; sess->sess_ops->SessionType =1 ; -/* -* Setup crc32c modules from libcrypto -*/ -if (iscsi_login_setup_crypto (conn) <0 ) { -pr_err ("iscsi_login_setup_crypto() failed\n" ); - ret =-1 ; - goto out; - } +/* * Serialize access across the discovery struct iscsi_portal_group to * process login attempt. */ conn->tpg = iscsit_global->discovery_tpg;
@@ -1256,21 +1249,11 @@ int iscsi_target_locate_portal( ret =-1 ; goto out; } conn->tpg_np = tpg_np;pr_debug ("Located Portal Group Object: %hu\n" , conn->tpg->tpgt); -/* -* Setup crc32c modules from libcrypto -*/ -if (iscsi_login_setup_crypto (conn) <0 ) { -pr_err ("iscsi_login_setup_crypto() failed\n" ); -kref_put (&tpg_np->tpg_np_kref, iscsit_login_kref_put); -iscsit_put_tiqn_for_login (tiqn); - conn->tpg =NULL ; - ret =-1 ; - goto out; - } +/* * Serialize access across the struct iscsi_portal_group to * process login attempt. */ if (iscsit_access_np (np, conn->tpg) <0 ) {
include/target/iscsi/iscsi_target_core.h +0 -3
@@ -574,13 +574,10 @@ struct iscsit_conn {spinlock_t nopin_timer_lock;spinlock_t response_queue_lock;spinlock_t state_lock;spinlock_t login_timer_lock;spinlock_t login_worker_lock; -/* libcrypto RX and TX contexts for crc32c */ -struct ahash_request *conn_rx_hash; -struct ahash_request *conn_tx_hash;/* Used for scheduling TX and RX connection kthreads */ cpumask_var_t conn_cpumask;cpumask_var_t allowed_cpumask; unsigned int conn_rx_reset_cpumask:1; unsigned int conn_tx_reset_cpumask:1;
Signature · 1 line
2.47.1
Eric Biggers
maintainerQuoted 11 lines · Eric Biggers
This patchset applies to v6.13-rc1 and is also available in git via:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git crc32-lib-v4
CRC32 is a family of common non-cryptographic integrity check algorithms that are fairly fast with a portable C implementation and become far faster still with the CRC32 or carryless multiplication instructions that most CPUs have. 9 architectures already have optimized code for at least some CRC32 variants; however, except for arm64 this optimized code was only accessible through the crypto API, not the library functions.
Quoted 5 lines
This patchset fixes that so that the CRC32 library functions use the optimized code. This allows users to just use the library instead of the crypto API. This is much simpler and also improves performance due to eliminating the crypto API overhead including an indirect call. Some examples of updating users are included at the end of the patchset.
FYI, this patchset is now in linux-next via the crc-next branch in my repo. Additional reviews and acks would always be appreciated, of course.
- Eric
This series was applied to jaegeuk/f2fs.git (dev) by Eric Biggers <[email protected]>:
Hello:
This series was applied to jaegeuk/f2fs.git (dev)
by Eric Biggers <[email protected]>:
Quoted 4 lines · On Sun, 1 Dec 2024 17:08:25 -0800 you wrote:
This patchset applies to v6.13-rc1 and is also available in git via:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git crc32-lib-v4
Quoted 8 lines
CRC32 is a family of common non-cryptographic integrity check algorithms that are fairly fast with a portable C implementation and become far faster still with the CRC32 or carryless multiplication instructions that most CPUs have. 9 architectures already have optimized code for at least some CRC32 variants; however, except for arm64 this optimized code was only accessible through the crypto API, not the library functions.
[...]
Here is the summary with links:
- [f2fs-dev,v4,01/19] lib/crc32: drop leading underscores from __crc32c_le_base
https://git.kernel.org/jaegeuk/f2fs/c/0a499a7e9819 - [f2fs-dev,v4,02/19] lib/crc32: improve support for arch-specific overrides https://git.kernel.org/jaegeuk/f2fs/c/d36cebe03c3a - [f2fs-dev,v4,03/19] lib/crc32: expose whether the lib is really optimized at runtime https://git.kernel.org/jaegeuk/f2fs/c/b5ae12e0ee09 - [f2fs-dev,v4,04/19] crypto: crc32 - don't unnecessarily register arch algorithms https://git.kernel.org/jaegeuk/f2fs/c/780acb2543ea - [f2fs-dev,v4,05/19] arm/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/1e1b6dbc3d9c - [f2fs-dev,v4,06/19] loongarch/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/72f51a4f4b07 - [f2fs-dev,v4,07/19] mips/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/289c270eab5e - [f2fs-dev,v4,08/19] powerpc/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/372ff60ac4dd - [f2fs-dev,v4,09/19] s390/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/008071917dfc - [f2fs-dev,v4,10/19] sparc/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/0f60a8ace577 - [f2fs-dev,v4,11/19] x86/crc32: update prototype for crc_pcl() https://git.kernel.org/jaegeuk/f2fs/c/64e3586c0b61 - [f2fs-dev,v4,12/19] x86/crc32: update prototype for crc32_pclmul_le_16() https://git.kernel.org/jaegeuk/f2fs/c/1e6b72e60a5a - [f2fs-dev,v4,13/19] x86/crc32: expose CRC32 functions through lib https://git.kernel.org/jaegeuk/f2fs/c/55d1ecceb8d6 - [f2fs-dev,v4,14/19] bcachefs: Explicitly select CRYPTO from BCACHEFS_FS https://git.kernel.org/jaegeuk/f2fs/c/cc354fa7f016 - [f2fs-dev,v4,15/19] lib/crc32: make crc32c() go directly to lib https://git.kernel.org/jaegeuk/f2fs/c/38a9a5121c3b - [f2fs-dev,v4,16/19] ext4: switch to using the crc32c library https://git.kernel.org/jaegeuk/f2fs/c/f2b4fa19647e - [f2fs-dev,v4,17/19] jbd2: switch to using the crc32c library https://git.kernel.org/jaegeuk/f2fs/c/dd348f054b24 - [f2fs-dev,v4,18/19] f2fs: switch to using the crc32 library https://git.kernel.org/jaegeuk/f2fs/c/3ca4bec40ee2 - [f2fs-dev,v4,19/19] scsi: target: iscsi: switch to using the crc32c library https://git.kernel.org/jaegeuk/f2fs/c/31e4cdde4d8b
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html