From: Sergey Senozhatsky <senozhatsky@chromium.org>
To: Andrew Morton <akpm@linux-foundation.org>,
Minchan Kim <minchan@kernel.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Sergey Senozhatsky <senozhatsky@chromium.org>
Subject: [PATCHv2 0/9] zram: preemptible writes and occasionally preemptible reads
Date: Mon, 27 Jan 2025 16:29:11 +0900 [thread overview]
Message-ID: <20250127072932.1289973-1-senozhatsky@chromium.org> (raw)
This is Part I (aka Episode IV), which only changes zram and seems
like a good start. More work needs to be done, outside of zram, in
order to make reads() preemptible in a non-occasional manner. That
work will be carried out independently.
There are more details in the commit messages, but in short:
Currently zram runs compression and decompression in non-preemptible
sections, e.g.
zcomp_stream_get() // grabs CPU local lock
zcomp_compress()
or
zram_slot_lock() // grabs entry spin-lock
zcomp_stream_get() // grabs CPU local lock
zs_map_object() // grabs rwlock and CPU local lock
zcomp_decompress()
Potentially a little troublesome for a number of reasons.
For instance, this makes it impossible to use async compression
algorithms or/and H/W compression algorithms, which can wait for OP
completion or resource availability. This also restricts what
compression algorithms can do internally, for example, zstd can
allocate internal state memory for C/D dictionaries:
do_fsync()
do_writepages()
zram_bio_write()
zram_write_page() // become non-preemptible
zcomp_compress()
zstd_compress()
ZSTD_compress_usingCDict()
ZSTD_compressBegin_usingCDict_internal()
ZSTD_resetCCtx_usingCDict()
ZSTD_resetCCtx_internal()
zstd_custom_alloc() // memory allocation
Not to mention that the system can be configured to maximize
compression ratio at a cost of CPU/HW time (e.g. lz4hc or deflate
with very high compression level) so zram can stay in non-preemptible
section (even under spin-lock or/and rwlock) for an extended period
of time. Aside from compression algorithms, this also restricts what
zram can do. One particular example is zram_write_page() zsmalloc
handle allocation, which has an optimistic allocation (disallowing
direct reclaim) and a pessimistic fallback path, which then forces
zram to compress the page one more time.
This series changes zram to not directly impose atomicity restrictions
on compression algorithms (and on itself), which makes zram write()
fully preemptible; zram read(), sadly, is not always preemptible. There
are still indirect atomicity restrictions imposed by zsmalloc(). Changing
zsmalloc to permit preemption under zs_map_object() is a separate effort
(Part II) and will be posted shortly.
v1 -> v2:
-- reworked slot entry: using atomic_t instead of bucket rwsem locks
-- some cleanups (e.g. removal of max_comp_streams which has been
deprecated since 2016)
Sergey Senozhatsky (9):
zram: switch to non-atomic entry locking
zram: do not use per-CPU compression streams
zram: remove crypto include
zram: remove max_comp_streams device attr
zram: remove two-staged handle allocation
zram: permit reclaim in zstd custom allocator
zram: permit reclaim in recompression handle allocation
zram: remove writestall zram_stats member
zram: unlock slot during recompression
Documentation/ABI/testing/sysfs-block-zram | 8 -
Documentation/admin-guide/blockdev/zram.rst | 36 +--
drivers/block/zram/backend_zstd.c | 11 +-
drivers/block/zram/zcomp.c | 165 ++++++-----
drivers/block/zram/zcomp.h | 17 +-
drivers/block/zram/zram_drv.c | 310 ++++++++++----------
drivers/block/zram/zram_drv.h | 9 +-
include/linux/cpuhotplug.h | 1 -
8 files changed, 266 insertions(+), 291 deletions(-)
--
2.48.1.262.g85cc9f2d1e-goog
next reply other threads:[~2025-01-27 7:29 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-27 7:29 Sergey Senozhatsky [this message]
2025-01-27 7:29 ` [PATCHv2 1/9] zram: switch to non-atomic entry locking Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 2/9] zram: do not use per-CPU compression streams Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 3/9] zram: remove crypto include Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 4/9] zram: remove max_comp_streams device attr Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 5/9] zram: remove two-staged handle allocation Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 6/9] zram: permit reclaim in zstd custom allocator Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 7/9] zram: permit reclaim in recompression handle allocation Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 8/9] zram: remove writestall zram_stats member Sergey Senozhatsky
2025-01-27 7:29 ` [PATCHv2 9/9] zram: unlock slot during recompression Sergey Senozhatsky
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=20250127072932.1289973-1-senozhatsky@chromium.org \
--to=senozhatsky@chromium.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox