[PATCH 0/2] arm64: csum: Add fused copy and Internet checksum
From: Demian Shulhan
Date: Sun Sep 27 2026 - 09:20:20 EST
arm64 currently uses the generic csum_partial_copy_nocheck(), which
performs memcpy() followed by a second pass for csum_partial(). This
double pass exerts unnecessary pressure on the L1 cache.
Replace it with a single-pass implementation. The new implementation
provides a general-purpose register path for short buffers and atomic
contexts, and a kernel-mode NEON path for lengths >= 1024 bytes.
Measured in-kernel on an Ampere Altra (Neoverse-N1):
- Scalar path: 1.2x-1.6x faster for lengths < 1024 bytes.
- NEON path: 1.2x faster at 1024 bytes, scaling up to 1.6x-1.8x at
4096 bytes.
On Apple M-series cores, gains are 1.3-1.7x below 1024 bytes and
1.6-2.4x above. No length or alignment regresses on either
microarchitecture.
Patch 1 implements the fused routines and the dispatcher.
Patch 2 adds KUnit test coverage for the new API and internal paths.
Tested: in-kernel benchmark module on Neoverse-N1 with both
implementations cross-checked (0 mismatches); KUnit suite under QEMU
(with/without KASAN, with PREEMPT_RT), exhaustive and random userspace
testing of both routines against a naive reference with PROT_NONE guard
pages, gcc 13 and clang 18 W=1 builds, checkpatch --strict.
Demian Shulhan (2):
arm64: csum: Add fused copy and Internet checksum
lib/tests: checksum: Add KUnit tests for csum_partial_copy_nocheck()
arch/arm64/include/asm/checksum.h | 3 +
arch/arm64/lib/Makefile | 7 +-
arch/arm64/lib/csum-copy-neon.c | 168 +++++++++++
arch/arm64/lib/csum-copy.c | 108 +++++++
arch/arm64/lib/csum-copy.h | 84 ++++++
arch/arm64/lib/csum.c | 54 ++++
lib/Kconfig.debug | 10 +
lib/tests/checksum_kunit.c | 463 ++++++++++++++++++++++++++++++
8 files changed, 896 insertions(+), 1 deletion(-)
create mode 100644 arch/arm64/lib/csum-copy-neon.c
create mode 100644 arch/arm64/lib/csum-copy.c
create mode 100644 arch/arm64/lib/csum-copy.h
base-commit: 93f51579e7df248780214094418f205253383cc5
--
2.43.0