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

Reply via email to