diff mbox series

ext4: split ext4_journal_start trace for debug

Message ID 20221008120518.74870-1-changfengnan@bytedance.com
State Awaiting Upstream
Headers show
Series ext4: split ext4_journal_start trace for debug | expand

Commit Message

Fengnan Chang Oct. 8, 2022, 12:05 p.m. UTC
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>
---
 fs/ext4/ext4_jbd2.c         | 14 ++++++---
 fs/ext4/ext4_jbd2.h         | 10 +++----
 fs/ext4/ialloc.c            |  4 +--
 include/trace/events/ext4.h | 57 ++++++++++++++++++++++++++++++-------
 4 files changed, 63 insertions(+), 22 deletions(-)

Comments

Fengnan Chang Nov. 1, 2022, 9:47 a.m. UTC | #1
friendly ping...

changfengnan <changfengnan@bytedance.com> 于2022年10月8日周六 20:05写道:
>
> 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>
> ---
>  fs/ext4/ext4_jbd2.c         | 14 ++++++---
>  fs/ext4/ext4_jbd2.h         | 10 +++----
>  fs/ext4/ialloc.c            |  4 +--
>  include/trace/events/ext4.h | 57 ++++++++++++++++++++++++++++++-------
>  4 files changed, 63 insertions(+), 22 deletions(-)
>
> diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
> index 0fd0c42a4f7d..50651aad988b 100644
> --- a/fs/ext4/ext4_jbd2.c
> +++ b/fs/ext4/ext4_jbd2.c
> @@ -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);
> diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h
> index 00dc668e052b..5693f1edd63c 100644
> --- a/fs/ext4/ext4_jbd2.h
> +++ b/fs/ext4/ext4_jbd2.h
> @@ -263,9 +263,9 @@ int __ext4_handle_dirty_super(const char *where, unsigned int line,
>  #define ext4_handle_dirty_super(handle, sb) \
>         __ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb))
>
> -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)
> @@ -305,7 +305,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)                       \
> @@ -325,7 +325,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);
>  }
>
> diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
> index b215c564bc31..5951899fd7ec 100644
> --- a/fs/ext4/ialloc.c
> +++ b/fs/ext4/ialloc.c
> @@ -1073,8 +1073,8 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
>
>                 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);
> diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
> index b14314fcf732..33e36c4c58e4 100644
> --- a/include/trace/events/ext4.h
> +++ b/include/trace/events/ext4.h
> @@ -1795,18 +1795,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(
> @@ -1815,11 +1816,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)
>  );
>
> --
> 2.32.1 (Apple Git-133)
>
Theodore Ts'o Nov. 29, 2022, 9:12 p.m. UTC | #2
On Sat, 8 Oct 2022 20:05:18 +0800, changfengnan wrote:
> 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.
> 
> 

Applied, thanks!

[1/1] ext4: split ext4_journal_start trace for debug
      commit: 1767a1f3e91f9cc8e94244cec67a5bb7eac47b16

Best regards,
diff mbox series

Patch

diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
index 0fd0c42a4f7d..50651aad988b 100644
--- a/fs/ext4/ext4_jbd2.c
+++ b/fs/ext4/ext4_jbd2.c
@@ -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);
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h
index 00dc668e052b..5693f1edd63c 100644
--- a/fs/ext4/ext4_jbd2.h
+++ b/fs/ext4/ext4_jbd2.h
@@ -263,9 +263,9 @@  int __ext4_handle_dirty_super(const char *where, unsigned int line,
 #define ext4_handle_dirty_super(handle, sb) \
 	__ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb))
 
-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)
@@ -305,7 +305,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)			\
@@ -325,7 +325,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);
 }
 
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index b215c564bc31..5951899fd7ec 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -1073,8 +1073,8 @@  struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
 
 		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);
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index b14314fcf732..33e36c4c58e4 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -1795,18 +1795,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(
@@ -1815,11 +1816,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)
 );