Commit eb61c2cc authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: fix to account cp stats correctly

cp_foreground_calls sysfs entry shows total CP call count rather than
foreground CP call count, fix it.

Fixes: fc7100ea ("f2fs: Add f2fs stats to sysfs")
Signed-off-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 9bf1dcbd
...@@ -1701,9 +1701,9 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) ...@@ -1701,9 +1701,9 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
} }
f2fs_restore_inmem_curseg(sbi); f2fs_restore_inmem_curseg(sbi);
stat_inc_cp_count(sbi);
stop: stop:
unblock_operations(sbi); unblock_operations(sbi);
stat_inc_cp_count(sbi->stat_info);
if (cpc->reason & CP_RECOVERY) if (cpc->reason & CP_RECOVERY)
f2fs_notice(sbi, "checkpoint: version = %llx", ckpt_ver); f2fs_notice(sbi, "checkpoint: version = %llx", ckpt_ver);
......
...@@ -215,6 +215,9 @@ static void update_general_status(struct f2fs_sb_info *sbi) ...@@ -215,6 +215,9 @@ static void update_general_status(struct f2fs_sb_info *sbi)
si->valid_blks[type] += blks; si->valid_blks[type] += blks;
} }
for (i = 0; i < MAX_CALL_TYPE; i++)
si->cp_call_count[i] = atomic_read(&sbi->cp_call_count[i]);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
si->segment_count[i] = sbi->segment_count[i]; si->segment_count[i] = sbi->segment_count[i];
si->block_count[i] = sbi->block_count[i]; si->block_count[i] = sbi->block_count[i];
...@@ -497,7 +500,9 @@ static int stat_show(struct seq_file *s, void *v) ...@@ -497,7 +500,9 @@ static int stat_show(struct seq_file *s, void *v)
seq_printf(s, " - Prefree: %d\n - Free: %d (%d)\n\n", seq_printf(s, " - Prefree: %d\n - Free: %d (%d)\n\n",
si->prefree_count, si->free_segs, si->free_secs); si->prefree_count, si->free_segs, si->free_secs);
seq_printf(s, "CP calls: %d (BG: %d)\n", seq_printf(s, "CP calls: %d (BG: %d)\n",
si->cp_count, si->bg_cp_count); si->cp_call_count[TOTAL_CALL],
si->cp_call_count[BACKGROUND]);
seq_printf(s, "CP count: %d\n", si->cp_count);
seq_printf(s, " - cp blocks : %u\n", si->meta_count[META_CP]); seq_printf(s, " - cp blocks : %u\n", si->meta_count[META_CP]);
seq_printf(s, " - sit blocks : %u\n", seq_printf(s, " - sit blocks : %u\n",
si->meta_count[META_SIT]); si->meta_count[META_SIT]);
...@@ -699,6 +704,8 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi) ...@@ -699,6 +704,8 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi)
atomic_set(&sbi->inplace_count, 0); atomic_set(&sbi->inplace_count, 0);
for (i = META_CP; i < META_MAX; i++) for (i = META_CP; i < META_MAX; i++)
atomic_set(&sbi->meta_count[i], 0); atomic_set(&sbi->meta_count[i], 0);
for (i = 0; i < MAX_CALL_TYPE; i++)
atomic_set(&sbi->cp_call_count[i], 0);
atomic_set(&sbi->max_aw_cnt, 0); atomic_set(&sbi->max_aw_cnt, 0);
......
...@@ -1383,6 +1383,13 @@ enum errors_option { ...@@ -1383,6 +1383,13 @@ enum errors_option {
MOUNT_ERRORS_PANIC, /* panic on errors */ MOUNT_ERRORS_PANIC, /* panic on errors */
}; };
enum {
BACKGROUND,
FOREGROUND,
MAX_CALL_TYPE,
TOTAL_CALL = FOREGROUND,
};
static inline int f2fs_test_bit(unsigned int nr, char *addr); static inline int f2fs_test_bit(unsigned int nr, char *addr);
static inline void f2fs_set_bit(unsigned int nr, char *addr); static inline void f2fs_set_bit(unsigned int nr, char *addr);
static inline void f2fs_clear_bit(unsigned int nr, char *addr); static inline void f2fs_clear_bit(unsigned int nr, char *addr);
...@@ -1695,6 +1702,7 @@ struct f2fs_sb_info { ...@@ -1695,6 +1702,7 @@ struct f2fs_sb_info {
unsigned int io_skip_bggc; /* skip background gc for in-flight IO */ unsigned int io_skip_bggc; /* skip background gc for in-flight IO */
unsigned int other_skip_bggc; /* skip background gc for other reasons */ unsigned int other_skip_bggc; /* skip background gc for other reasons */
unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */ unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */
atomic_t cp_call_count[MAX_CALL_TYPE]; /* # of cp call */
#endif #endif
spinlock_t stat_lock; /* lock for stat operations */ spinlock_t stat_lock; /* lock for stat operations */
...@@ -3860,12 +3868,6 @@ void f2fs_destroy_recovery_cache(void); ...@@ -3860,12 +3868,6 @@ void f2fs_destroy_recovery_cache(void);
/* /*
* debug.c * debug.c
*/ */
enum {
BACKGROUND,
FOREGROUND,
MAX_CALL_TYPE
};
#ifdef CONFIG_F2FS_STAT_FS #ifdef CONFIG_F2FS_STAT_FS
struct f2fs_stat_info { struct f2fs_stat_info {
struct list_head stat_list; struct list_head stat_list;
...@@ -3912,7 +3914,7 @@ struct f2fs_stat_info { ...@@ -3912,7 +3914,7 @@ struct f2fs_stat_info {
int dirty_count, node_pages, meta_pages, compress_pages; int dirty_count, node_pages, meta_pages, compress_pages;
int compress_page_hit; int compress_page_hit;
int prefree_count, free_segs, free_secs; int prefree_count, free_segs, free_secs;
int cp_count, bg_cp_count; int cp_call_count[MAX_CALL_TYPE], cp_count;
int gc_call_count[MAX_CALL_TYPE]; int gc_call_count[MAX_CALL_TYPE];
int gc_segs[2][2]; int gc_segs[2][2];
int gc_secs[2][2]; int gc_secs[2][2];
...@@ -3937,8 +3939,9 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) ...@@ -3937,8 +3939,9 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi)
return (struct f2fs_stat_info *)sbi->stat_info; return (struct f2fs_stat_info *)sbi->stat_info;
} }
#define stat_inc_cp_count(si) ((si)->cp_count++) #define stat_inc_cp_call_count(sbi, foreground) \
#define stat_inc_bg_cp_count(si) ((si)->bg_cp_count++) atomic_inc(&sbi->cp_call_count[(foreground)])
#define stat_inc_cp_count(si) (F2FS_STAT(sbi)->cp_count++)
#define stat_io_skip_bggc_count(sbi) ((sbi)->io_skip_bggc++) #define stat_io_skip_bggc_count(sbi) ((sbi)->io_skip_bggc++)
#define stat_other_skip_bggc_count(sbi) ((sbi)->other_skip_bggc++) #define stat_other_skip_bggc_count(sbi) ((sbi)->other_skip_bggc++)
#define stat_inc_dirty_inode(sbi, type) ((sbi)->ndirty_inode[type]++) #define stat_inc_dirty_inode(sbi, type) ((sbi)->ndirty_inode[type]++)
...@@ -4055,8 +4058,8 @@ void __init f2fs_create_root_stats(void); ...@@ -4055,8 +4058,8 @@ void __init f2fs_create_root_stats(void);
void f2fs_destroy_root_stats(void); void f2fs_destroy_root_stats(void);
void f2fs_update_sit_info(struct f2fs_sb_info *sbi); void f2fs_update_sit_info(struct f2fs_sb_info *sbi);
#else #else
#define stat_inc_cp_count(si) do { } while (0) #define stat_inc_cp_call_count(sbi, foreground) do { } while (0)
#define stat_inc_bg_cp_count(si) do { } while (0) #define stat_inc_cp_count(sbi) do { } while (0)
#define stat_io_skip_bggc_count(sbi) do { } while (0) #define stat_io_skip_bggc_count(sbi) do { } while (0)
#define stat_other_skip_bggc_count(sbi) do { } while (0) #define stat_other_skip_bggc_count(sbi) do { } while (0)
#define stat_inc_dirty_inode(sbi, type) do { } while (0) #define stat_inc_dirty_inode(sbi, type) do { } while (0)
......
...@@ -1840,6 +1840,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control) ...@@ -1840,6 +1840,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
* secure free segments which doesn't need fggc any more. * secure free segments which doesn't need fggc any more.
*/ */
if (prefree_segments(sbi)) { if (prefree_segments(sbi)) {
stat_inc_cp_call_count(sbi, TOTAL_CALL);
ret = f2fs_write_checkpoint(sbi, &cpc); ret = f2fs_write_checkpoint(sbi, &cpc);
if (ret) if (ret)
goto stop; goto stop;
...@@ -1888,6 +1889,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control) ...@@ -1888,6 +1889,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
round++; round++;
if (skipped_round > MAX_SKIP_GC_COUNT && if (skipped_round > MAX_SKIP_GC_COUNT &&
skipped_round * 2 >= round) { skipped_round * 2 >= round) {
stat_inc_cp_call_count(sbi, TOTAL_CALL);
ret = f2fs_write_checkpoint(sbi, &cpc); ret = f2fs_write_checkpoint(sbi, &cpc);
goto stop; goto stop;
} }
...@@ -1903,6 +1905,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control) ...@@ -1903,6 +1905,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, struct f2fs_gc_control *gc_control)
*/ */
if (free_sections(sbi) <= upper_secs + NR_GC_CHECKPOINT_SECS && if (free_sections(sbi) <= upper_secs + NR_GC_CHECKPOINT_SECS &&
prefree_segments(sbi)) { prefree_segments(sbi)) {
stat_inc_cp_call_count(sbi, TOTAL_CALL);
ret = f2fs_write_checkpoint(sbi, &cpc); ret = f2fs_write_checkpoint(sbi, &cpc);
if (ret) if (ret)
goto stop; goto stop;
...@@ -2030,6 +2033,7 @@ static int free_segment_range(struct f2fs_sb_info *sbi, ...@@ -2030,6 +2033,7 @@ static int free_segment_range(struct f2fs_sb_info *sbi,
if (gc_only) if (gc_only)
goto out; goto out;
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
if (err) if (err)
goto out; goto out;
...@@ -2222,6 +2226,7 @@ int f2fs_resize_fs(struct file *filp, __u64 block_count) ...@@ -2222,6 +2226,7 @@ int f2fs_resize_fs(struct file *filp, __u64 block_count)
clear_sbi_flag(sbi, SBI_IS_RESIZEFS); clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
set_sbi_flag(sbi, SBI_IS_DIRTY); set_sbi_flag(sbi, SBI_IS_DIRTY);
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
if (err) { if (err) {
update_fs_metadata(sbi, secs); update_fs_metadata(sbi, secs);
......
...@@ -924,6 +924,7 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) ...@@ -924,6 +924,7 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
struct cp_control cpc = { struct cp_control cpc = {
.reason = CP_RECOVERY, .reason = CP_RECOVERY,
}; };
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
} }
} }
......
...@@ -513,8 +513,8 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg) ...@@ -513,8 +513,8 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg)
mutex_unlock(&sbi->flush_lock); mutex_unlock(&sbi->flush_lock);
} }
stat_inc_cp_call_count(sbi, BACKGROUND);
f2fs_sync_fs(sbi->sb, 1); f2fs_sync_fs(sbi->sb, 1);
stat_inc_bg_cp_count(sbi->stat_info);
} }
static int __submit_flush_wait(struct f2fs_sb_info *sbi, static int __submit_flush_wait(struct f2fs_sb_info *sbi,
...@@ -3248,6 +3248,7 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) ...@@ -3248,6 +3248,7 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range)
goto out; goto out;
f2fs_down_write(&sbi->gc_lock); f2fs_down_write(&sbi->gc_lock);
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
f2fs_up_write(&sbi->gc_lock); f2fs_up_write(&sbi->gc_lock);
if (err) if (err)
......
...@@ -1601,6 +1601,7 @@ static void f2fs_put_super(struct super_block *sb) ...@@ -1601,6 +1601,7 @@ static void f2fs_put_super(struct super_block *sb)
struct cp_control cpc = { struct cp_control cpc = {
.reason = CP_UMOUNT, .reason = CP_UMOUNT,
}; };
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
} }
...@@ -1610,6 +1611,7 @@ static void f2fs_put_super(struct super_block *sb) ...@@ -1610,6 +1611,7 @@ static void f2fs_put_super(struct super_block *sb)
struct cp_control cpc = { struct cp_control cpc = {
.reason = CP_UMOUNT | CP_TRIMMED, .reason = CP_UMOUNT | CP_TRIMMED,
}; };
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
} }
...@@ -1706,8 +1708,10 @@ int f2fs_sync_fs(struct super_block *sb, int sync) ...@@ -1706,8 +1708,10 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
return -EAGAIN; return -EAGAIN;
if (sync) if (sync) {
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_issue_checkpoint(sbi); err = f2fs_issue_checkpoint(sbi);
}
return err; return err;
} }
...@@ -2232,6 +2236,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi) ...@@ -2232,6 +2236,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
f2fs_down_write(&sbi->gc_lock); f2fs_down_write(&sbi->gc_lock);
cpc.reason = CP_PAUSE; cpc.reason = CP_PAUSE;
set_sbi_flag(sbi, SBI_CP_DISABLED); set_sbi_flag(sbi, SBI_CP_DISABLED);
stat_inc_cp_call_count(sbi, TOTAL_CALL);
err = f2fs_write_checkpoint(sbi, &cpc); err = f2fs_write_checkpoint(sbi, &cpc);
if (err) if (err)
goto out_unlock; goto out_unlock;
...@@ -4868,6 +4873,7 @@ static void kill_f2fs_super(struct super_block *sb) ...@@ -4868,6 +4873,7 @@ static void kill_f2fs_super(struct super_block *sb)
struct cp_control cpc = { struct cp_control cpc = {
.reason = CP_UMOUNT, .reason = CP_UMOUNT,
}; };
stat_inc_cp_call_count(sbi, TOTAL_CALL);
f2fs_write_checkpoint(sbi, &cpc); f2fs_write_checkpoint(sbi, &cpc);
} }
......
...@@ -356,6 +356,16 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a, ...@@ -356,6 +356,16 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a,
if (!strcmp(a->attr.name, "revoked_atomic_block")) if (!strcmp(a->attr.name, "revoked_atomic_block"))
return sysfs_emit(buf, "%llu\n", sbi->revoked_atomic_block); return sysfs_emit(buf, "%llu\n", sbi->revoked_atomic_block);
#ifdef CONFIG_F2FS_STAT_FS
if (!strcmp(a->attr.name, "cp_foreground_calls"))
return sysfs_emit(buf, "%d\n",
atomic_read(&sbi->cp_call_count[TOTAL_CALL]) -
atomic_read(&sbi->cp_call_count[BACKGROUND]));
if (!strcmp(a->attr.name, "cp_background_calls"))
return sysfs_emit(buf, "%d\n",
atomic_read(&sbi->cp_call_count[BACKGROUND]));
#endif
ui = (unsigned int *)(ptr + a->offset); ui = (unsigned int *)(ptr + a->offset);
return sysfs_emit(buf, "%u\n", *ui); return sysfs_emit(buf, "%u\n", *ui);
...@@ -972,8 +982,8 @@ F2FS_SBI_GENERAL_RO_ATTR(unusable_blocks_per_sec); ...@@ -972,8 +982,8 @@ F2FS_SBI_GENERAL_RO_ATTR(unusable_blocks_per_sec);
/* STAT_INFO ATTR */ /* STAT_INFO ATTR */
#ifdef CONFIG_F2FS_STAT_FS #ifdef CONFIG_F2FS_STAT_FS
STAT_INFO_RO_ATTR(cp_foreground_calls, cp_count); STAT_INFO_RO_ATTR(cp_foreground_calls, cp_call_count[FOREGROUND]);
STAT_INFO_RO_ATTR(cp_background_calls, bg_cp_count); STAT_INFO_RO_ATTR(cp_background_calls, cp_call_count[BACKGROUND]);
STAT_INFO_RO_ATTR(gc_foreground_calls, gc_call_count[FOREGROUND]); STAT_INFO_RO_ATTR(gc_foreground_calls, gc_call_count[FOREGROUND]);
STAT_INFO_RO_ATTR(gc_background_calls, gc_call_count[BACKGROUND]); STAT_INFO_RO_ATTR(gc_background_calls, gc_call_count[BACKGROUND]);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment