summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAlexey Romanov <avromanov@sberdevices.ru>2022-11-09 14:50:42 +0300
committerAndrew Morton <akpm@linux-foundation.org>2022-12-01 02:58:52 +0300
commit7c2af309abd24ff4e313246bf9b68f398d95c871 (patch)
tree75af9d314190c3812a1ec8a7ba37b2997ef01321 /drivers
parentf24ee92cbe13242758635e654b2422dbf4912e4b (diff)
downloadlinux-7c2af309abd24ff4e313246bf9b68f398d95c871.tar.xz
zram: add size class equals check into recompression
It makes no sense for us to recompress the object if it will be in the same size class. We anyway don't get any memory gain. But, at the same time, we get a CPU time overhead when inserting this object into zspage and decompressing it afterwards. [senozhatsky: rebased and fixed conflicts] Link: https://lkml.kernel.org/r/20221109115047.2921851-9-senozhatsky@chromium.org Signed-off-by: Alexey Romanov <avromanov@sberdevices.ru> Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> Acked-by: Minchan Kim <minchan@kernel.org> Cc: Nhat Pham <nphamcs@gmail.com> Cc: Nitin Gupta <ngupta@vflare.org> Cc: Suleiman Souhlal <suleiman@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/zram/zram_drv.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 473fc5eb71a1..66659f16f6c8 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -1672,6 +1672,8 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page,
unsigned long handle_new;
unsigned int comp_len_old;
unsigned int comp_len_new;
+ unsigned int class_index_old;
+ unsigned int class_index_new;
void *src, *dst;
int ret;
@@ -1690,6 +1692,7 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page,
if (ret)
return ret;
+ class_index_old = zs_lookup_class_index(zram->mem_pool, comp_len_old);
/*
* Iterate the secondary comp algorithms list (in order of priority)
* and try to recompress the page.
@@ -1715,9 +1718,13 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page,
return ret;
}
+ class_index_new = zs_lookup_class_index(zram->mem_pool,
+ comp_len_new);
+
/* Continue until we make progress */
if (comp_len_new >= huge_class_size ||
comp_len_new >= comp_len_old ||
+ class_index_new >= class_index_old ||
(threshold && comp_len_new >= threshold)) {
zcomp_stream_put(zram->comps[prio]);
continue;
@@ -1740,7 +1747,9 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page,
* that would save memory, mark the object as incompressible so that
* we will not try to compress it again.
*/
- if (comp_len_new >= huge_class_size || comp_len_new >= comp_len_old) {
+ if (comp_len_new >= huge_class_size ||
+ comp_len_new >= comp_len_old ||
+ class_index_new >= class_index_old) {
zram_set_flag(zram, index, ZRAM_INCOMPRESSIBLE);
return 0;
}