fix user-writeback-lists-patch missing hunk
[ext4-patch-queue.git] / add-lazytime-tracepoints
blob52d8e684f0fdd38ead55c0b5a26a1e0dbcfc5395
1 vfs: add lazytime tracepoints for better debugging
3 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
4 ---
5  fs/fs-writeback.c         |  9 +++++++--
6  fs/inode.c                |  5 +++++
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
14 @@ -27,6 +27,7 @@
15  #include <linux/backing-dev.h>
16  #include <linux/tracepoint.h>
17  #include <linux/device.h>
18 +#include <trace/events/fs.h>
19  #include "internal.h"
21  /*
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);
30 +       }
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);
42 +               }
43                 spin_lock(&wb->list_lock);
44         }
45         spin_unlock(&wb->list_lock);
46 diff --git a/fs/inode.c b/fs/inode.c
47 index 1ec0629..e903c37 100644
48 --- a/fs/inode.c
49 +++ b/fs/inode.c
50 @@ -20,6 +20,9 @@
51  #include <linux/list_lru.h>
52  #include "internal.h"
54 +#define CREATE_TRACE_POINTS
55 +#include <trace/events/fs.h>
57  /*
58   * Inode locking rules:
59   *
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);
65                         goto retry;
66                 }
67                 iput_final(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);
73                 return 0;
74         }
75  force_dirty:
76 diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h
77 new file mode 100644
78 index 0000000..af0b8cc
79 --- /dev/null
80 +++ b/include/trace/events/fs.h
81 @@ -0,0 +1,62 @@
82 +#undef TRACE_SYSTEM
83 +#define TRACE_SYSTEM fs
85 +#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ)
86 +#define _TRACE_FS_H
88 +#include <linux/tracepoint.h>
90 +DECLARE_EVENT_CLASS(fs__inode,
91 +       TP_PROTO(struct inode *inode),
93 +       TP_ARGS(inode),
95 +       TP_STRUCT__entry(
96 +               __field(        dev_t,  dev                     )
97 +               __field(        ino_t,  ino                     )
98 +               __field(        uid_t,  uid                     )
99 +               __field(        gid_t,  gid                     )
100 +               __field(        __u16, mode                     )
101 +       ),
103 +       TP_fast_assign(
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;
109 +       ),
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),
120 +       TP_ARGS(inode)
123 +DEFINE_EVENT(fs__inode, fs_lazytime_iput,
124 +       TP_PROTO(struct inode *inode),
126 +       TP_ARGS(inode)
129 +DEFINE_EVENT(fs__inode, fs_lazytime_flush,
130 +       TP_PROTO(struct inode *inode),
132 +       TP_ARGS(inode)
135 +DEFINE_EVENT(fs__inode, fs_lazytime_writeback,
136 +       TP_PROTO(struct inode *inode),
138 +       TP_ARGS(inode)
140 +#endif /* _TRACE_FS_H */
142 +/* This part must be outside protection */
143 +#include <trace/define_trace.h>