Hi Gu,

Sorry for the delay.
Could you explain why this should be applied?

IMO, nothing was different: no removal of loops, no better code
readability, no performance improvement.
Rather than that, it seems that it'd be better that do_garbage_collect
conducts GC just for one segment.
Any opinion?

Thanks,

2013-07-12 (금), 13:51 +0800, Gu Zheng:
> Current do_garbage_collect() collect per segment per time. If there are more
> than one segments in section, we need to call do_garbage_collect() many times 
> to
> collect all the segments(current is a for loop). We can move the loop into the
> do_garbage_collect(), so that we can collect all the segs of section in one 
> time.
> 
> Signed-off-by: Gu Zheng <[email protected]>
> ---
>  fs/f2fs/gc.c |   59 ++++++++++++++++++++++++++++++++-------------------------
>  1 files changed, 33 insertions(+), 26 deletions(-)
> 
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index 35f9b1a..9589ffe 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -634,42 +634,50 @@ static int __get_victim(struct f2fs_sb_info *sbi, 
> unsigned
> int *victim,
>       return ret;
>  }
> 
> -static void do_garbage_collect(struct f2fs_sb_info *sbi, unsigned int segno,
> -                             struct list_head *ilist, int gc_type)
> +static void do_garbage_collect(struct f2fs_sb_info *sbi,
> +             unsigned int start_segno, struct list_head *ilist, int gc_type)
>  {
> -     struct page *sum_page;
> -     struct f2fs_summary_block *sum;
> -     struct blk_plug plug;
> +     unsigned int segno = start_segno;
> 
> -     /* read segment summary of victim */
> -     sum_page = get_sum_page(sbi, segno);
> -     if (IS_ERR(sum_page))
> -             return;
> +     for (; sbi->segs_per_sec--; segno++) {
> +             struct page *sum_page;
> +             struct f2fs_summary_block *sum;
> +             struct blk_plug plug;
> 
> -     blk_start_plug(&plug);
> +             /* read segment summary of victim */
> +             sum_page = get_sum_page(sbi, segno);
> +             if (IS_ERR(sum_page))
> +                     continue;
> 
> -     sum = page_address(sum_page);
> +             blk_start_plug(&plug);
> 
> -     switch (GET_SUM_TYPE((&sum->footer))) {
> -     case SUM_TYPE_NODE:
> -             gc_node_segment(sbi, sum->entries, segno, gc_type);
> -             break;
> -     case SUM_TYPE_DATA:
> -             gc_data_segment(sbi, sum->entries, ilist, segno, gc_type);
> -             break;
> -     }
> -     blk_finish_plug(&plug);
> +             sum = page_address(sum_page);
> 
> -     stat_inc_seg_count(sbi, GET_SUM_TYPE((&sum->footer)));
> -     stat_inc_call_count(sbi->stat_info);
> +             switch (GET_SUM_TYPE((&sum->footer))) {
> +             case SUM_TYPE_NODE:
> +                     gc_node_segment(sbi, sum->entries,
> +                             segno, gc_type);
> +                     break;
> +             case SUM_TYPE_DATA:
> +                     gc_data_segment(sbi, sum->entries, ilist,
> +                             segno, gc_type);
> +                     break;
> +             default:
> +                     BUG();
> +             }
> +             blk_finish_plug(&plug);
> +
> +             stat_inc_seg_count(sbi, GET_SUM_TYPE((&sum->footer)));
> +             stat_inc_call_count(sbi->stat_info);
> 
> -     f2fs_put_page(sum_page, 1);
> +             f2fs_put_page(sum_page, 1);
> +     }
>  }
> 
>  int f2fs_gc(struct f2fs_sb_info *sbi)
>  {
>       struct list_head ilist;
> -     unsigned int segno, i;
> +     unsigned int segno;
>       int gc_type = BG_GC;
>       int nfree = 0;
>       int ret = -1;
> @@ -688,8 +696,7 @@ gc_more:
>               goto stop;
>       ret = 0;
> 
> -     for (i = 0; i < sbi->segs_per_sec; i++)
> -             do_garbage_collect(sbi, segno + i, &ilist, gc_type);
> +     do_garbage_collect(sbi, segno, &ilist, gc_type);
> 
>       if (gc_type == FG_GC) {
>               sbi->cur_victim_sec = NULL_SEGNO;

-- 
Jaegeuk Kim
Samsung


------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to