Skip to content

Commit 2c4e5c2

Browse files
Jaegeuk Kimpundiramit
authored andcommitted
f2fs: show the max number of atomic operations
commit 26a28a0c1eb756ba18bfb1f93309c4b4406b9cd9 upstream. This patch adds to show the max number of atomic operations which are conducting concurrently. Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent d595df2 commit 2c4e5c2

4 files changed

Lines changed: 31 additions & 2 deletions

File tree

fs/f2fs/debug.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ static void update_general_status(struct f2fs_sb_info *sbi)
5050
si->ndirty_files = sbi->ndirty_inode[FILE_INODE];
5151
si->ndirty_all = sbi->ndirty_inode[DIRTY_META];
5252
si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES);
53+
si->aw_cnt = atomic_read(&sbi->aw_cnt);
54+
si->max_aw_cnt = atomic_read(&sbi->max_aw_cnt);
5355
si->nr_wb_cp_data = get_pages(sbi, F2FS_WB_CP_DATA);
5456
si->nr_wb_data = get_pages(sbi, F2FS_WB_DATA);
5557
si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg;
@@ -256,6 +258,8 @@ static int stat_show(struct seq_file *s, void *v)
256258
si->inline_dir);
257259
seq_printf(s, " - Orphan Inode: %u\n",
258260
si->orphans);
261+
seq_printf(s, " - Atomic write count: %4d (Max. %4d)\n",
262+
si->aw_cnt, si->max_aw_cnt);
259263
seq_printf(s, "\nMain area: %d segs, %d secs %d zones\n",
260264
si->main_area_segs, si->main_area_sections,
261265
si->main_area_zones);
@@ -414,6 +418,9 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi)
414418
atomic_set(&sbi->inline_dir, 0);
415419
atomic_set(&sbi->inplace_count, 0);
416420

421+
atomic_set(&sbi->aw_cnt, 0);
422+
atomic_set(&sbi->max_aw_cnt, 0);
423+
417424
mutex_lock(&f2fs_stat_mutex);
418425
list_add_tail(&si->stat_list, &f2fs_stat_list);
419426
mutex_unlock(&f2fs_stat_mutex);

fs/f2fs/f2fs.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,8 @@ struct f2fs_sb_info {
951951
atomic_t inline_xattr; /* # of inline_xattr inodes */
952952
atomic_t inline_inode; /* # of inline_data inodes */
953953
atomic_t inline_dir; /* # of inline_dentry inodes */
954+
atomic_t aw_cnt; /* # of atomic writes */
955+
atomic_t max_aw_cnt; /* max # of atomic writes */
954956
int bg_gc; /* background gc calls */
955957
unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */
956958
#endif
@@ -2303,6 +2305,7 @@ struct f2fs_stat_info {
23032305
int total_count, utilization;
23042306
int bg_gc, nr_wb_cp_data, nr_wb_data;
23052307
int inline_xattr, inline_inode, inline_dir, orphans;
2308+
int aw_cnt, max_aw_cnt;
23062309
unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks;
23072310
unsigned int bimodal, avg_vblocks;
23082311
int util_free, util_valid, util_invalid;
@@ -2374,6 +2377,17 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi)
23742377
((sbi)->block_count[(curseg)->alloc_type]++)
23752378
#define stat_inc_inplace_blocks(sbi) \
23762379
(atomic_inc(&(sbi)->inplace_count))
2380+
#define stat_inc_atomic_write(inode) \
2381+
(atomic_inc(&F2FS_I_SB(inode)->aw_cnt));
2382+
#define stat_dec_atomic_write(inode) \
2383+
(atomic_dec(&F2FS_I_SB(inode)->aw_cnt));
2384+
#define stat_update_max_atomic_write(inode) \
2385+
do { \
2386+
int cur = atomic_read(&F2FS_I_SB(inode)->aw_cnt); \
2387+
int max = atomic_read(&F2FS_I_SB(inode)->max_aw_cnt); \
2388+
if (cur > max) \
2389+
atomic_set(&F2FS_I_SB(inode)->max_aw_cnt, cur); \
2390+
} while (0)
23772391
#define stat_inc_seg_count(sbi, type, gc_type) \
23782392
do { \
23792393
struct f2fs_stat_info *si = F2FS_STAT(sbi); \
@@ -2427,6 +2441,9 @@ void f2fs_destroy_root_stats(void);
24272441
#define stat_dec_inline_inode(inode)
24282442
#define stat_inc_inline_dir(inode)
24292443
#define stat_dec_inline_dir(inode)
2444+
#define stat_inc_atomic_write(inode)
2445+
#define stat_dec_atomic_write(inode)
2446+
#define stat_update_max_atomic_write(inode)
24302447
#define stat_inc_seg_type(sbi, curseg)
24312448
#define stat_inc_block_count(sbi, curseg)
24322449
#define stat_inc_inplace_blocks(sbi)

fs/f2fs/file.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
15461546
if (ret)
15471547
clear_inode_flag(inode, FI_ATOMIC_FILE);
15481548
out:
1549+
stat_inc_atomic_write(inode);
1550+
stat_update_max_atomic_write(inode);
15491551
inode_unlock(inode);
15501552
mnt_drop_write_file(filp);
15511553
return ret;
@@ -1575,9 +1577,11 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp)
15751577
set_inode_flag(inode, FI_ATOMIC_FILE);
15761578
goto err_out;
15771579
}
1580+
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
1581+
stat_dec_atomic_write(inode);
1582+
} else {
1583+
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
15781584
}
1579-
1580-
ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true);
15811585
err_out:
15821586
inode_unlock(inode);
15831587
mnt_drop_write_file(filp);

fs/f2fs/segment.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ void drop_inmem_pages(struct inode *inode)
243243
struct f2fs_inode_info *fi = F2FS_I(inode);
244244

245245
clear_inode_flag(inode, FI_ATOMIC_FILE);
246+
stat_dec_atomic_write(inode);
246247

247248
mutex_lock(&fi->inmem_lock);
248249
__revoke_inmem_pages(inode, &fi->inmem_pages, true, false);

0 commit comments

Comments
 (0)