浏览代码

f2fs: fix to drop all inmem pages correctly

In commit 57864ae5ce3a ("f2fs: limit # of inmemory pages"), we have
limited memory footprint of all inmem pages with 20% of total memory,
otherwise, if we exceed the threshold, we will try to drop all inmem
pages to avoid excessive memory pressure resulting in performance
regression.

But in some unrelated error paths, we will also drop all inmem pages,
which should be wrong, fix it in this patch.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Chao Yu 8 年之前
父节点
当前提交
a2e2e76b23
共有 1 个文件被更改,包括 3 次插入2 次删除
  1. 3 2
      fs/f2fs/data.c

+ 3 - 2
fs/f2fs/data.c

@@ -2078,7 +2078,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 	struct page *page = NULL;
 	struct page *page = NULL;
 	pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT;
 	pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT;
-	bool need_balance = false;
+	bool need_balance = false, drop_atomic = false;
 	block_t blkaddr = NULL_ADDR;
 	block_t blkaddr = NULL_ADDR;
 	int err = 0;
 	int err = 0;
 
 
@@ -2087,6 +2087,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
 	if (f2fs_is_atomic_file(inode) &&
 	if (f2fs_is_atomic_file(inode) &&
 			!available_free_memory(sbi, INMEM_PAGES)) {
 			!available_free_memory(sbi, INMEM_PAGES)) {
 		err = -ENOMEM;
 		err = -ENOMEM;
+		drop_atomic = true;
 		goto fail;
 		goto fail;
 	}
 	}
 
 
@@ -2167,7 +2168,7 @@ repeat:
 fail:
 fail:
 	f2fs_put_page(page, 1);
 	f2fs_put_page(page, 1);
 	f2fs_write_failed(mapping, pos + len);
 	f2fs_write_failed(mapping, pos + len);
-	if (f2fs_is_atomic_file(inode))
+	if (drop_atomic)
 		drop_inmem_pages_all(sbi);
 		drop_inmem_pages_all(sbi);
 	return err;
 	return err;
 }
 }