Currently, we allocate temp pages which is used to pad hole in
cluster during read IO submission, it may take long time before
releasing them in f2fs_decompress_pages(), since they are only
used as temp output buffer in decompression context, so let's
just do the allocation in that context to reduce time of memory
pool resource occupation.

Signed-off-by: Chao Yu <yuch...@huawei.com>
---
v2:
- fix to assign return value in error path
 fs/f2fs/compress.c | 37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
index a20c9f3272af..6e7db450006c 100644
--- a/fs/f2fs/compress.c
+++ b/fs/f2fs/compress.c
@@ -670,6 +670,7 @@ void f2fs_decompress_pages(struct bio *bio, struct page 
*page, bool verity)
        const struct f2fs_compress_ops *cops =
                        f2fs_cops[fi->i_compress_algorithm];
        int ret;
+       int i;
 
        dec_page_count(sbi, F2FS_RD_DATA);
 
@@ -688,6 +689,26 @@ void f2fs_decompress_pages(struct bio *bio, struct page 
*page, bool verity)
                goto out_free_dic;
        }
 
+       dic->tpages = f2fs_kzalloc(sbi, sizeof(struct page *) *
+                                       dic->cluster_size, GFP_NOFS);
+       if (!dic->tpages) {
+               ret = -ENOMEM;
+               goto out_free_dic;
+       }
+
+       for (i = 0; i < dic->cluster_size; i++) {
+               if (dic->rpages[i]) {
+                       dic->tpages[i] = dic->rpages[i];
+                       continue;
+               }
+
+               dic->tpages[i] = f2fs_compress_alloc_page();
+               if (!dic->tpages[i]) {
+                       ret = -ENOMEM;
+                       goto out_free_dic;
+               }
+       }
+
        if (cops->init_decompress_ctx) {
                ret = cops->init_decompress_ctx(dic);
                if (ret)
@@ -1449,22 +1470,6 @@ struct decompress_io_ctx *f2fs_alloc_dic(struct 
compress_ctx *cc)
                dic->cpages[i] = page;
        }
 
-       dic->tpages = f2fs_kzalloc(sbi, sizeof(struct page *) *
-                                       dic->cluster_size, GFP_NOFS);
-       if (!dic->tpages)
-               goto out_free;
-
-       for (i = 0; i < dic->cluster_size; i++) {
-               if (cc->rpages[i]) {
-                       dic->tpages[i] = cc->rpages[i];
-                       continue;
-               }
-
-               dic->tpages[i] = f2fs_compress_alloc_page();
-               if (!dic->tpages[i])
-                       goto out_free;
-       }
-
        return dic;
 
 out_free:
-- 
2.26.2

Reply via email to