[PATCH 0/2] crypto: zstd - avoid initializing the workspace twice
From: Usama Arif
Date: Tue Aug 25 2026 - 18:08:58 EST
Both zstd_compress() and zstd_decompress() set up the shared per-CPU
workspace as a C/DStream before walking the request, and then, when the
first source and destination fragments each span the whole request, hand
off to zstd_compress_one()/zstd_decompress_one(), which immediately
overwrite that same ctx->wksp with a CCtx/DCtx. The stream setup is
discarded without a byte having been processed.
That one-shot path is not a corner case: zswap always takes it when
storing, and takes it for a load whenever the stored object lies within a
single zsmalloc page.
These two patches defer the stream initialization to the first walk
iteration that actually streams, guarded by a flag because that iteration
can be reached more than once.
A 4 KiB crypto_acomp benchmark [1], twelve runs of nine 30,000-operation
rounds. Bare metal is an Intel Xeon Platinum 8321HC, turbo off,
performance governor, pinned to one core; the VM is a one-vCPU KVM guest
on a faster host.
baseline patched delta
bare metal
compress 52,283 ns 51,038 ns 1,245 ns 2.4%
decompress 2,317 ns 1,998 ns 319 ns 13.8%
one-vCPU KVM
compress 16,675 ns 15,050 ns 1,625 ns 9.8%
decompress 3,516 ns 2,265 ns 1,251 ns 35.6%
The guest numbers are larger because the two CPUID instructions in
ZSTD_cpuid() become unconditional VM exits there.
[1] https://gist.github.com/uarif1/5cf02f0e22c23f0d1b3d84348f12914c
Usama Arif (2):
crypto: zstd - Avoid redundant cstream initialization
crypto: zstd - Avoid redundant dstream initialization
crypto/zstd.c | 40 ++++++++++++++++++++++++++++------------
1 file changed, 28 insertions(+), 12 deletions(-)
base-commit: 4b18edbd8e70f7e6860d56370f13244896d0f95c
--
2.53.0-Meta