Message ID | 20231213-zswap-dstmem-v2-1-daa5d9ae41a7@bytedance.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/zswap: dstmem reuse optimizations and cleanups | expand |
Acked-by: Chris Li <chrisl@kernel.org> (Google) Chris On Mon, Dec 18, 2023 at 12:22 AM Chengming Zhou <zhouchengming@bytedance.com> wrote: > > 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@google.com> > Reviewed-by: Nhat Pham <nphamcs@gmail.com> > Signed-off-by: Chengming Zhou <zhouchengming@bytedance.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
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,