Commit e6d5e789 authored by Daeho Jeong's avatar Daeho Jeong Committed by Jaegeuk Kim
Browse files

f2fs: ignore valid ratio when free section count is low



Otherwise F2FS will not do GC in background in low free section.

Signed-off-by: default avatarDaeho Jeong <daehojeong@google.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent f0a7adfe
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -384,14 +384,15 @@ static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, unsigned int segno)
}

static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
			unsigned int segno, struct victim_sel_policy *p)
			unsigned int segno, struct victim_sel_policy *p,
			unsigned int valid_thresh_ratio)
{
	if (p->alloc_mode == SSR)
		return get_seg_entry(sbi, segno)->ckpt_valid_blocks;

	if (p->one_time_gc && (get_valid_blocks(sbi, segno, true) >=
		CAP_BLKS_PER_SEC(sbi) * sbi->gc_thread->valid_thresh_ratio /
		100))
	if (p->one_time_gc && (valid_thresh_ratio < 100) &&
			(get_valid_blocks(sbi, segno, true) >=
			CAP_BLKS_PER_SEC(sbi) * valid_thresh_ratio / 100))
		return UINT_MAX;

	/* alloc_mode == LFS */
@@ -772,6 +773,7 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
	unsigned int secno, last_victim;
	unsigned int last_segment;
	unsigned int nsearched;
	unsigned int valid_thresh_ratio = 100;
	bool is_atgc;
	int ret = 0;

@@ -781,7 +783,11 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
	p.alloc_mode = alloc_mode;
	p.age = age;
	p.age_threshold = sbi->am.age_threshold;
	if (one_time) {
		p.one_time_gc = one_time;
		if (has_enough_free_secs(sbi, 0, NR_PERSISTENT_LOG))
			valid_thresh_ratio = sbi->gc_thread->valid_thresh_ratio;
	}

retry:
	select_policy(sbi, gc_type, type, &p);
@@ -907,7 +913,7 @@ int f2fs_get_victim(struct f2fs_sb_info *sbi, unsigned int *result,
			goto next;
		}

		cost = get_gc_cost(sbi, segno, &p);
		cost = get_gc_cost(sbi, segno, &p, valid_thresh_ratio);

		if (p.min_cost > cost) {
			p.min_segno = segno;