ext4: split ext4_journal_start trace for debug
authorchangfengnan <changfengnan@bytedance.com>
Sat, 8 Oct 2022 12:05:18 +0000 (20:05 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 1 Dec 2022 15:46:54 +0000 (10:46 -0500)
we might want to know why jbd2 thread using high io for detail,
split ext4_journal_start trace to ext4_journal_start_sb and
ext4_journal_start_inode, show ino and handle type when possible.

Signed-off-by: changfengnan <changfengnan@bytedance.com>
Link: https://lore.kernel.org/r/20221008120518.74870-1-changfengnan@bytedance.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/ext4_jbd2.c
fs/ext4/ext4_jbd2.h
fs/ext4/ialloc.c
include/trace/events/ext4.h

index 8e1fb18f465ea1457ae7c14ac4c9272d09ca66b5..77f318ec8abb78f712fb95c1b71e6c0e86ef3cbe 100644 (file)
@@ -86,15 +86,21 @@ static int ext4_journal_check_start(struct super_block *sb)
        return 0;
 }
 
-handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
+handle_t *__ext4_journal_start_sb(struct inode *inode,
+                                 struct super_block *sb, unsigned int line,
                                  int type, int blocks, int rsv_blocks,
                                  int revoke_creds)
 {
        journal_t *journal;
        int err;
-
-       trace_ext4_journal_start(sb, blocks, rsv_blocks, revoke_creds,
-                                _RET_IP_);
+       if (inode)
+               trace_ext4_journal_start_inode(inode, blocks, rsv_blocks,
+                                       revoke_creds, type,
+                                       _RET_IP_);
+       else
+               trace_ext4_journal_start_sb(sb, blocks, rsv_blocks,
+                                       revoke_creds, type,
+                                       _RET_IP_);
        err = ext4_journal_check_start(sb);
        if (err < 0)
                return ERR_PTR(err);
index db2ae4a2b38d8f4526674a2702e5b2f99a86c262..0c77697d5e90d075364bb67dbc281a7fde89ea9d 100644 (file)
@@ -261,9 +261,9 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
        __ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
                                     (bh))
 
-handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
-                                 int type, int blocks, int rsv_blocks,
-                                 int revoke_creds);
+handle_t *__ext4_journal_start_sb(struct inode *inode, struct super_block *sb,
+                                 unsigned int line, int type, int blocks,
+                                 int rsv_blocks, int revoke_creds);
 int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle);
 
 #define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
@@ -303,7 +303,7 @@ static inline int ext4_trans_default_revoke_credits(struct super_block *sb)
 }
 
 #define ext4_journal_start_sb(sb, type, nblocks)                       \
-       __ext4_journal_start_sb((sb), __LINE__, (type), (nblocks), 0,   \
+       __ext4_journal_start_sb(NULL, (sb), __LINE__, (type), (nblocks), 0,\
                                ext4_trans_default_revoke_credits(sb))
 
 #define ext4_journal_start(inode, type, nblocks)                       \
@@ -323,7 +323,7 @@ static inline handle_t *__ext4_journal_start(struct inode *inode,
                                             int blocks, int rsv_blocks,
                                             int revoke_creds)
 {
-       return __ext4_journal_start_sb(inode->i_sb, line, type, blocks,
+       return __ext4_journal_start_sb(inode, inode->i_sb, line, type, blocks,
                                       rsv_blocks, revoke_creds);
 }
 
index e9bc46684106b5cb2c3922711f6008584535f882..d701977678d4db736a611a67893b7eed0501a4df 100644 (file)
@@ -1076,8 +1076,8 @@ repeat_in_this_group:
 
                if ((!(sbi->s_mount_state & EXT4_FC_REPLAY)) && !handle) {
                        BUG_ON(nblocks <= 0);
-                       handle = __ext4_journal_start_sb(dir->i_sb, line_no,
-                                handle_type, nblocks, 0,
+                       handle = __ext4_journal_start_sb(NULL, dir->i_sb,
+                                line_no, handle_type, nblocks, 0,
                                 ext4_trans_default_revoke_credits(sb));
                        if (IS_ERR(handle)) {
                                err = PTR_ERR(handle);
index 229e8fae66a345aef3924e7aeab3868d1c33bfec..44dc438c92420226586b78cd215e4ebc506a4fe9 100644 (file)
@@ -1744,18 +1744,19 @@ TRACE_EVENT(ext4_load_inode,
                  (unsigned long) __entry->ino)
 );
 
-TRACE_EVENT(ext4_journal_start,
+TRACE_EVENT(ext4_journal_start_sb,
        TP_PROTO(struct super_block *sb, int blocks, int rsv_blocks,
-                int revoke_creds, unsigned long IP),
+                int revoke_creds, int type, unsigned long IP),
 
-       TP_ARGS(sb, blocks, rsv_blocks, revoke_creds, IP),
+       TP_ARGS(sb, blocks, rsv_blocks, revoke_creds, type, IP),
 
        TP_STRUCT__entry(
-               __field(        dev_t,  dev                     )
-               __field(unsigned long,  ip                      )
-               __field(          int,  blocks                  )
-               __field(          int,  rsv_blocks              )
-               __field(          int,  revoke_creds            )
+               __field(        dev_t,          dev             )
+               __field(        unsigned long,  ip              )
+               __field(        int,            blocks          )
+               __field(        int,            rsv_blocks      )
+               __field(        int,            revoke_creds    )
+               __field(        int,            type            )
        ),
 
        TP_fast_assign(
@@ -1764,11 +1765,45 @@ TRACE_EVENT(ext4_journal_start,
                __entry->blocks          = blocks;
                __entry->rsv_blocks      = rsv_blocks;
                __entry->revoke_creds    = revoke_creds;
+               __entry->type            = type;
+       ),
+
+       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d,"
+                 " type %d, caller %pS", MAJOR(__entry->dev),
+                 MINOR(__entry->dev), __entry->blocks, __entry->rsv_blocks,
+                 __entry->revoke_creds, __entry->type, (void *)__entry->ip)
+);
+
+TRACE_EVENT(ext4_journal_start_inode,
+       TP_PROTO(struct inode *inode, int blocks, int rsv_blocks,
+                int revoke_creds, int type, unsigned long IP),
+
+       TP_ARGS(inode, blocks, rsv_blocks, revoke_creds, type, IP),
+
+       TP_STRUCT__entry(
+               __field(        unsigned long,  ino             )
+               __field(        dev_t,          dev             )
+               __field(        unsigned long,  ip              )
+               __field(        int,            blocks          )
+               __field(        int,            rsv_blocks      )
+               __field(        int,            revoke_creds    )
+               __field(        int,            type            )
+       ),
+
+       TP_fast_assign(
+               __entry->dev             = inode->i_sb->s_dev;
+               __entry->ip              = IP;
+               __entry->blocks          = blocks;
+               __entry->rsv_blocks      = rsv_blocks;
+               __entry->revoke_creds    = revoke_creds;
+               __entry->type            = type;
+               __entry->ino             = inode->i_ino;
        ),
 
-       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d, "
-                 "caller %pS", MAJOR(__entry->dev), MINOR(__entry->dev),
-                 __entry->blocks, __entry->rsv_blocks, __entry->revoke_creds,
+       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d,"
+                 " type %d, ino %lu, caller %pS", MAJOR(__entry->dev),
+                 MINOR(__entry->dev), __entry->blocks, __entry->rsv_blocks,
+                 __entry->revoke_creds, __entry->type, __entry->ino,
                  (void *)__entry->ip)
 );