1 vfs: add lazytime tracepoints for better debugging
3 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
5 fs/fs-writeback.c | 9 +++++++--
7 include/trace/events/fs.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 3 files changed, 74 insertions(+), 2 deletions(-)
10 diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
11 index fd03782..63774aa 100644
12 --- a/fs/fs-writeback.c
13 +++ b/fs/fs-writeback.c
15 #include <linux/backing-dev.h>
16 #include <linux/tracepoint.h>
17 #include <linux/device.h>
18 +#include <trace/events/fs.h>
22 @@ -490,8 +491,10 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
23 if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
24 inode->i_state &= ~I_DIRTY_PAGES;
25 dirty = inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC);
26 - if (dirty && (inode->i_state & I_DIRTY_TIME))
27 + if (dirty && (inode->i_state & I_DIRTY_TIME)) {
28 dirty |= I_DIRTY_TIME;
29 + trace_fs_lazytime_writeback(inode);
31 inode->i_state &= ~dirty;
32 spin_unlock(&inode->i_lock);
33 if (dirty & I_DIRTY_TIME)
34 @@ -1338,8 +1341,10 @@ static void flush_sb_dirty_time(struct super_block *sb)
36 list_del_init(&inode->i_wb_list);
37 spin_unlock(&wb->list_lock);
38 - if (inode->i_state & I_DIRTY_TIME)
39 + if (inode->i_state & I_DIRTY_TIME) {
40 mark_inode_dirty_sync(inode);
41 + trace_fs_lazytime_flush(inode);
43 spin_lock(&wb->list_lock);
45 spin_unlock(&wb->list_lock);
46 diff --git a/fs/inode.c b/fs/inode.c
47 index 1ec0629..e903c37 100644
51 #include <linux/list_lru.h>
54 +#define CREATE_TRACE_POINTS
55 +#include <trace/events/fs.h>
58 * Inode locking rules:
60 @@ -1440,6 +1443,7 @@ retry:
61 inode->i_state &= ~I_DIRTY_TIME;
62 spin_unlock(&inode->i_lock);
63 mark_inode_dirty_sync(inode);
64 + trace_fs_lazytime_iput(inode);
68 @@ -1536,6 +1540,7 @@ static int update_time(struct inode *inode, struct timespec *time, int flags)
69 inode->i_state |= I_DIRTY_TIME;
70 spin_unlock(&inode->i_lock);
71 inode_requeue_dirtytime(inode);
72 + trace_fs_lazytime_defer(inode);
76 diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h
78 index 0000000..af0b8cc
80 +++ b/include/trace/events/fs.h
83 +#define TRACE_SYSTEM fs
85 +#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ)
88 +#include <linux/tracepoint.h>
90 +DECLARE_EVENT_CLASS(fs__inode,
91 + TP_PROTO(struct inode *inode),
96 + __field( dev_t, dev )
97 + __field( ino_t, ino )
98 + __field( uid_t, uid )
99 + __field( gid_t, gid )
100 + __field( __u16, mode )
104 + __entry->dev = inode->i_sb->s_dev;
105 + __entry->ino = inode->i_ino;
106 + __entry->uid = i_uid_read(inode);
107 + __entry->gid = i_gid_read(inode);
108 + __entry->mode = inode->i_mode;
111 + TP_printk("dev %d,%d ino %lu mode 0%o uid %u gid %u",
112 + MAJOR(__entry->dev), MINOR(__entry->dev),
113 + (unsigned long) __entry->ino, __entry->mode,
114 + __entry->uid, __entry->gid)
117 +DEFINE_EVENT(fs__inode, fs_lazytime_defer,
118 + TP_PROTO(struct inode *inode),
123 +DEFINE_EVENT(fs__inode, fs_lazytime_iput,
124 + TP_PROTO(struct inode *inode),
129 +DEFINE_EVENT(fs__inode, fs_lazytime_flush,
130 + TP_PROTO(struct inode *inode),
135 +DEFINE_EVENT(fs__inode, fs_lazytime_writeback,
136 + TP_PROTO(struct inode *inode),
140 +#endif /* _TRACE_FS_H */
142 +/* This part must be outside protection */
143 +#include <trace/define_trace.h>