Re: [PATCH 0/2] crypto: zstd - avoid initializing the workspace twice
From: Yosry Ahmed
Date: Tue Aug 25 2026 - 18:27:47 EST
On Tue, Aug 25, 2026 at 3:06 PM Usama Arif <usama.arif@xxxxxxxxx> wrote:
>
> 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%
Nice!
>
> The guest numbers are larger because the two CPUID instructions in
> ZSTD_cpuid() become unconditional VM exits there.
I wonder how much benefit we get from just doing CPUID once in
ZSTD_cpuid() and cache the results. There might still be value in
avoiding the overall initialization, but I think ZSTD_cpuid() should
only be executing CPUID once anyway (e.g. in case it's called in other
paths)?
>
> [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
>