f2fs: compress: delay temp page allocation
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 <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
944dd22ea4
commit
b2f57a8e6b
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue