Hi Changman, On Tue, Dec 23, 2014 at 08:37:38AM +0900, Changman Lee wrote: > f2fs has 2 gc_type; foreground gc and background gc. > In the case of foreground gc, f2fs will select victim as greedy. > Otherwise, as cost-benefit. And also it runs as greedy in SSR mode. > Until now, f2fs_gc conducted with BG_GC as default. So we couldn't > expect how it runs; BG_GC or FG_GC and GREEDY or COST_BENEFIT. What does this mean? In f2fs_gc, the gc_type will be changed accoring to the number of free sections. > Therefore sometimes it runs as BG_GC/COST_BENEFIT although gc_thread > don't put f2fs_gc to work. You mean f2fs_balance_fs? In this case, again, the gc_type will be assigned FG_GC. Why do you want to set FG_GC/GREEDY for the SSR victims? Thanks, > > Signed-off-by: Changman Lee <cm224.lee@xxxxxxxxxxx> > --- > fs/f2fs/f2fs.h | 2 +- > fs/f2fs/gc.c | 5 ++--- > fs/f2fs/segment.c | 6 +++--- > 3 files changed, 6 insertions(+), 7 deletions(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index ae6dfb6..c956535 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -1476,7 +1476,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); > 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 f2fs_inode_info *); > -int f2fs_gc(struct f2fs_sb_info *); > +int f2fs_gc(struct f2fs_sb_info *, int); > void build_gc_manager(struct f2fs_sb_info *); > int __init create_gc_caches(void); > void destroy_gc_caches(void); > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index eec0933..e1fa53a 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -80,7 +80,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)) > + if (f2fs_gc(sbi, BG_GC)) > wait_ms = gc_th->no_gc_sleep_time; > > /* balancing f2fs's metadata periodically */ > @@ -691,10 +691,9 @@ static void do_garbage_collect(struct f2fs_sb_info *sbi, unsigned int segno, > f2fs_put_page(sum_page, 1); > } > > -int f2fs_gc(struct f2fs_sb_info *sbi) > +int f2fs_gc(struct f2fs_sb_info *sbi, int gc_type) > { > unsigned int segno, i; > - int gc_type = BG_GC; > int nfree = 0; > int ret = -1; > struct cp_control cpc; > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index fd9bc96..3b32404 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -281,7 +281,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi) > */ > if (has_not_enough_free_secs(sbi, 0)) { > mutex_lock(&sbi->gc_mutex); > - f2fs_gc(sbi); > + f2fs_gc(sbi, FG_GC); > } > } > > @@ -994,12 +994,12 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) > > if (IS_NODESEG(type) || !has_not_enough_free_secs(sbi, 0)) > return v_ops->get_victim(sbi, > - &(curseg)->next_segno, BG_GC, type, SSR); > + &(curseg)->next_segno, FG_GC, type, SSR); > > /* For data segments, let's do SSR more intensively */ > for (; type >= CURSEG_HOT_DATA; type--) > if (v_ops->get_victim(sbi, &(curseg)->next_segno, > - BG_GC, type, SSR)) > + FG_GC, type, SSR)) > return 1; > return 0; > } > -- > 1.9.1 > > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming! The Go Parallel Website, > sponsored by Intel and developed in partnership with Slashdot Media, is your > hub for all things parallel software development, from weekly thought > leadership blogs to news, videos, case studies, tutorials and more. Take a > look and join the conversation now. http://goparallel.sourceforge.net > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html