On 2017/2/26 3:39, Jaegeuk Kim wrote: > On 02/25, heyunlei wrote: >> Hi all, >> >> I am really confused by the condition below use sec_freed, is it always >> equal to zero? > > Seems it is always zero. Let's fix it together. > > Pengyang, > > I merged your patches and finally got this. > How do you think? > Seems OK to me :)
Thanks, >>From d1c2206e4f245a8fedec3a8f21ad522b3b1b2d0c Mon Sep 17 00:00:00 2001 > From: Hou Pengyang <houpengy...@huawei.com> > Date: Sat, 25 Feb 2017 03:57:38 +0000 > Subject: [PATCH] f2fs: avoid bggc->fggc when enough free segments are > avaliable after cp > > We use has_not_enough_free_secs to check if there are enough free segments, > > (free_sections(sbi) + freed) <= > (node_secs + 2 * dent_secs + imeta_secs + > reserved_sections(sbi) + needed); > > Under scenario with large number of dirty nodes, these nodes would be flushed > during cp, as a result, right side of the inequality would be decreased, while > left side stays unchanged if these nodes are flushed in SSR way, which means > there are enough free segments after this cp. > > For this case, we just do a bggc instead of fggc. > > Signed-off-by: Hou Pengyang <houpengy...@huawei.com> > Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> > --- > fs/f2fs/gc.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index 1af17c5af603..471ed899f639 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -954,21 +954,22 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool > background) > goto stop; > } > > - if (gc_type == BG_GC && has_not_enough_free_secs(sbi, sec_freed, 0)) { > - gc_type = FG_GC; > + if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) { > /* > - * If there is no victim and no prefree segment but still not > - * enough free sections, we should flush dent/node blocks and do > - * garbage collections. > + * For example, if there are many prefree_segments below given > + * threshold, we can make them free by checkpoint. Then, we > + * secure free segments which doesn't need fggc any more. > */ > ret = write_checkpoint(sbi, &cpc); > 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 (has_not_enough_free_secs(sbi, 0, 0)) > + gc_type = FG_GC; > } > > + /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */ > + if (gc_type == BG_GC && !background) > + goto stop; > if (!__get_victim(sbi, &segno, gc_type)) > goto stop; > ret = 0; > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel