f2fs: avoid BG_GC in f2fs_balance_fs
authorJaegeuk Kim <jaegeuk@kernel.org>
Tue, 15 Nov 2016 01:38:35 +0000 (17:38 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 25 Nov 2016 18:15:57 +0000 (10:15 -0800)
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>
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/gc.c
fs/f2fs/segment.c

index a1dcc60ae946e42b2243b03ebece06dd4b209818..c963fa8d6895a5a571bb040a5d92bb769208b8c2 100644 (file)
@@ -2183,7 +2183,7 @@ int f2fs_migrate_page(struct address_space *, struct page *, struct page *,
 int start_gc_thread(struct f2fs_sb_info *);
 void stop_gc_thread(struct f2fs_sb_info *);
 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 *);
 
 /*
index 39616de92a557491c8cda11c0c302ca99e2afedd..9ea89ca8fd0b9347c5f5e5d5a196cbf916547e7d 100644 (file)
@@ -1849,7 +1849,7 @@ static int f2fs_ioc_gc(struct file *filp, unsigned long arg)
                mutex_lock(&sbi->gc_mutex);
        }
 
-       ret = f2fs_gc(sbi, sync);
+       ret = f2fs_gc(sbi, sync, true);
 out:
        mnt_drop_write_file(filp);
        return ret;
index a7b2c13404f8db30638f24c333e7531cfbe3c4a3..36f6cfc613d34991cc42ec3f964ea0800d1b0881 100644 (file)
@@ -82,7 +82,7 @@ static int gc_thread_func(void *data)
                stat_inc_bggc_count(sbi);
 
                /* 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;
 
                trace_f2fs_background_gc(sbi->sb, wait_ms,
@@ -909,7 +909,7 @@ next:
        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;
        int gc_type = sync ? FG_GC : BG_GC;
@@ -950,6 +950,9 @@ gc_more:
                        if (ret)
                                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))
index 1869bc3973d52c5237f5017ea1f5d4efa6280229..20eedf0eb751498b7dee88280a8caa14c0826faa 100644 (file)
@@ -366,7 +366,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
         */
        if (has_not_enough_free_secs(sbi, 0, 0)) {
                mutex_lock(&sbi->gc_mutex);
-               f2fs_gc(sbi, false);
+               f2fs_gc(sbi, false, false);
        }
 }