f2fs: add stat info for moved blocks by background gc
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>
This commit is contained in:
parent
b28c3f9493
commit
e1235983e3
@ -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, "CP calls: %d\n", si->cp_count);
|
||||||
seq_printf(s, "GC calls: %d (BG: %d)\n",
|
seq_printf(s, "GC calls: %d (BG: %d)\n",
|
||||||
si->call_count, si->bg_gc);
|
si->call_count, si->bg_gc);
|
||||||
seq_printf(s, " - data segments : %d\n", si->data_segs);
|
seq_printf(s, " - data segments : %d (%d)\n",
|
||||||
seq_printf(s, " - node segments : %d\n", si->node_segs);
|
si->data_segs, si->bg_data_segs);
|
||||||
seq_printf(s, "Try to move %d blocks\n", si->tot_blks);
|
seq_printf(s, " - node segments : %d (%d)\n",
|
||||||
seq_printf(s, " - data blocks : %d\n", si->data_blks);
|
si->node_segs, si->bg_node_segs);
|
||||||
seq_printf(s, " - node blocks : %d\n", si->node_blks);
|
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",
|
seq_printf(s, "\nExtent Hit Ratio: %d / %d\n",
|
||||||
si->hit_ext, si->total_ext);
|
si->hit_ext, si->total_ext);
|
||||||
seq_printf(s, "\nExtent Tree Count: %d\n", si->ext_tree);
|
seq_printf(s, "\nExtent Tree Count: %d\n", si->ext_tree);
|
||||||
|
@ -1634,7 +1634,9 @@ struct f2fs_stat_info {
|
|||||||
int dirty_count, node_pages, meta_pages;
|
int dirty_count, node_pages, meta_pages;
|
||||||
int prefree_count, call_count, cp_count;
|
int prefree_count, call_count, cp_count;
|
||||||
int tot_segs, node_segs, data_segs, free_segs, free_secs;
|
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 tot_blks, data_blks, node_blks;
|
||||||
|
int bg_data_blks, bg_node_blks;
|
||||||
int curseg[NR_CURSEG_TYPE];
|
int curseg[NR_CURSEG_TYPE];
|
||||||
int cursec[NR_CURSEG_TYPE];
|
int cursec[NR_CURSEG_TYPE];
|
||||||
int curzone[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]++)
|
((sbi)->block_count[(curseg)->alloc_type]++)
|
||||||
#define stat_inc_inplace_blocks(sbi) \
|
#define stat_inc_inplace_blocks(sbi) \
|
||||||
(atomic_inc(&(sbi)->inplace_count))
|
(atomic_inc(&(sbi)->inplace_count))
|
||||||
#define stat_inc_seg_count(sbi, type) \
|
#define stat_inc_seg_count(sbi, type, gc_type) \
|
||||||
do { \
|
do { \
|
||||||
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
||||||
(si)->tot_segs++; \
|
(si)->tot_segs++; \
|
||||||
if (type == SUM_TYPE_DATA) \
|
if (type == SUM_TYPE_DATA) { \
|
||||||
si->data_segs++; \
|
si->data_segs++; \
|
||||||
else \
|
si->bg_data_segs += (gc_type == BG_GC) ? 1 : 0; \
|
||||||
|
} else { \
|
||||||
si->node_segs++; \
|
si->node_segs++; \
|
||||||
|
si->bg_node_segs += (gc_type == BG_GC) ? 1 : 0; \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define stat_inc_tot_blk_count(si, blks) \
|
#define stat_inc_tot_blk_count(si, blks) \
|
||||||
(si->tot_blks += (blks))
|
(si->tot_blks += (blks))
|
||||||
|
|
||||||
#define stat_inc_data_blk_count(sbi, blks) \
|
#define stat_inc_data_blk_count(sbi, blks, gc_type) \
|
||||||
do { \
|
do { \
|
||||||
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
||||||
stat_inc_tot_blk_count(si, blks); \
|
stat_inc_tot_blk_count(si, blks); \
|
||||||
si->data_blks += (blks); \
|
si->data_blks += (blks); \
|
||||||
|
si->bg_data_blks += (gc_type == BG_GC) ? (blks) : 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define stat_inc_node_blk_count(sbi, blks) \
|
#define stat_inc_node_blk_count(sbi, blks, gc_type) \
|
||||||
do { \
|
do { \
|
||||||
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
|
||||||
stat_inc_tot_blk_count(si, blks); \
|
stat_inc_tot_blk_count(si, blks); \
|
||||||
si->node_blks += (blks); \
|
si->node_blks += (blks); \
|
||||||
|
si->bg_node_blks += (gc_type == BG_GC) ? (blks) : 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
int f2fs_build_stats(struct f2fs_sb_info *);
|
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_seg_type(sbi, curseg)
|
||||||
#define stat_inc_block_count(sbi, curseg)
|
#define stat_inc_block_count(sbi, curseg)
|
||||||
#define stat_inc_inplace_blocks(sbi)
|
#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_tot_blk_count(si, blks)
|
||||||
#define stat_inc_data_blk_count(si, blks)
|
#define stat_inc_data_blk_count(sbi, blks, gc_type)
|
||||||
#define stat_inc_node_blk_count(sbi, blks)
|
#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 int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
|
||||||
static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
|
static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
|
||||||
|
@ -435,7 +435,7 @@ next_step:
|
|||||||
set_page_dirty(node_page);
|
set_page_dirty(node_page);
|
||||||
}
|
}
|
||||||
f2fs_put_page(node_page, 1);
|
f2fs_put_page(node_page, 1);
|
||||||
stat_inc_node_blk_count(sbi, 1);
|
stat_inc_node_blk_count(sbi, 1, gc_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initial) {
|
if (initial) {
|
||||||
@ -622,7 +622,7 @@ next_step:
|
|||||||
if (IS_ERR(data_page))
|
if (IS_ERR(data_page))
|
||||||
continue;
|
continue;
|
||||||
move_data_page(inode, data_page, gc_type);
|
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);
|
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);
|
stat_inc_call_count(sbi->stat_info);
|
||||||
|
|
||||||
f2fs_put_page(sum_page, 1);
|
f2fs_put_page(sum_page, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user