Message ID | 20221008120518.74870-1-changfengnan@bytedance.com |
---|---|
State | Awaiting Upstream |
Headers | show |
Series | ext4: split ext4_journal_start trace for debug | expand |
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) >
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 --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) );
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(-)