From: Usama Arif <usama.arif@linux.dev>
To: Andrew Morton <akpm@linux-foundation.org>,
chengming.zhou@linux.dev, dsterba@suse.com, hannes@cmpxchg.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
nphamcs@gmail.com, terrelln@fb.com, yosry@kernel.org,
riel@surriel.com, shakeel.butt@linux.dev, alex@ghiti.fr,
senozhatsky@chromium.org,
Herbert Xu <herbert@gondor.apana.org.au>,
davem@davemloft.net, linux-crypto@vger.kernel.org,
kernel-team@meta.com
Cc: Usama Arif <usama.arif@linux.dev>
Subject: [PATCH v2 0/2] mm: zswap: reduce request contention on loads
Date: Fri, 9 Oct 2026 09:30:29 -0700 [thread overview]
Message-ID: <20261009163146.83112-1-usama.arif@linux.dev> (raw)
Stores and loads share a per-CPU acomp request and mutex. A low-priority
store can be preempted right after the compressor drops its stream
lock, while it still holds the zswap mutex, and a higher-priority load
on that CPU then waits for the store to run again. This follows the work
from Sergey Senozhatsky's zram series which splits it for the same
reason [1].
Patch 1 gives compression and decompression separate requests, waits
and mutexes, so loads no longer wait for stores, though they can still
wait for each other. Patch 2 decompresses with an on-stack request when
the algorithm is synchronous and needs no request context, which covers
all in-tree software compressors, so those loads take no zswap lock.
Asynchronous algorithms keep the per-CPU request and mutex. For software
compressors the series allocates the same number of requests as before;
each per-CPU context grows by 72 bytes, and the load path is about 270
bytes deeper on x86-64.
The series does not fix two related cases:
- Stores still serialize on the compression mutex, so a high-priority
task that reclaims (direct reclaim, MADV_PAGEOUT) can still wait for
a preempted store.
- On PREEMPT_RT the codec stream locks are preemptible, so a load can
still wait for a preempted store inside the codec.
The numbers below are the slowest read per run, as a median (min-max)
of 5 runs. Each run is 12 seconds in a zstd VM with lazy preemption,
vm.page-cluster=0 and swap on /dev/ram0. With 1 vCPU, four nice +10
workers page memory out and read it back while a nice 0 task spins. A
nice -19 reader pages out its own buffer and measures how long each
read of it takes. With 8 vCPUs there are 16 workers, 8 spinning tasks
and 8 readers.
Before series (ms) With series (ms)
1 vCPU 22.3 (21.6-22.6) 0.97 (0.72-1.4)
8 vCPUs 314 (97-2542) 7.0 (5.0-98)
Reads over 10 ms fell from 26-35 per run to none with 1 vCPU, and from
3-18 per run to at most one with 8 vCPUs. The benchmark and test programs
were written with the help of an LLM.
[1] https://lore.kernel.org/all/20261005122036.718976-10-senozhatsky@chromium.org/
v1 -> v2:
- Group the compression request and output buffer in zswap_comp_ctx,
documenting that the compression mutex protects the buffer (Yosry).
- Move the existing synchronous and request context size checks into
the Crypto API helper acomp_can_use_stack_req() (Yosry).
- Share callback setup through zswap_set_acomp_req_callback() and explain
the two decompression paths (Yosry).
- Clarify in patch 1's commit message that codecs and drivers synchronize
shared transform state internally (Yosry).
- Add Nhat Pham's Acked-by on patch 2.
Usama Arif (2):
mm: zswap: use separate compression and decompression requests
mm: zswap: use stack requests for synchronous decompression
include/crypto/acompress.h | 13 +++
mm/zswap.c | 161 ++++++++++++++++++++++++-------------
2 files changed, 119 insertions(+), 55 deletions(-)
--
2.53.0-Meta
next reply other threads:[~2026-10-09 16:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 16:30 Usama Arif [this message]
2026-10-09 16:30 ` [PATCH v2 1/2] mm: zswap: use separate compression and decompression requests Usama Arif
2026-10-10 10:14 ` Nhat Pham
2026-10-13 0:21 ` Kanchana P. Sridhar
2026-10-13 9:28 ` Herbert Xu
2026-10-09 16:30 ` [PATCH v2 2/2] mm: zswap: use stack requests for synchronous decompression Usama Arif
2026-10-13 9:44 ` [PATCH] crypto: acomp - Enforce MAX_SYNC_COMP_REQSIZE in init_tfm Herbert Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261009163146.83112-1-usama.arif@linux.dev \
--to=usama.arif@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=alex@ghiti.fr \
--cc=chengming.zhou@linux.dev \
--cc=davem@davemloft.net \
--cc=dsterba@suse.com \
--cc=hannes@cmpxchg.org \
--cc=herbert@gondor.apana.org.au \
--cc=kernel-team@meta.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=riel@surriel.com \
--cc=senozhatsky@chromium.org \
--cc=shakeel.butt@linux.dev \
--cc=terrelln@fb.com \
--cc=yosry@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.