f2fs: avoid BG_GC in f2fs_balance_fs
If many threads hit has_not_enough_free_secs() in f2fs_balance_fs() at the same time, all the threads would do FG_GC or BG_GC. In this critical path, we totally don't need to do BG_GC at all. Let's avoid that. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Родитель
c040ff9d69
Коммит
7702bdbe50
|
@ -2183,7 +2183,7 @@ int f2fs_migrate_page(struct address_space *, struct page *, struct page *,
|
||||||
int start_gc_thread(struct f2fs_sb_info *);
|
int start_gc_thread(struct f2fs_sb_info *);
|
||||||
void stop_gc_thread(struct f2fs_sb_info *);
|
void stop_gc_thread(struct f2fs_sb_info *);
|
||||||
block_t start_bidx_of_node(unsigned int, struct inode *);
|
block_t start_bidx_of_node(unsigned int, struct inode *);
|
||||||
int f2fs_gc(struct f2fs_sb_info *, bool);
|
int f2fs_gc(struct f2fs_sb_info *, bool, bool);
|
||||||
void build_gc_manager(struct f2fs_sb_info *);
|
void build_gc_manager(struct f2fs_sb_info *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1849,7 +1849,7 @@ static int f2fs_ioc_gc(struct file *filp, unsigned long arg)
|
||||||
mutex_lock(&sbi->gc_mutex);
|
mutex_lock(&sbi->gc_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = f2fs_gc(sbi, sync);
|
ret = f2fs_gc(sbi, sync, true);
|
||||||
out:
|
out:
|
||||||
mnt_drop_write_file(filp);
|
mnt_drop_write_file(filp);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -82,7 +82,7 @@ static int gc_thread_func(void *data)
|
||||||
stat_inc_bggc_count(sbi);
|
stat_inc_bggc_count(sbi);
|
||||||
|
|
||||||
/* if return value is not zero, no victim was selected */
|
/* if return value is not zero, no victim was selected */
|
||||||
if (f2fs_gc(sbi, test_opt(sbi, FORCE_FG_GC)))
|
if (f2fs_gc(sbi, test_opt(sbi, FORCE_FG_GC), true))
|
||||||
wait_ms = gc_th->no_gc_sleep_time;
|
wait_ms = gc_th->no_gc_sleep_time;
|
||||||
|
|
||||||
trace_f2fs_background_gc(sbi->sb, wait_ms,
|
trace_f2fs_background_gc(sbi->sb, wait_ms,
|
||||||
|
@ -909,7 +909,7 @@ next:
|
||||||
return sec_freed;
|
return sec_freed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync)
|
int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background)
|
||||||
{
|
{
|
||||||
unsigned int segno;
|
unsigned int segno;
|
||||||
int gc_type = sync ? FG_GC : BG_GC;
|
int gc_type = sync ? FG_GC : BG_GC;
|
||||||
|
@ -950,6 +950,9 @@ gc_more:
|
||||||
if (ret)
|
if (ret)
|
||||||
goto stop;
|
goto stop;
|
||||||
}
|
}
|
||||||
|
} else if (gc_type == BG_GC && !background) {
|
||||||
|
/* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
|
||||||
|
goto stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (segno == NULL_SEGNO && !__get_victim(sbi, &segno, gc_type))
|
if (segno == NULL_SEGNO && !__get_victim(sbi, &segno, gc_type))
|
||||||
|
|
|
@ -366,7 +366,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
|
||||||
*/
|
*/
|
||||||
if (has_not_enough_free_secs(sbi, 0, 0)) {
|
if (has_not_enough_free_secs(sbi, 0, 0)) {
|
||||||
mutex_lock(&sbi->gc_mutex);
|
mutex_lock(&sbi->gc_mutex);
|
||||||
f2fs_gc(sbi, false);
|
f2fs_gc(sbi, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче