[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20231213-zswap-dstmem-v3-1-4eac09b94ece@bytedance.com>
Date: Mon, 18 Dec 2023 11:50:31 +0000
From: Chengming Zhou <zhouchengming@...edance.com>
To: Seth Jennings <sjenning@...hat.com>, Yosry Ahmed <yosryahmed@...gle.com>, Vitaly Wool <vitaly.wool@...sulko.com>,
Dan Streetman <ddstreet@...e.org>, Johannes Weiner <hannes@...xchg.org>, Chris Li <chriscli@...gle.com>,
Andrew Morton <akpm@...ux-foundation.org>, Nhat Pham <nphamcs@...il.com>
Cc: Chris Li <chrisl@...nel.org>, Yosry Ahmed <yosryahmed@...gle.com>, linux-kernel@...r.kernel.org,
Chengming Zhou <zhouchengming@...edance.com>, linux-mm@...ck.org, Nhat Pham <nphamcs@...il.com>
Subject: [PATCH v3 1/6] mm/zswap: change dstmem size to one page
Change the dstmem size from 2 * PAGE_SIZE to only one page since
we only need at most one page when compress, and the "dlen" is also
PAGE_SIZE in acomp_request_set_params(). If the output size > PAGE_SIZE
we don't wanna store the output in zswap anyway.
So change it to one page, and delete the stale comment.
There is no any history about the reason why we needed 2 pages, it has
been 2 * PAGE_SIZE since the time zswap was first merged.
According to Yosry and Nhat, one potential reason is that we used to
store a zswap header containing the swap entry in the compressed page
for writeback purposes, but we don't do that anymore.
This patch works good in kernel build testing even when the input data
doesn't compress at all (i.e. dlen == PAGE_SIZE), which we can see
from the bpftrace tool:
bpftrace -e 'k:zpool_malloc {@[(uint32)arg1==4096]=count()}'
@[1]: 2
@[0]: 12011430
Reviewed-by: Yosry Ahmed <yosryahmed@...gle.com>
Reviewed-by: Nhat Pham <nphamcs@...il.com>
Signed-off-by: Chengming Zhou <zhouchengming@...edance.com>
---
mm/zswap.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/mm/zswap.c b/mm/zswap.c
index 7ee54a3d8281..976f278aa507 100644
--- a/mm/zswap.c
+++ b/mm/zswap.c
@@ -707,7 +707,7 @@ static int zswap_dstmem_prepare(unsigned int cpu)
struct mutex *mutex;
u8 *dst;
- dst = kmalloc_node(PAGE_SIZE * 2, GFP_KERNEL, cpu_to_node(cpu));
+ dst = kmalloc_node(PAGE_SIZE, GFP_KERNEL, cpu_to_node(cpu));
if (!dst)
return -ENOMEM;
@@ -1662,8 +1662,7 @@ bool zswap_store(struct folio *folio)
sg_init_table(&input, 1);
sg_set_page(&input, page, PAGE_SIZE, 0);
- /* zswap_dstmem is of size (PAGE_SIZE * 2). Reflect same in sg_list */
- sg_init_one(&output, dst, PAGE_SIZE * 2);
+ sg_init_one(&output, dst, PAGE_SIZE);
acomp_request_set_params(acomp_ctx->req, &input, &output, PAGE_SIZE, dlen);
/*
* it maybe looks a little bit silly that we send an asynchronous request,
--
b4 0.10.1
Powered by blists - more mailing lists