f2fs: add stat info for moved blocks by background gc
authorChangman Lee <cm224.lee@samsung.com>
Mon, 22 Dec 2014 23:37:39 +0000 (08:37 +0900)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 10 Apr 2015 22:08:32 +0000 (15:08 -0700)
This patch is for looking into gc performance of f2fs in detail.

Signed-off-by: Changman Lee <cm224.lee@samsung.com>
[Jaegeuk Kim: fix build errors]
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/debug.c
fs/f2fs/f2fs.h
fs/f2fs/gc.c

index 1006290ed6b89d5d4f19831115270f17d02581d4..f5388f37217e089cf89edf2513760cfdc034b3cf 100644 (file)
@@ -265,11 +265,16 @@ static int stat_show(struct seq_file *s, void *v)
                seq_printf(s, "CP calls: %d\n", si->cp_count);
                seq_printf(s, "GC calls: %d (BG: %d)\n",
                           si->call_count, si->bg_gc);
-               seq_printf(s, "  - data segments : %d\n", si->data_segs);
-               seq_printf(s, "  - node segments : %d\n", si->node_segs);
-               seq_printf(s, "Try to move %d blocks\n", si->tot_blks);
-               seq_printf(s, "  - data blocks : %d\n", si->data_blks);
-               seq_printf(s, "  - node blocks : %d\n", si->node_blks);
+               seq_printf(s, "  - data segments : %d (%d)\n",
+                               si->data_segs, si->bg_data_segs);
+               seq_printf(s, "  - node segments : %d (%d)\n",
+                               si->node_segs, si->bg_node_segs);
+               seq_printf(s, "Try to move %d blocks (BG: %d)\n", si->tot_blks,
+                               si->bg_data_blks + si->bg_node_blks);
+               seq_printf(s, "  - data blocks : %d (%d)\n", si->data_blks,
+                               si->bg_data_blks);
+               seq_printf(s, "  - node blocks : %d (%d)\n", si->node_blks,
+                               si->bg_node_blks);
                seq_printf(s, "\nExtent Hit Ratio: %d / %d\n",
                           si->hit_ext, si->total_ext);
                seq_printf(s, "\nExtent Tree Count: %d\n", si->ext_tree);
index 7ced71b69f33a68e82fe3dfcd6370342be9c9a63..ca7da046437987140701a332f2fe6621575f13b5 100644 (file)
@@ -1634,7 +1634,9 @@ struct f2fs_stat_info {
        int dirty_count, node_pages, meta_pages;
        int prefree_count, call_count, cp_count;
        int tot_segs, node_segs, data_segs, free_segs, free_secs;
+       int bg_node_segs, bg_data_segs;
        int tot_blks, data_blks, node_blks;
+       int bg_data_blks, bg_node_blks;
        int curseg[NR_CURSEG_TYPE];
        int cursec[NR_CURSEG_TYPE];
        int curzone[NR_CURSEG_TYPE];
@@ -1683,31 +1685,36 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi)
                ((sbi)->block_count[(curseg)->alloc_type]++)
 #define stat_inc_inplace_blocks(sbi)                                   \
                (atomic_inc(&(sbi)->inplace_count))
-#define stat_inc_seg_count(sbi, type)                                  \
+#define stat_inc_seg_count(sbi, type, gc_type)                         \
        do {                                                            \
                struct f2fs_stat_info *si = F2FS_STAT(sbi);             \
                (si)->tot_segs++;                                       \
-               if (type == SUM_TYPE_DATA)                              \
+               if (type == SUM_TYPE_DATA) {                            \
                        si->data_segs++;                                \
-               else                                                    \
+                       si->bg_data_segs += (gc_type == BG_GC) ? 1 : 0; \
+               } else {                                                \
                        si->node_segs++;                                \
+                       si->bg_node_segs += (gc_type == BG_GC) ? 1 : 0; \
+               }                                                       \
        } while (0)
 
 #define stat_inc_tot_blk_count(si, blks)                               \
        (si->tot_blks += (blks))
 
-#define stat_inc_data_blk_count(sbi, blks)                             \
+#define stat_inc_data_blk_count(sbi, blks, gc_type)                    \
        do {                                                            \
                struct f2fs_stat_info *si = F2FS_STAT(sbi);             \
                stat_inc_tot_blk_count(si, blks);                       \
                si->data_blks += (blks);                                \
+               si->bg_data_blks += (gc_type == BG_GC) ? (blks) : 0;    \
        } while (0)
 
-#define stat_inc_node_blk_count(sbi, blks)                             \
+#define stat_inc_node_blk_count(sbi, blks, gc_type)                    \
        do {                                                            \
                struct f2fs_stat_info *si = F2FS_STAT(sbi);             \
                stat_inc_tot_blk_count(si, blks);                       \
                si->node_blks += (blks);                                \
+               si->bg_node_blks += (gc_type == BG_GC) ? (blks) : 0;    \
        } while (0)
 
 int f2fs_build_stats(struct f2fs_sb_info *);
@@ -1729,10 +1736,10 @@ void f2fs_destroy_root_stats(void);
 #define stat_inc_seg_type(sbi, curseg)
 #define stat_inc_block_count(sbi, curseg)
 #define stat_inc_inplace_blocks(sbi)
-#define stat_inc_seg_count(si, type)
+#define stat_inc_seg_count(sbi, type, gc_type)
 #define stat_inc_tot_blk_count(si, blks)
-#define stat_inc_data_blk_count(si, blks)
-#define stat_inc_node_blk_count(sbi, blks)
+#define stat_inc_data_blk_count(sbi, blks, gc_type)
+#define stat_inc_node_blk_count(sbi, blks, gc_type)
 
 static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
 static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
index 76adbc3641f1534ead6151b06dd8257219f7911e..ed58211fe79b45f1a980a35e54d500815b0c6704 100644 (file)
@@ -435,7 +435,7 @@ next_step:
                                set_page_dirty(node_page);
                }
                f2fs_put_page(node_page, 1);
-               stat_inc_node_blk_count(sbi, 1);
+               stat_inc_node_blk_count(sbi, 1, gc_type);
        }
 
        if (initial) {
@@ -622,7 +622,7 @@ next_step:
                        if (IS_ERR(data_page))
                                continue;
                        move_data_page(inode, data_page, gc_type);
-                       stat_inc_data_blk_count(sbi, 1);
+                       stat_inc_data_blk_count(sbi, 1, gc_type);
                }
        }
 
@@ -680,7 +680,7 @@ static void do_garbage_collect(struct f2fs_sb_info *sbi, unsigned int segno,
        }
        blk_finish_plug(&plug);
 
-       stat_inc_seg_count(sbi, GET_SUM_TYPE((&sum->footer)));
+       stat_inc_seg_count(sbi, GET_SUM_TYPE((&sum->footer)), gc_type);
        stat_inc_call_count(sbi->stat_info);
 
        f2fs_put_page(sum_page, 1);