f2fs: don't trigger data flush in foreground operation
Data flush can generate heavy IO and cause long latency during flush, so it's not appropriate to trigger it in foreground operation. And also, we may face below potential deadlock during data flush: - f2fs_write_multi_pages - f2fs_write_raw_pages - f2fs_write_single_data_page - f2fs_balance_fs - f2fs_balance_fs_bg - f2fs_sync_dirty_inodes - filemap_fdatawrite -- stuck on flush same cluster Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
62f63eea29
commit
7bcd0cfa73
|
@ -3236,7 +3236,7 @@ void f2fs_drop_inmem_pages(struct inode *inode);
|
|||
void f2fs_drop_inmem_page(struct inode *inode, struct page *page);
|
||||
int f2fs_commit_inmem_pages(struct inode *inode);
|
||||
void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need);
|
||||
void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi);
|
||||
void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg);
|
||||
int f2fs_issue_flush(struct f2fs_sb_info *sbi, nid_t ino);
|
||||
int f2fs_create_flush_cmd_control(struct f2fs_sb_info *sbi);
|
||||
int f2fs_flush_device_cache(struct f2fs_sb_info *sbi);
|
||||
|
|
|
@ -113,7 +113,7 @@ do_gc:
|
|||
prefree_segments(sbi), free_segments(sbi));
|
||||
|
||||
/* balancing f2fs's metadata periodically */
|
||||
f2fs_balance_fs_bg(sbi);
|
||||
f2fs_balance_fs_bg(sbi, true);
|
||||
next:
|
||||
sb_end_write(sbi->sb);
|
||||
|
||||
|
|
|
@ -1976,7 +1976,7 @@ static int f2fs_write_node_pages(struct address_space *mapping,
|
|||
goto skip_write;
|
||||
|
||||
/* balancing f2fs's metadata in background */
|
||||
f2fs_balance_fs_bg(sbi);
|
||||
f2fs_balance_fs_bg(sbi, true);
|
||||
|
||||
/* collect a number of dirty node pages and write together */
|
||||
if (wbc->sync_mode != WB_SYNC_ALL &&
|
||||
|
|
|
@ -496,7 +496,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
|
|||
|
||||
/* balance_fs_bg is able to be pending */
|
||||
if (need && excess_cached_nats(sbi))
|
||||
f2fs_balance_fs_bg(sbi);
|
||||
f2fs_balance_fs_bg(sbi, false);
|
||||
|
||||
if (!f2fs_is_checkpoint_ready(sbi))
|
||||
return;
|
||||
|
@ -511,7 +511,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
|
|||
}
|
||||
}
|
||||
|
||||
void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
|
||||
void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg)
|
||||
{
|
||||
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
|
||||
return;
|
||||
|
@ -540,7 +540,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
|
|||
excess_dirty_nats(sbi) ||
|
||||
excess_dirty_nodes(sbi) ||
|
||||
f2fs_time_over(sbi, CP_TIME)) {
|
||||
if (test_opt(sbi, DATA_FLUSH)) {
|
||||
if (test_opt(sbi, DATA_FLUSH) && from_bg) {
|
||||
struct blk_plug plug;
|
||||
|
||||
mutex_lock(&sbi->flush_lock);
|
||||
|
|
Loading…
Reference in New Issue