summaryrefslogtreecommitdiffstats
path: root/drivers/block/zram/zram_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/zram/zram_drv.c')
-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;
}