From: Yosry Ahmed <yosry@kernel.org>
To: "Kanchana P. Sridhar" <kanchanapsridhar2026@gmail.com>
Cc: hannes@cmpxchg.org, nphamcs@gmail.com, chengming.zhou@linux.dev,
akpm@linux-foundation.org, linux-mm@kvack.org,
herbert@gondor.apana.org.au, davem@davemloft.net,
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
rientjes@google.com, willy@infradead.org,
senozhatsky@chromium.org
Subject: Re: [PATCH v2 0/8] Batched zswap_store() framework with compression batching
Date: Thu, 29 Oct 2026 19:12:21 +0000 [thread overview]
Message-ID: <auOZBtRqQGzFcbAT@google.com> (raw)
In-Reply-To: <20261028030503.17923-1-kanchanapsridhar2026@gmail.com>
On Tue, Oct 27, 2026 at 08:04:55PM -0700, Kanchana P. Sridhar wrote:
>
> v2: Batched zswap_store() framework with compression batching
> =============================================================
>
> This series is a spin-off of "v14: zswap compression batching with optimized
> iaa_crypto driver" [1], and focuses on the generic crypto_acomp and zswap
> compression batching enablers. Resuming work on this series following a gap
> since v14 (January 2026). Please note that my email address and affiliation have
> changed from kanchana.p.sridhar@intel.com to kanchanapsridhar2026@gmail.com. I
> have retained the original Intel sign-offs on prior patches for historical
> attribution while signing off v2 of this series with my current address.
>
> The main focus of v2 was to establish a reliable and accurate performance
> measurement methodology, that addressed the problems with variation in v1. This
> is accomplished and used to validate v2, by reducing usemem to 2 processes and
> enabling PMD THP. As the data shows, we get exactly the same "2048kB-zswpout"
> counts in the baseline and with this series.
>
> To summarize the main contribution of this patch series: Batching is introduced
> in zswap_store() of large folios: we carve out a large folio into batches of
> ZSWAP_MAX_BATCH_SIZE (8 pages) for software compressors, and store each
> batch. Moving the fundamental operations that need to be happen to store a page
> to now work at the granularity of a batch offers opportunities to optimize them
> from these perspectives:
>
> 1) Utilize existing kernel API that minimize obtaining locks for bulk
> operations, e.g. kmem_cache_alloc_bulk()/kmem_cache_free_bulk().
>
> 2) We keep the working set for each of the core store functionalities
> (alloc/initialize zswap entries, compress pages, store pages in zsmalloc,
> pool/objcg reference increments, objcg charging) to be focused on a
> batch, thereby minimizing cache evictions and benefiting from cache
> locality.
>
> 3) Along the lines of (1), the main zswap_compress() batching routine obtains
> the comp_ctx mutex lock once per batch, and releases it after it has
> processed all pages in that batch.
>
> 4) Any zswap store functionality that works on a batch can potentially be
> optimized via bulk-processing/parallelized as a next step, to further improve
> performance.
>
> Performance data: usemem with 56% over-commit:
> ==============================================
> Validation was done with mm-unstable as of 10-25-2026 (Baseline) and with this
> patch series. To minimize variation in the data, I made these changes to my
> performance measurement methodology:
>
> 1) Reduced the number of usemem processes to 2. Each process tried to allocate
> 2400M, in a 3G cgroup memory.high budget, effectively accomplishing a 56.25%
> over-commit.
>
> 2) Increased the runtime of the workload to ~9 minutes by enabling PMD THP,
> i.e., 2048kB mTHP folios.
>
> 3) The use of PMD THP forces zswap_store()/zswap_compress() latency to be in the
> critical path, and thus enables very reliable measurements with bpftrace.
>
> 4) I used lhist() instead of hist() in bpftrace to gather latencies at a finer
> level of granularity and accuracy.
>
> Testing was done on a Chromebook with a QEMU "vng" VM running in Crostini.
>
> Chromebook Diagnostics reports:
> Intel(R) Core(TM) Ultra 5 115U (10 CPUs, 4.200GHz)
> RAM: 16GB
>
> vng setup:
> Memory: 7G
> Swap: 3G
> Pinned CPUs: 2 (E-Cores: 2,3)
>
> zswap compressor:
> ZSTD
>
> mTHP enabled:
> 2048kB (PMD THP)
>
> I used the help of an LLM to write the bpftrace data post-processing scripts
> that generate latency percentiles.
>
> vm-scalability/usemem setup:
>
> cgroup memory.high: 3G
> 2 usemem processes, each allocates 2400M anonymous memory, reads the
> Silesia dataset [2] from a pre-fork-allocated buffer into the 2400M,
> writes to each unsigned long in the 2400M, sleeps for 10 sec, then
> frees the memory and exits.
>
> usemem -w --read-silesia -O -b 1 -s 10 -n 2 2400M
>
> usemem metrics are reported from a single run after starting the QEMU VM.
> Further, I have tabulated the bpftrace p50/p95/p99 latencies with these labels:
>
> "zswap_store_higher_order":
> zswap_store() of PMD folios.
>
> "zswap_store_order_0":
> zswap_store() of order-0 folios.
>
> "zswap_batch_compress_per_page":
> zswap_compress() per-page latency of store batches generated from PMD
> folios.
>
> "zswap_single_compress_per_page":
> zswap_compress() per-page latency of order-0 folios.
>
>
> ----------------------------------------------------------------------------
> usemem Baseline zswap zswap Change with
> PMD THP mm-unstable store compress compress
> 10-25-2026 batching batching batching
> (patch 6) (patch 8) %
> ----------------------------------------------------------------------------
> usemem process 1 6,353 7,240 7,428
> Throughput (KB/s)
>
> usemem process 2 6,352 7,236 7,422
> Throughput (KB/s)
>
> Average Throughput (KB/s) 6,353 7,238 7,425 17%
> ----------------------------------------------------------------------------
> usemem process 1 484,580 308,903 257,230
> Time to free memory (usecs)
>
> usemem process 2 518,928 438,585 446,958
> Time to free memory (usecs)
>
> Average Time to 501,754 373,744 352,094 -30%
> Free Memory (usecs)
> -------------------------------------------------------------------------------
>
> -------------------------------------------------------------------------------
> usemem Baseline zswap zswap Change
> PMD THP mm-unstable store compress with
> BPFTRACE 10-25-2026 batching batching compress
> (patch 6) (patch 8) batching
> (ns)
> -------------------------------------------------------------------------------
> zswap_batch_compress_per_page (ns):
> p50 40,086 1,569
> p95 54,689 -64,505
> p99 83,248 -88,488
> -------------------------------------------------------------------------------
> zswap_single_compress_per_page (ns):
> p50 38,517 38,352 36,650 -1,867
> p95 119,194 121,174 133,678 14,484
> p99 171,736 158,601 169,010 -2,726
> -------------------------------------------------------------------------------
> zswap_store_higher_order (ns):
> p50 21,012,222 21,322,885 20,176,667 -835,556
> p95 25,643,500 26,204,375 24,485,000 -1,158,500
> p99 28,567,400 38,577,750 26,158,000 -2,409,400
> -------------------------------------------------------------------------------
> zswap_store_order_0 (ns):
> p50 37,601 36,994 37,568 -33
> p95 123,731 137,034 128,366 4,635
> p99 159,965 169,282 175,618 15,653
> -------------------------------------------------------------------------------
> vmstat summary:
> -------------------------------------------------------------------------------
> zswpin 1,104,226 993,412 1,091,146
> zswpout 1,688,181 1,582,664 1,669,671
> 2048kB-alloc 2,500 2,505 2,500
> 2048kB-zswpout 1,535 1,535 1,535
> 2048kB-swpout-fallback 927 929 875
> -------------------------------------------------------------------------------
>
> Detailed vmstat & zswap stats after workload finishes:
> ======================================================
>
> ------------------------------------------------------
> usemem Baseline zswap
> PMD THP mm-unstable compress
> 10-25-2026 batching
> (patch 8)
>
> ------------------------------------------------------
> vmstat:
> ------------------------------------------------------
> pswpin 0 0
> pswpout 0 0
> thp_swpout 0 0
> thp_swpout_fallback 927 875
> swpin_zero 0 0
> swpout_zero 0 0
> zswpin 1,104,226 1,091,146
> zswpout 1,688,181 1,669,671
> zswpwb 0 0
> nrswpin 0 0
> nrswpout 0 0
> pgmajfault 173,554 173,774
> nr_free_pages 1,753,879 1,755,195
> nr_free_pages_blocks 1,651,712 1,667,072
> 2048kB-alloc 2,500 2,500
> 2048kB-zswpout 1,535 1,535
> 2048kB-swpout 0 0
> 2048kB-swpout-fallback 927 875
> 2048kB-swpin 0 0
> memory.current 352,256 499,712
> memory.swap.current 0 0
> ------------------------------------------------------
> zswap stats:
> ------------------------------------------------------
> pool_limit_hit 0 0
> written_back_pages 0 0
> reject_alloc_fail 0 0
> reject_kmemcache_fail 0 0
> reject_reclaim_fail 0 0
> reject_compress_fail 0 0
> reject_compress_poor 0 0
> decompress_fail 0 0
> stored_incompressible_pages 0 0
> stored_pages 0 0
> pool_total_size 0 0
> ------------------------------------------------------
As mentioned in the previous version, I cannot reproduce these results,
mainly because the noise is too high. Digging a bit deeper, it's because
the throttling from memory.high varies. Hacking in a change to make
calculate_high_delay() always return 0 (no memory.high stalls) paints a
clearer picture about throughput improvements from the series up to
patch 6 and patch 8. With that, I see 1-2% improvement in throughput
with patch 6, and almost no improvement with patch 8 on top. Similarly,
for zswap store latency for high-order folios, I see a slight (~1-2%)
improvement with patch 6, but almost none with patch 8 on top.
In order to make meaningful progress, can you send patches 5-6
separately? I assume that 1-4 are prep for 7-8, so 5-6 are standalone. I
also think patch 6 will be simplified if we drop the prep work for
patches 7-8?
Also, PTAL at Sashiko reviews before respinning.
next prev parent reply other threads:[~2026-10-29 19:12 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 3:04 [PATCH v2 0/8] Batched zswap_store() framework with compression batching Kanchana P. Sridhar
2026-10-28 3:04 ` [PATCH v2 1/8] crypto: acomp - Define a unit_size in struct acomp_req to enable batching. mm: zswap: Set the unit size for zswap to PAGE_SIZE Kanchana P. Sridhar
2026-10-28 3:04 ` [PATCH v2 2/8] crypto: acomp - Add bit to indicate segmentation support Kanchana P. Sridhar
2026-10-28 3:04 ` [PATCH v2 3/8] crypto: acomp - Add trivial segmentation wrapper Kanchana P. Sridhar
2026-10-29 3:05 ` sashiko-bot
2026-10-29 5:09 ` Kanchana P. Sridhar
2026-10-29 5:38 ` Herbert Xu
2026-10-29 6:03 ` Kanchana P. Sridhar
2026-10-29 8:22 ` Herbert Xu
2026-10-29 18:11 ` Kanchana P. Sridhar
2026-10-28 3:04 ` [PATCH v2 4/8] crypto: acomp - Add API to get a compression algorithm's batch-size Kanchana P. Sridhar
2026-10-29 3:06 ` sashiko-bot
2026-10-29 5:49 ` Kanchana P. Sridhar
2026-10-28 3:05 ` [PATCH v2 5/8] mm: zswap: Store the folio's node id in the zswap_entry Kanchana P. Sridhar
2026-10-29 3:06 ` sashiko-bot
2026-10-29 23:00 ` Kanchana P. Sridhar
2026-10-29 23:09 ` Yosry Ahmed
2026-10-28 3:05 ` [PATCH v2 6/8] mm: zswap: Store large folios in batches Kanchana P. Sridhar
2026-10-29 3:06 ` sashiko-bot
2026-10-28 3:05 ` [PATCH v2 7/8] mm: zswap: Batched zswap_compress() for storing " Kanchana P. Sridhar
2026-10-29 3:06 ` sashiko-bot
2026-10-28 3:05 ` [PATCH v2 8/8] mm: zswap: Refactor and optimize zswap_store_pages() batch operations Kanchana P. Sridhar
2026-10-29 3:06 ` sashiko-bot
2026-10-29 19:12 ` Yosry Ahmed [this message]
2026-10-29 21:09 ` [PATCH v2 0/8] Batched zswap_store() framework with compression batching Kanchana P. Sridhar
2026-10-29 22:31 ` Yosry Ahmed
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=auOZBtRqQGzFcbAT@google.com \
--to=yosry@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=chengming.zhou@linux.dev \
--cc=davem@davemloft.net \
--cc=hannes@cmpxchg.org \
--cc=herbert@gondor.apana.org.au \
--cc=kanchanapsridhar2026@gmail.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=nphamcs@gmail.com \
--cc=rientjes@google.com \
--cc=senozhatsky@chromium.org \
--cc=willy@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox