mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
mm/zswap.c: allow handling just same-value filled pages
Zswap has an ability to efficiently store same-value filled pages, which can be turned on and off using the "same_filled_pages_enabled" parameter. However, there is currently no way to enable just this (lightweight) functionality, while not making use of the whole compressed page storage machinery. Add a "non_same_filled_pages_enabled" parameter which allows disabling handling of pages that aren't same-value filled. This way zswap can be run in such lightweight same-value filled pages only mode. Link: https://lkml.kernel.org/r/7dbafa963e8bab43608189abbe2067f4b9287831.1641247624.git.maciej.szmigiero@oracle.com Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com> Cc: Seth Jennings <sjenning@redhat.com> Cc: Dan Streetman <ddstreet@ieee.org> Cc: Vitaly Wool <vitaly.wool@konsulko.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
bd55b0c2d6
commit
cb325ddde5
2 changed files with 33 additions and 4 deletions
|
@ -130,9 +130,25 @@ attribute, e.g.::
|
||||||
echo 1 > /sys/module/zswap/parameters/same_filled_pages_enabled
|
echo 1 > /sys/module/zswap/parameters/same_filled_pages_enabled
|
||||||
|
|
||||||
When zswap same-filled page identification is disabled at runtime, it will stop
|
When zswap same-filled page identification is disabled at runtime, it will stop
|
||||||
checking for the same-value filled pages during store operation. However, the
|
checking for the same-value filled pages during store operation.
|
||||||
existing pages which are marked as same-value filled pages remain stored
|
In other words, every page will be then considered non-same-value filled.
|
||||||
unchanged in zswap until they are either loaded or invalidated.
|
However, the existing pages which are marked as same-value filled pages remain
|
||||||
|
stored unchanged in zswap until they are either loaded or invalidated.
|
||||||
|
|
||||||
|
In some circumstances it might be advantageous to make use of just the zswap
|
||||||
|
ability to efficiently store same-filled pages without enabling the whole
|
||||||
|
compressed page storage.
|
||||||
|
In this case the handling of non-same-value pages by zswap (enabled by default)
|
||||||
|
can be disabled by setting the ``non_same_filled_pages_enabled`` attribute
|
||||||
|
to 0, e.g. ``zswap.non_same_filled_pages_enabled=0``.
|
||||||
|
It can also be enabled and disabled at runtime using the sysfs
|
||||||
|
``non_same_filled_pages_enabled`` attribute, e.g.::
|
||||||
|
|
||||||
|
echo 1 > /sys/module/zswap/parameters/non_same_filled_pages_enabled
|
||||||
|
|
||||||
|
Disabling both ``zswap.same_filled_pages_enabled`` and
|
||||||
|
``zswap.non_same_filled_pages_enabled`` effectively disables accepting any new
|
||||||
|
pages by zswap.
|
||||||
|
|
||||||
To prevent zswap from shrinking pool when zswap is full and there's a high
|
To prevent zswap from shrinking pool when zswap is full and there's a high
|
||||||
pressure on swap (this will result in flipping pages in and out zswap pool
|
pressure on swap (this will result in flipping pages in and out zswap pool
|
||||||
|
|
15
mm/zswap.c
15
mm/zswap.c
|
@ -120,11 +120,19 @@ static unsigned int zswap_accept_thr_percent = 90; /* of max pool size */
|
||||||
module_param_named(accept_threshold_percent, zswap_accept_thr_percent,
|
module_param_named(accept_threshold_percent, zswap_accept_thr_percent,
|
||||||
uint, 0644);
|
uint, 0644);
|
||||||
|
|
||||||
/* Enable/disable handling same-value filled pages (enabled by default) */
|
/*
|
||||||
|
* Enable/disable handling same-value filled pages (enabled by default).
|
||||||
|
* If disabled every page is considered non-same-value filled.
|
||||||
|
*/
|
||||||
static bool zswap_same_filled_pages_enabled = true;
|
static bool zswap_same_filled_pages_enabled = true;
|
||||||
module_param_named(same_filled_pages_enabled, zswap_same_filled_pages_enabled,
|
module_param_named(same_filled_pages_enabled, zswap_same_filled_pages_enabled,
|
||||||
bool, 0644);
|
bool, 0644);
|
||||||
|
|
||||||
|
/* Enable/disable handling non-same-value filled pages (enabled by default) */
|
||||||
|
static bool zswap_non_same_filled_pages_enabled = true;
|
||||||
|
module_param_named(non_same_filled_pages_enabled, zswap_non_same_filled_pages_enabled,
|
||||||
|
bool, 0644);
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
* data structures
|
* data structures
|
||||||
**********************************/
|
**********************************/
|
||||||
|
@ -1147,6 +1155,11 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset,
|
||||||
kunmap_atomic(src);
|
kunmap_atomic(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!zswap_non_same_filled_pages_enabled) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto freepage;
|
||||||
|
}
|
||||||
|
|
||||||
/* if entry is successfully added, it keeps the reference */
|
/* if entry is successfully added, it keeps the reference */
|
||||||
entry->pool = zswap_pool_current_get();
|
entry->pool = zswap_pool_current_get();
|
||||||
if (!entry->pool) {
|
if (!entry->pool) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue