Add tracing to track changes to i_conv_pending_ios count. Signed-off-by: Ojaswin Mujoo --- fs/ext4/inode.c | 11 ++++++++++- include/trace/events/ext4.h | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 280ba3d359e3..8b5cb37cdd6d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -673,7 +673,16 @@ static void _ext4_conv_pending_mod(struct inode *inode, int n) { struct ext4_inode_info *ei = EXT4_I(inode); - atomic_add(n, &ei->i_conv_pending_ios); + /* + * Only use the full ordering variant when tracing is needed. + */ + if (trace_ext4_conv_pending_ios_enabled()) { + int new_ios = atomic_add_return(n, &ei->i_conv_pending_ios); + + trace_ext4_conv_pending_ios(inode, n > 0, new_ios - n, new_ios); + } else { + atomic_add(n, &ei->i_conv_pending_ios); + } } /* diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 7d255c47c446..f1754b2e836c 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -3367,6 +3367,30 @@ TRACE_EVENT(ext4_block_zero_eof, __entry->i_disksize, __entry->did_zero, __entry->zero_written) ); +/* i_conv_pending_ios accounting tracepoint */ +TRACE_EVENT(ext4_conv_pending_ios, + TP_PROTO(struct inode *inode, bool add, int old_ios, int new_ios), + TP_ARGS(inode, add, old_ios, new_ios), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(u64, ino) + __field(bool, add) + __field(int, old_ios) + __field(int, new_ios) + ), + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->add = add; + __entry->old_ios = old_ios; + __entry->new_ios = new_ios; + ), + TP_printk("dev %d:%d ino %llu %s i_conv_pending_ios %d -> %d", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, + __entry->add ? "inc" : "dec", + __entry->old_ios, __entry->new_ios) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 2.55.0