Sergey Senozhatsky
6a559ecd6e
zram: add dictionary support to zstd backend
...
This adds support for pre-trained zstd dictionaries [1] Dictionary is
setup in params once (per-comp) and loaded to Cctx and Dctx by reference,
so we don't allocate extra memory.
TEST
====
*** zstd
/sys/block/zram0/mm_stat
1750654976 504565092 514203648 0 514203648 1 0 34204 34204
*** zstd dict=/etc/zstd-dict-amd64
/sys/block/zram0/mm_stat
1750638592 465851259 475373568 0 475373568 1 0 34185 34185
*** zstd level=8 dict=/etc/zstd-dict-amd64
/sys/block/zram0/mm_stat
1750642688 430765171 439955456 0 439955456 1 0 34185 34185
[1] https://github.com/facebook/zstd/blob/dev/programs/zstd.1.md#dictionary-builder
Link: https://lkml.kernel.org/r/20240902105656.1383858-23-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:11 -07:00
Sergey Senozhatsky
b8f03cb703
zram: move immutable comp params away from per-CPU context
...
Immutable params never change once comp has been allocated and setup, so
we don't need to store multiple copies of them in each per-CPU backend
context. Move those to per-comp zcomp_params and pass it to backends
callbacks for requests execution. Basically, this means parameters
sharing between different contexts.
Also introduce two new backends callbacks: setup_params() and
release_params(). First, we need to validate params in a driver-specific
way; second, driver may want to allocate its specific representation of
the params which is needed to execute requests.
Link: https://lkml.kernel.org/r/20240902105656.1383858-20-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:10 -07:00
Sergey Senozhatsky
6a81bdfeb3
zram: introduce zcomp_ctx structure
...
Keep run-time driver data (scratch buffers, etc.) in zcomp_ctx structure.
This structure is allocated per-CPU because drivers (backends) need to
modify its content during requests execution.
We will split mutable and immutable driver data, this is a preparation
path.
Link: https://lkml.kernel.org/r/20240902105656.1383858-19-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:10 -07:00
Sergey Senozhatsky
52c7b4e2ba
zram: introduce zcomp_req structure
...
Encapsulate compression/decompression data in zcomp_req structure.
Link: https://lkml.kernel.org/r/20240902105656.1383858-18-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:10 -07:00
Sergey Senozhatsky
eb826a0190
zram: recalculate zstd compression params once
...
zstd compression params depends on level, but are constant for a given
instance of zstd compression backend. Calculate once (during ctx
creation).
Link: https://lkml.kernel.org/r/20240902105656.1383858-15-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:09 -07:00
Sergey Senozhatsky
f2bac7ad18
zram: introduce zcomp_params structure
...
We will store a per-algorithm parameters there (compression level,
dictionary, dictionary size, etc.).
Link: https://lkml.kernel.org/r/20240902105656.1383858-14-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:09 -07:00
Sergey Senozhatsky
dbf2763cec
zram: pass estimated src size hint to zstd
...
zram works with PAGE_SIZE buffers, so we always know exact size of the
source buffer and hence can pass estimated_src_size to zstd_get_params().
This hint on x86_64, for example, reduces the size of the work memory
buffer from 1303520 bytes down to 90080 bytes. Given that compression
streams are per-CPU that's quite some memory saving.
Link: https://lkml.kernel.org/r/20240902105656.1383858-10-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:08 -07:00
Sergey Senozhatsky
73e7d81abb
zram: add zstd compression backend support
...
Add s/w zstd compression.
Link: https://lkml.kernel.org/r/20240902105656.1383858-9-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org >
Cc: Minchan Kim <minchan@kernel.org >
Cc: Nick Terrell <terrelln@fb.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
2024-09-09 16:39:08 -07:00