Commit 19f4e688 authored by Hou Pengyang's avatar Hou Pengyang Committed by Jaegeuk Kim

f2fs: avoid bggc->fggc when enough free segments are avaliable after cp

We use has_not_enough_free_secs to check if there are enough free segments,

    	(free_sections(sbi) + freed) <=
	        (node_secs + 2 * dent_secs + imeta_secs +
			         reserved_sections(sbi) + needed);

Under scenario with large number of dirty nodes, these nodes would be flushed
during cp, as a result, right side of the inequality would be decreased, while
left side stays unchanged if these nodes are flushed in SSR way, which means
there are enough free segments after this cp.

For this case, we just do a bggc instead of fggc.
Signed-off-by: default avatarHou Pengyang <houpengyang@huawei.com>
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent d27c3d89
...@@ -953,21 +953,22 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background) ...@@ -953,21 +953,22 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background)
goto stop; goto stop;
} }
if (gc_type == BG_GC && has_not_enough_free_secs(sbi, sec_freed, 0)) { if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) {
gc_type = FG_GC;
/* /*
* If there is no victim and no prefree segment but still not * For example, if there are many prefree_segments below given
* enough free sections, we should flush dent/node blocks and do * threshold, we can make them free by checkpoint. Then, we
* garbage collections. * secure free segments which doesn't need fggc any more.
*/ */
ret = write_checkpoint(sbi, &cpc); ret = write_checkpoint(sbi, &cpc);
if (ret) if (ret)
goto stop; goto stop;
} else if (gc_type == BG_GC && !background) { if (has_not_enough_free_secs(sbi, 0, 0))
/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */ gc_type = FG_GC;
goto stop;
} }
/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
if (gc_type == BG_GC && !background)
goto stop;
if (!__get_victim(sbi, &segno, gc_type)) if (!__get_victim(sbi, &segno, gc_type))
goto stop; goto stop;
ret = 0; ret = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment