提交 4aaf15d1 编写于 作者: D Dave Chinner 提交者: Alex Elder

xfs: Add inode pin counts to traces

We don't record pin counts in inode events right now, and this makes
it difficult to track down problems related to pinning inodes. Add
the pin count to the inode trace class and add trace events for
pinning and unpinning inodes.
Signed-off-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NChristoph Hellwig <hch@lst.de>
上级 43f5efc5
无相关合并请求
...@@ -562,18 +562,21 @@ DECLARE_EVENT_CLASS(xfs_inode_class, ...@@ -562,18 +562,21 @@ DECLARE_EVENT_CLASS(xfs_inode_class,
__field(dev_t, dev) __field(dev_t, dev)
__field(xfs_ino_t, ino) __field(xfs_ino_t, ino)
__field(int, count) __field(int, count)
__field(int, pincount)
__field(unsigned long, caller_ip) __field(unsigned long, caller_ip)
), ),
TP_fast_assign( TP_fast_assign(
__entry->dev = VFS_I(ip)->i_sb->s_dev; __entry->dev = VFS_I(ip)->i_sb->s_dev;
__entry->ino = ip->i_ino; __entry->ino = ip->i_ino;
__entry->count = atomic_read(&VFS_I(ip)->i_count); __entry->count = atomic_read(&VFS_I(ip)->i_count);
__entry->pincount = atomic_read(&ip->i_pincount);
__entry->caller_ip = caller_ip; __entry->caller_ip = caller_ip;
), ),
TP_printk("dev %d:%d ino 0x%llx count %d caller %pf", TP_printk("dev %d:%d ino 0x%llx count %d pincount %d caller %pf",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->ino,
__entry->count, __entry->count,
__entry->pincount,
(char *)__entry->caller_ip) (char *)__entry->caller_ip)
) )
...@@ -583,6 +586,10 @@ DEFINE_EVENT(xfs_inode_class, name, \ ...@@ -583,6 +586,10 @@ DEFINE_EVENT(xfs_inode_class, name, \
TP_ARGS(ip, caller_ip)) TP_ARGS(ip, caller_ip))
DEFINE_INODE_EVENT(xfs_ihold); DEFINE_INODE_EVENT(xfs_ihold);
DEFINE_INODE_EVENT(xfs_irele); DEFINE_INODE_EVENT(xfs_irele);
DEFINE_INODE_EVENT(xfs_inode_pin);
DEFINE_INODE_EVENT(xfs_inode_unpin);
DEFINE_INODE_EVENT(xfs_inode_unpin_nowait);
/* the old xfs_itrace_entry tracer - to be replaced by s.th. in the VFS */ /* the old xfs_itrace_entry tracer - to be replaced by s.th. in the VFS */
DEFINE_INODE_EVENT(xfs_inode); DEFINE_INODE_EVENT(xfs_inode);
#define xfs_itrace_entry(ip) \ #define xfs_itrace_entry(ip) \
......
...@@ -2449,6 +2449,8 @@ xfs_iunpin_nowait( ...@@ -2449,6 +2449,8 @@ xfs_iunpin_nowait(
{ {
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
trace_xfs_inode_unpin_nowait(ip, _RET_IP_);
/* Give the log a push to start the unpinning I/O */ /* Give the log a push to start the unpinning I/O */
xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0); xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0);
......
...@@ -543,6 +543,7 @@ xfs_inode_item_pin( ...@@ -543,6 +543,7 @@ xfs_inode_item_pin(
{ {
ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(iip->ili_inode, XFS_ILOCK_EXCL));
trace_xfs_inode_pin(iip->ili_inode, _RET_IP_);
atomic_inc(&iip->ili_inode->i_pincount); atomic_inc(&iip->ili_inode->i_pincount);
} }
...@@ -561,6 +562,7 @@ xfs_inode_item_unpin( ...@@ -561,6 +562,7 @@ xfs_inode_item_unpin(
{ {
struct xfs_inode *ip = iip->ili_inode; struct xfs_inode *ip = iip->ili_inode;
trace_xfs_inode_unpin(ip, _RET_IP_);
ASSERT(atomic_read(&ip->i_pincount) > 0); ASSERT(atomic_read(&ip->i_pincount) > 0);
if (atomic_dec_and_test(&ip->i_pincount)) if (atomic_dec_and_test(&ip->i_pincount))
wake_up(&ip->i_ipin_wait); wake_up(&ip->i_ipin_wait);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部