All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 00/15] zram: redesign zcomp and rework backends
@ 2026-10-25  2:18 Sergey Senozhatsky
  2026-10-25  2:18 ` [PATCH v7 01/15] zram: prefix backends printk-s Sergey Senozhatsky
                   ` (15 more replies)
  0 siblings, 16 replies; 21+ messages in thread
From: Sergey Senozhatsky @ 2026-10-25  2:18 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Brian Geffon, Barry Song, Bo Zhang, Minchan Kim, Richard Chang,
	linux-kernel, linux-block, linux-mm, Sergey Senozhatsky

The series has a number of memory usage optimisations and fixes
that result in savings from double digits KB to triple digits
KB per-context/per-CPU, depending on backend and its configuration.
More details are in the corresponding commit messages.

The zcomp redesign and backend rework happen in the final five
patches.  zcomp part, basically, attempts to address the priority
inversion problem, that is seen on some setups.  In zcomp, we have
always kept Read and Write contexts together in per-CPU streams.
With preemptible zram this becomes a bit of a problem, as a higher
priority Reader can preempt a Writer, which may hold a stream
lock, but since the compression stream is locked by the preempted
Writer, the Reader gets blocked on the very same stream lock.
However, we don't have any reasons to have Read and Write contexts
share and compete for the stream, because Read (decompression) and
Write (compression) paths are completely independent, they never
touch each other's buffers.  Thus, we can split compression streams
into per-CPU Read streams and per-CPU Write streams (Barry Song),
so that Readers and Writers don't block each other anymore.
Decoupling Reads and Writes results in noticeable performance
improvements on synthetic tests.  The Reader vs Reader priority
inversion is still possible.  To attack this problem we introduce
shared decompression stream (Brian Geffon) which can be used when
decompression is stateless.  There, however, stateful backends (zstd,
deflate) that cannot have shared decompression contexts.  For those
backends, we introduce a remote CPU borrowing of idle exclusive
decompression contexts, if an exclusive Reader get preempted on
current CPU.  We also now allocate a per-request (Read) bounce
buffer for linearisation of spanning zsmalloc objects, so stateless
decompression contexts do not block each other.

Reader vs Reader priority inversion tests (fg reader, average of
3 runs):

  exclusive zstd
  Metric           Base               Patched
  ----------------------------------------------------------
  Read IOPS        391k               1,064k        (+2.7x)
  Read clat max    3,208,867 us       5,881 us      (-546x)

  shared lz4
  Metric           Base               Patched
  ----------------------------------------------------------
  Read IOPS        972k               1,466k        (+50.9%)
  Read clat max    2,204,467 us       6,442 us      (-342x)

Writer vs Reader priority inversion tests (fg reader, average of
3 runs):

  lz4
  Metric           Base               Patched
  ----------------------------------------------------------
  Read IOPS        642k               1,472k        (+2.3x)
  Read clat max    2,393,767 us       5,711 us      (-419x)

Proxy execution was brought up during v6 review, so I re-ran the
tests with CONFIG_SCHED_PROXY_EXEC=y in both kernels, 21 runs per
configuration (lz4, zstd level 3, zstd level 12).  Per-patch commit
messages have the full tables.  In short: with proxy execution base
catches up with patched on IOPS in Reader vs Reader tests, and is
still 26-28% behind in zstd Writer vs Reader tests.  What proxy
execution does not fix is the worst case: out of 126 base runs (R-vs-R
and W-vs-R combined), 108 had a read stalled for over 100 ms and 47
for over 1 s.  Patched never exceeded 8.4 ms in 126 runs.  One thing
to notice, Proxy execution is EXPERT-only option; this series doesn't
depend on it.

The final patch builds atop of decoupled Read and Write streams and
reworks the way secondary streams are handled.  Secondary compression
streams are only used from recompression, which is serialized by
device lock, IOW it's single-threaded.  However, we still allocated
secondary streams per-CPU (we needed to permit concurrent Reads
of recompressed objects).  Because we now have dedicated R/W
streams, we can allocate a singleton compression context (for
recompression) yet still have per-CPU decompression contexts.
This saves a notable amount of memory with some backends and
configurations (e.g. zstd, deflate).

v6 -> v7:
- tested against Proxy Execution, added the numbers to commit messages
- added "move mark_slot_accessed() under existing slot lock sections"
  and "remove stale WARN_ON() from zram_read_page()" patches
- updated commit messages

Sergey Senozhatsky (15):
  zram: prefix backends printk-s
  zram: remove debugfs entry on init failure
  zram: reset writeback state in zram_reset_device()
  zram: move mark_slot_accessed() under existing slot lock sections
  zram: remove stale WARN_ON() from zram_read_page()
  zram: zstd: do not allocate empty C/D-dictionaries
  zram: lz4hc: pre-initialize dictionary stream in setup_params
  zram: lz4: use LZ4_decompress_safe_usingDict()
  zram: lz4hc: use LZ4_decompress_safe_usingDict()
  zram: zstd: do not use kvzalloc() for zstd allocations
  zram: split zcomp into separate R/W streams
  zram: introduce shared decompression streams
  zram: allocate bounce buffer for spanning objects
  zram: borrow idle decompression streams in exclusive mode
  zram: use a singleton compression context for recompression

 drivers/block/zram/backend_842.c     |   6 +-
 drivers/block/zram/backend_deflate.c |  98 +++++----
 drivers/block/zram/backend_lz4.c     |  85 ++------
 drivers/block/zram/backend_lz4hc.c   | 105 ++++------
 drivers/block/zram/backend_lzo.c     |   6 +-
 drivers/block/zram/backend_lzorle.c  |   6 +-
 drivers/block/zram/backend_zstd.c    | 133 +++++++-----
 drivers/block/zram/zcomp.c           | 298 +++++++++++++++++++++++----
 drivers/block/zram/zcomp.h           |  53 ++++-
 drivers/block/zram/zram_drv.c        |  71 ++++---
 10 files changed, 546 insertions(+), 315 deletions(-)

-- 
2.56.0.257.gf7497c7d27-goog


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2026-10-30  4:13 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-25  2:18 [PATCH v7 00/15] zram: redesign zcomp and rework backends Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 01/15] zram: prefix backends printk-s Sergey Senozhatsky
2026-10-25 10:05   ` Barry Song
2026-10-25  2:18 ` [PATCH v7 02/15] zram: remove debugfs entry on init failure Sergey Senozhatsky
2026-10-25 10:09   ` Barry Song
2026-10-25  2:18 ` [PATCH v7 03/15] zram: reset writeback state in zram_reset_device() Sergey Senozhatsky
2026-10-25 20:42   ` Barry Song
2026-10-25  2:18 ` [PATCH v7 04/15] zram: move mark_slot_accessed() under existing slot lock sections Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 05/15] zram: remove stale WARN_ON() from zram_read_page() Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 06/15] zram: zstd: do not allocate empty C/D-dictionaries Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 07/15] zram: lz4hc: pre-initialize dictionary stream in setup_params Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 08/15] zram: lz4: use LZ4_decompress_safe_usingDict() Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 09/15] zram: lz4hc: " Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 10/15] zram: zstd: do not use kvzalloc() for zstd allocations Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 11/15] zram: split zcomp into separate R/W streams Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 12/15] zram: introduce shared decompression streams Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 13/15] zram: allocate bounce buffer for spanning objects Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 14/15] zram: borrow idle decompression streams in exclusive mode Sergey Senozhatsky
2026-10-25  2:18 ` [PATCH v7 15/15] zram: use a singleton compression context for recompression Sergey Senozhatsky
2026-10-30  3:02 ` [PATCH v7 00/15] zram: redesign zcomp and rework backends Andrew Morton
2026-10-30  4:13   ` Sergey Senozhatsky

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.