f2fs: add sysfs support for controlling the gc_thread
Add sysfs entries to control the timing parameters for f2fs gc thread. Various Sysfs options introduced are: gc_min_sleep_time: Min Sleep time for GC in ms gc_max_sleep_time: Max Sleep time for GC in ms gc_no_gc_sleep_time: Default Sleep time for GC in ms Cc: Gu Zheng <guz.fnst@cn.fujitsu.com> Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Pankaj Kumar <pankaj.km@samsung.com> Reviewed-by: Gu Zheng <guz.fnst@cn.fujitsu.com> [Jaegeuk Kim: fix an umount bug and some minor changes] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
17
fs/f2fs/gc.c
17
fs/f2fs/gc.c
@@ -29,10 +29,11 @@ static struct kmem_cache *winode_slab;
|
||||
static int gc_thread_func(void *data)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = data;
|
||||
struct f2fs_gc_kthread *gc_th = sbi->gc_thread;
|
||||
wait_queue_head_t *wq = &sbi->gc_thread->gc_wait_queue_head;
|
||||
long wait_ms;
|
||||
|
||||
wait_ms = GC_THREAD_MIN_SLEEP_TIME;
|
||||
wait_ms = gc_th->min_sleep_time;
|
||||
|
||||
do {
|
||||
if (try_to_freeze())
|
||||
@@ -45,7 +46,7 @@ static int gc_thread_func(void *data)
|
||||
break;
|
||||
|
||||
if (sbi->sb->s_writers.frozen >= SB_FREEZE_WRITE) {
|
||||
wait_ms = GC_THREAD_MAX_SLEEP_TIME;
|
||||
wait_ms = increase_sleep_time(gc_th, wait_ms);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -66,15 +67,15 @@ static int gc_thread_func(void *data)
|
||||
continue;
|
||||
|
||||
if (!is_idle(sbi)) {
|
||||
wait_ms = increase_sleep_time(wait_ms);
|
||||
wait_ms = increase_sleep_time(gc_th, wait_ms);
|
||||
mutex_unlock(&sbi->gc_mutex);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (has_enough_invalid_blocks(sbi))
|
||||
wait_ms = decrease_sleep_time(wait_ms);
|
||||
wait_ms = decrease_sleep_time(gc_th, wait_ms);
|
||||
else
|
||||
wait_ms = increase_sleep_time(wait_ms);
|
||||
wait_ms = increase_sleep_time(gc_th, wait_ms);
|
||||
|
||||
#ifdef CONFIG_F2FS_STAT_FS
|
||||
sbi->bg_gc++;
|
||||
@@ -82,7 +83,7 @@ static int gc_thread_func(void *data)
|
||||
|
||||
/* if return value is not zero, no victim was selected */
|
||||
if (f2fs_gc(sbi))
|
||||
wait_ms = GC_THREAD_NOGC_SLEEP_TIME;
|
||||
wait_ms = gc_th->no_gc_sleep_time;
|
||||
} while (!kthread_should_stop());
|
||||
return 0;
|
||||
}
|
||||
@@ -101,6 +102,10 @@ int start_gc_thread(struct f2fs_sb_info *sbi)
|
||||
goto out;
|
||||
}
|
||||
|
||||
gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
|
||||
gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
|
||||
gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
|
||||
|
||||
sbi->gc_thread = gc_th;
|
||||
init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);
|
||||
sbi->gc_thread->f2fs_gc_task = kthread_run(gc_thread_func, sbi,
|
||||
|
||||
Reference in New Issue
Block a user