2022-10-08 12:17:23

by Fengnan Chang

[permalink] [raw]
Subject: [PATCH] ext4: split ext4_journal_start trace for debug

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 <[email protected]>
---
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)


2022-11-01 10:01:03

by Fengnan Chang

[permalink] [raw]
Subject: Re: [PATCH] ext4: split ext4_journal_start trace for debug

friendly ping...

changfengnan <[email protected]> 于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 <[email protected]>
> ---
> 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)
>

2022-11-29 21:13:40

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: split ext4_journal_start trace for debug

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,
--
Theodore Ts'o <[email protected]>