fix: memcg: fix a crash in wb_workfn when a device disappears (5.6)
[lttng-modules.git] / instrumentation / events / lttng-module / writeback.h
CommitLineData
b87700e3
AG
1#undef TRACE_SYSTEM
2#define TRACE_SYSTEM writeback
3
3bc29f0a
MD
4#if !defined(LTTNG_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ)
5#define LTTNG_TRACE_WRITEBACK_H
b87700e3 6
6ec43db8 7#include <probes/lttng-tracepoint-event.h>
aa634cd1 8#include <linux/tracepoint.h>
b87700e3
AG
9#include <linux/backing-dev.h>
10#include <linux/writeback.h>
360d3efe 11#include <lttng-kernel-version.h>
b87700e3
AG
12
13#ifndef _TRACE_WRITEBACK_DEF_
14#define _TRACE_WRITEBACK_DEF_
99a570c8 15
3b8be22c
MD
16#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0) || \
17 LTTNG_KERNEL_RANGE(5,5,3, 5,6,0) || \
18 LTTNG_KERNEL_RANGE(5,4,19, 5,5,0))
19static inline const char *lttng_bdi_dev_name(struct backing_dev_info *bdi)
20{
21 return bdi_dev_name(bdi);
22}
23#else
24static inline const char *lttng_bdi_dev_name(struct backing_dev_info *bdi)
25{
26 if (!bdi || !bdi->dev)
27 return "(unknown)";
28 return dev_name(bdi->dev);
29}
30#endif
31
70f6fc80
MJ
32/*
33 * Vanilla kernels before 4.0 do not implement inode_to_bdi
34 * RHEL kernels before 3.10.0-327.10.1 do not implement inode_to_bdi
35 * RHEL kernel 3.10.0-327.10.1 has inode_to_bdi
36 * RHEL kernel 3.10.0-327.13.1 includes a partial merge of upstream
37 * commit a212b105b07d75b48b1a166378282e8a77fbf53d which inlines
38 * inode_to_bdi but not sb_is_blkdev_sb making it unusable by modules.
39 */
360d3efe 40#if (LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(4,0,0))
70f6fc80 41static inline struct backing_dev_info *lttng_inode_to_bdi(struct inode *inode)
b87700e3 42{
70f6fc80
MJ
43 struct super_block *sb;
44
45 if (!inode)
46 return &noop_backing_dev_info;
47
48 sb = inode->i_sb;
b87700e3
AG
49
50 if (strcmp(sb->s_type->name, "bdev") == 0)
51 return inode->i_mapping->backing_dev_info;
52
53 return sb->s_bdi;
54}
70f6fc80
MJ
55#else
56static inline struct backing_dev_info *lttng_inode_to_bdi(struct inode *inode)
57{
58 return inode_to_bdi(inode);
59}
360d3efe 60#endif /* #if (LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(4,0,0)) */
99a570c8 61
b87700e3
AG
62#endif
63
360d3efe 64#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,0,0))
99a570c8
MD
65#define show_inode_state(state) \
66 __print_flags(state, "|", \
67 {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \
68 {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \
69 {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \
70 {I_NEW, "I_NEW"}, \
71 {I_WILL_FREE, "I_WILL_FREE"}, \
72 {I_FREEING, "I_FREEING"}, \
73 {I_CLEAR, "I_CLEAR"}, \
74 {I_SYNC, "I_SYNC"}, \
75 {I_DIRTY_TIME, "I_DIRTY_TIME"}, \
76 {I_DIRTY_TIME_EXPIRED, "I_DIRTY_TIME_EXPIRED"}, \
77 {I_REFERENCED, "I_REFERENCED"} \
78 )
360d3efe 79#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,0,0)) */
b87700e3
AG
80#define show_inode_state(state) \
81 __print_flags(state, "|", \
82 {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \
83 {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \
84 {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \
85 {I_NEW, "I_NEW"}, \
86 {I_WILL_FREE, "I_WILL_FREE"}, \
87 {I_FREEING, "I_FREEING"}, \
88 {I_CLEAR, "I_CLEAR"}, \
89 {I_SYNC, "I_SYNC"}, \
90 {I_REFERENCED, "I_REFERENCED"} \
91 )
360d3efe 92#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,0,0)) */
b87700e3 93
360d3efe 94#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,0,0))
99a570c8
MD
95
96LTTNG_TRACEPOINT_EVENT(writeback_dirty_page,
97 TP_PROTO(struct page *page, struct address_space *mapping),
98 TP_ARGS(page, mapping),
f127e61e 99 TP_FIELDS(
3b8be22c 100 ctf_string(name, lttng_bdi_dev_name(mapping ? lttng_inode_to_bdi(mapping->host) : NULL))
f127e61e
MD
101 ctf_integer(unsigned long, ino, mapping ? mapping->host->i_ino : 0)
102 ctf_integer(pgoff_t, index, page->index)
99a570c8
MD
103 )
104)
105
106LTTNG_TRACEPOINT_EVENT_CLASS(writeback_dirty_inode_template,
107 TP_PROTO(struct inode *inode, int flags),
108 TP_ARGS(inode, flags),
f127e61e 109 TP_FIELDS(
99a570c8 110 /* may be called for files on pseudo FSes w/ unregistered bdi */
3b8be22c 111 ctf_string(name, lttng_bdi_dev_name(lttng_inode_to_bdi(inode)))
f127e61e
MD
112 ctf_integer(unsigned long, ino, inode->i_ino)
113 ctf_integer(unsigned long, state, inode->i_state)
114 ctf_integer(unsigned long, flags, flags)
99a570c8
MD
115 )
116)
117#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(name) \
118LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_dirty_inode_template, name, \
119 TP_PROTO(struct inode *inode, int flags), \
120 TP_ARGS(inode, flags))
121LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(writeback_dirty_inode_start)
122LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(writeback_dirty_inode)
123LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(writeback_mark_inode_dirty)
124
125LTTNG_TRACEPOINT_EVENT_CLASS(writeback_write_inode_template,
126 TP_PROTO(struct inode *inode, struct writeback_control *wbc),
127 TP_ARGS(inode, wbc),
f127e61e 128 TP_FIELDS(
3b8be22c 129 ctf_string(name, lttng_bdi_dev_name(lttng_inode_to_bdi(inode)))
f127e61e
MD
130 ctf_integer(unsigned long, ino, inode->i_ino)
131 ctf_integer(int, sync_mode, wbc->sync_mode)
99a570c8
MD
132 )
133)
134
135#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(name) \
136LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_write_inode_template, name, \
137 TP_PROTO(struct inode *inode, struct writeback_control *wbc), \
138 TP_ARGS(inode, wbc))
139LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(writeback_write_inode_start)
140LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(writeback_write_inode)
141
360d3efe 142#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,9,0))
99a570c8 143
aa634cd1
JD
144LTTNG_TRACEPOINT_EVENT(writeback_dirty_page,
145 TP_PROTO(struct page *page, struct address_space *mapping),
146 TP_ARGS(page, mapping),
f127e61e 147 TP_FIELDS(
3b8be22c 148 ctf_string(name, lttng_bdi_dev_name(mapping ? mapping->backing_dev_info : NULL))
f127e61e
MD
149 ctf_integer(unsigned long, ino, mapping ? mapping->host->i_ino : 0)
150 ctf_integer(pgoff_t, index, page->index)
aa634cd1
JD
151 )
152)
153
154LTTNG_TRACEPOINT_EVENT_CLASS(writeback_dirty_inode_template,
155 TP_PROTO(struct inode *inode, int flags),
156 TP_ARGS(inode, flags),
f127e61e 157 TP_FIELDS(
aa634cd1 158 /* may be called for files on pseudo FSes w/ unregistered bdi */
3b8be22c 159 ctf_string(name, lttng_bdi_dev_name(inode->i_mapping->backing_dev_info))
f127e61e
MD
160 ctf_integer(unsigned long, ino, inode->i_ino)
161 ctf_integer(unsigned long, flags, flags)
aa634cd1
JD
162 )
163)
164#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(name) \
165LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_dirty_inode_template, name, \
166 TP_PROTO(struct inode *inode, int flags), \
167 TP_ARGS(inode, flags))
168LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(writeback_dirty_inode_start)
169LTTNG_TRACEPOINT_EVENT_WRITEBACK_DIRTY_INODE_TEMPLATE(writeback_dirty_inode)
170
171LTTNG_TRACEPOINT_EVENT_CLASS(writeback_write_inode_template,
172 TP_PROTO(struct inode *inode, struct writeback_control *wbc),
173 TP_ARGS(inode, wbc),
f127e61e 174 TP_FIELDS(
3b8be22c 175 ctf_string(name, lttng_bdi_dev_name(inode->i_mapping->backing_dev_info))
f127e61e
MD
176 ctf_integer(unsigned long, ino, inode->i_ino)
177 ctf_integer(int, sync_mode, wbc->sync_mode)
aa634cd1
JD
178 )
179)
180
181#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(name) \
182LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_write_inode_template, name, \
183 TP_PROTO(struct inode *inode, struct writeback_control *wbc), \
184 TP_ARGS(inode, wbc))
185LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(writeback_write_inode_start)
186LTTNG_TRACEPOINT_EVENT_WRITEBACK_WRITE_INODE(writeback_write_inode)
99a570c8 187
360d3efe 188#endif /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,9,0)) */
aa634cd1 189
360d3efe 190#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0))
a40cb509
MD
191
192LTTNG_TRACEPOINT_EVENT_CLASS(writeback_work_class,
193 TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work),
194 TP_ARGS(wb, work),
195 TP_FIELDS(
3b8be22c 196 ctf_string(name, lttng_bdi_dev_name(wb->bdi))
99a570c8
MD
197 )
198)
199
3b8be22c 200#else
99a570c8 201
3bc29f0a 202LTTNG_TRACEPOINT_EVENT_CLASS(writeback_work_class,
b87700e3
AG
203 TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work),
204 TP_ARGS(bdi, work),
f127e61e 205 TP_FIELDS(
3b8be22c 206 ctf_string(name, lttng_bdi_dev_name(bdi))
b87700e3 207 )
b87700e3 208)
99a570c8 209
3b8be22c 210#endif /* #else if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
99a570c8 211
360d3efe 212#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0))
a40cb509
MD
213
214#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(name) \
215LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_work_class, name, \
216 TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \
217 TP_ARGS(wb, work))
218
360d3efe 219#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 220
3bc29f0a
MD
221#define LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(name) \
222LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_work_class, name, \
b87700e3
AG
223 TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), \
224 TP_ARGS(bdi, work))
a40cb509 225
360d3efe 226#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 227
3bc29f0a
MD
228LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_nothread)
229LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_queue)
230LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_exec)
360d3efe 231#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,1,0))
3bc29f0a
MD
232LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_start)
233LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_written)
234LTTNG_TRACEPOINT_EVENT_WRITEBACK_WORK_INSTANCE(writeback_wait)
b87700e3
AG
235#endif
236
3bc29f0a 237LTTNG_TRACEPOINT_EVENT(writeback_pages_written,
b87700e3
AG
238 TP_PROTO(long pages_written),
239 TP_ARGS(pages_written),
f127e61e
MD
240 TP_FIELDS(
241 ctf_integer(long, pages, pages_written)
242 )
b87700e3
AG
243)
244
360d3efe 245#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0))
a40cb509
MD
246
247LTTNG_TRACEPOINT_EVENT_CLASS(writeback_class,
248 TP_PROTO(struct bdi_writeback *wb),
249 TP_ARGS(wb),
250 TP_FIELDS(
3b8be22c 251 ctf_string(name, lttng_bdi_dev_name(wb->bdi))
a40cb509
MD
252 )
253)
254
255#undef DEFINE_WRITEBACK_EVENT
256#define DEFINE_WRITEBACK_EVENT(name) \
257LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_class, name, \
258 TP_PROTO(struct bdi_writeback *wb), \
259 TP_ARGS(wb))
260
261#define DEFINE_WRITEBACK_EVENT_MAP(name, map) \
262LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(writeback_class, name, map, \
263 TP_PROTO(struct bdi_writeback *wb), \
264 TP_ARGS(wb))
265
266LTTNG_TRACEPOINT_EVENT(writeback_bdi_register,
267 TP_PROTO(struct backing_dev_info *bdi),
268 TP_ARGS(bdi),
269 TP_FIELDS(
3b8be22c 270 ctf_string(name, lttng_bdi_dev_name(bdi))
a40cb509
MD
271 )
272)
273
360d3efe 274#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 275
3bc29f0a 276LTTNG_TRACEPOINT_EVENT_CLASS(writeback_class,
b87700e3
AG
277 TP_PROTO(struct backing_dev_info *bdi),
278 TP_ARGS(bdi),
f127e61e 279 TP_FIELDS(
3b8be22c 280 ctf_string(name, lttng_bdi_dev_name(bdi))
b87700e3
AG
281 )
282)
a40cb509 283
59fecd6c 284#undef DEFINE_WRITEBACK_EVENT
b87700e3 285#define DEFINE_WRITEBACK_EVENT(name) \
3bc29f0a 286LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_class, name, \
b87700e3
AG
287 TP_PROTO(struct backing_dev_info *bdi), \
288 TP_ARGS(bdi))
289
9cf29d3e 290#define DEFINE_WRITEBACK_EVENT_MAP(name, map) \
3bc29f0a 291LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(writeback_class, name, map, \
9cf29d3e
MD
292 TP_PROTO(struct backing_dev_info *bdi), \
293 TP_ARGS(bdi))
294
a40cb509
MD
295DEFINE_WRITEBACK_EVENT(writeback_bdi_register)
296
360d3efe 297#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 298
b87700e3 299DEFINE_WRITEBACK_EVENT(writeback_nowork)
360d3efe 300#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(2,6,38))
b87700e3
AG
301DEFINE_WRITEBACK_EVENT(writeback_wake_background)
302#endif
303DEFINE_WRITEBACK_EVENT(writeback_wake_thread)
304DEFINE_WRITEBACK_EVENT(writeback_wake_forker_thread)
b87700e3
AG
305DEFINE_WRITEBACK_EVENT(writeback_bdi_unregister)
306DEFINE_WRITEBACK_EVENT(writeback_thread_start)
307DEFINE_WRITEBACK_EVENT(writeback_thread_stop)
308#if (LTTNG_KERNEL_RANGE(3,1,0, 3,2,0))
9cf29d3e
MD
309DEFINE_WRITEBACK_EVENT_MAP(balance_dirty_start, writeback_balance_dirty_start)
310DEFINE_WRITEBACK_EVENT_MAP(balance_dirty_wait, writeback_balance_dirty_wait)
311
3bc29f0a 312LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_written,
b87700e3 313
9cf29d3e 314 writeback_balance_dirty_written,
b87700e3
AG
315
316 TP_PROTO(struct backing_dev_info *bdi, int written),
317
318 TP_ARGS(bdi, written),
319
f127e61e 320 TP_FIELDS(
3b8be22c 321 ctf_string(name, lttng_bdi_dev_name(bdi))
f127e61e 322 ctf_integer(int, written, written)
b87700e3
AG
323 )
324)
325#endif
326
3bc29f0a 327LTTNG_TRACEPOINT_EVENT_CLASS(writeback_wbc_class,
b87700e3
AG
328 TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi),
329 TP_ARGS(wbc, bdi),
f127e61e 330 TP_FIELDS(
3b8be22c 331 ctf_string(name, lttng_bdi_dev_name(bdi))
f127e61e
MD
332 ctf_integer(long, nr_to_write, wbc->nr_to_write)
333 ctf_integer(long, pages_skipped, wbc->pages_skipped)
334 ctf_integer(int, sync_mode, wbc->sync_mode)
335 ctf_integer(int, for_kupdate, wbc->for_kupdate)
336 ctf_integer(int, for_background, wbc->for_background)
337 ctf_integer(int, for_reclaim, wbc->for_reclaim)
338 ctf_integer(int, range_cyclic, wbc->range_cyclic)
360d3efe 339#if (LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(3,1,0))
f127e61e
MD
340 ctf_integer(int, more_io, wbc->more_io)
341 ctf_integer(unsigned long, older_than_this,
342 wbc->older_than_this ? *wbc->older_than_this : 0)
b87700e3 343#endif
f127e61e
MD
344 ctf_integer(long, range_start, (long) wbc->range_start)
345 ctf_integer(long, range_end, (long) wbc->range_end)
346 )
b87700e3
AG
347)
348
9cf29d3e 349#undef DEFINE_WBC_EVENT
3bc29f0a
MD
350#define LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(name, map) \
351LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(writeback_wbc_class, name, map, \
b87700e3
AG
352 TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \
353 TP_ARGS(wbc, bdi))
360d3efe 354#if (LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(3,1,0))
3bc29f0a
MD
355LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_writeback_start, writeback_wbc_writeback_start)
356LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_writeback_written, writeback_wbc_writeback_written)
357LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_writeback_wait, writeback_wbc_writeback_wait)
358LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_balance_dirty_start, writeback_wbc_balance_dirty_start)
359LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_balance_dirty_written, writeback_wbc_balance_dirty_written)
360LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_balance_dirty_wait, writeback_wbc_balance_dirty_wait)
b87700e3 361#endif
3bc29f0a 362LTTNG_TRACEPOINT_EVENT_WBC_INSTANCE(wbc_writepage, writeback_wbc_writepage)
b87700e3 363
360d3efe 364#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,9,0) || \
7318a1e8
MJ
365 LTTNG_KERNEL_RANGE(5,8,6, 5,9,0) || \
366 LTTNG_KERNEL_RANGE(5,4,62, 5,5,0) || \
367 LTTNG_KERNEL_RANGE(4,19,143, 4,20,0) || \
368 LTTNG_KERNEL_RANGE(4,14,196, 4,15,0) || \
369 LTTNG_KERNEL_RANGE(4,9,235, 4,10,0) || \
370 LTTNG_KERNEL_RANGE(4,4,235, 4,5,0) || \
371 LTTNG_UBUNTU_KERNEL_RANGE(4,15,18,119, 4,16,0,0))
372LTTNG_TRACEPOINT_EVENT(writeback_queue_io,
373 TP_PROTO(struct bdi_writeback *wb,
374 struct wb_writeback_work *work,
375 unsigned long dirtied_before,
376 int moved),
377 TP_ARGS(wb, work, dirtied_before, moved),
378 TP_FIELDS(
3b8be22c 379 ctf_string(name, lttng_bdi_dev_name(wb->bdi))
7318a1e8
MJ
380 ctf_integer(unsigned long, older, dirtied_before)
381 ctf_integer(int, moved, moved)
382 )
383)
360d3efe 384#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,2,0))
3bc29f0a 385LTTNG_TRACEPOINT_EVENT(writeback_queue_io,
b87700e3 386 TP_PROTO(struct bdi_writeback *wb,
b87700e3 387 struct wb_writeback_work *work,
b87700e3 388 int moved),
b87700e3 389 TP_ARGS(wb, work, moved),
7318a1e8 390 TP_FIELDS(
3b8be22c 391 ctf_string(name, lttng_bdi_dev_name(wb->bdi))
7318a1e8
MJ
392 ctf_integer(int, moved, moved)
393 )
394)
360d3efe 395#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,1,0))
7318a1e8
MJ
396LTTNG_TRACEPOINT_EVENT(writeback_queue_io,
397 TP_PROTO(struct bdi_writeback *wb,
398 unsigned long *older_than_this,
399 int moved),
b87700e3 400 TP_ARGS(wb, older_than_this, moved),
f127e61e 401 TP_FIELDS(
3b8be22c 402 ctf_string(name, lttng_bdi_dev_name(wb->bdi))
f127e61e
MD
403 ctf_integer(unsigned long, older,
404 older_than_this ? *older_than_this : 0)
405 ctf_integer(long, age,
406 older_than_this ?
407 (jiffies - *older_than_this) * 1000 / HZ
408 : -1)
f127e61e 409 ctf_integer(int, moved, moved)
b87700e3 410 )
b87700e3 411)
7318a1e8 412#endif
b87700e3 413
360d3efe 414#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,14,0))
7b510611
MJ
415LTTNG_TRACEPOINT_EVENT_MAP(global_dirty_state,
416
417 writeback_global_dirty_state,
418
419 TP_PROTO(unsigned long background_thresh,
420 unsigned long dirty_thresh
421 ),
422
423 TP_ARGS(background_thresh,
424 dirty_thresh
425 ),
426
427 TP_FIELDS(
428 ctf_integer(unsigned long, nr_dirty, global_node_page_state(NR_FILE_DIRTY))
429 ctf_integer(unsigned long, nr_writeback, global_node_page_state(NR_WRITEBACK))
430 ctf_integer(unsigned long, nr_unstable, global_node_page_state(NR_UNSTABLE_NFS))
431 ctf_integer(unsigned long, nr_dirtied, global_node_page_state(NR_DIRTIED))
432 ctf_integer(unsigned long, nr_written, global_node_page_state(NR_WRITTEN))
433 ctf_integer(unsigned long, background_thresh, background_thresh)
434 ctf_integer(unsigned long, dirty_thresh, dirty_thresh)
435 ctf_integer(unsigned long, dirty_limit, global_dirty_limit)
436 )
437)
360d3efe 438#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,1,0))
3bc29f0a 439LTTNG_TRACEPOINT_EVENT_MAP(global_dirty_state,
9cf29d3e
MD
440
441 writeback_global_dirty_state,
b87700e3
AG
442
443 TP_PROTO(unsigned long background_thresh,
444 unsigned long dirty_thresh
445 ),
446
447 TP_ARGS(background_thresh,
448 dirty_thresh
449 ),
450
f127e61e
MD
451 TP_FIELDS(
452 ctf_integer(unsigned long, nr_dirty, global_page_state(NR_FILE_DIRTY))
453 ctf_integer(unsigned long, nr_writeback, global_page_state(NR_WRITEBACK))
454 ctf_integer(unsigned long, nr_unstable, global_page_state(NR_UNSTABLE_NFS))
455 ctf_integer(unsigned long, nr_dirtied, global_page_state(NR_DIRTIED))
456 ctf_integer(unsigned long, nr_written, global_page_state(NR_WRITTEN))
457 ctf_integer(unsigned long, background_thresh, background_thresh)
458 ctf_integer(unsigned long, dirty_thresh, dirty_thresh)
459 ctf_integer(unsigned long, dirty_limit, global_dirty_limit)
b87700e3
AG
460 )
461)
462#endif
463
360d3efe 464#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,2,0))
b87700e3
AG
465
466#define KBps(x) ((x) << (PAGE_SHIFT - 10))
467
360d3efe 468#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0))
a40cb509
MD
469
470LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit,
471
472 writeback_bdi_dirty_ratelimit,
473
474 TP_PROTO(struct bdi_writeback *wb,
475 unsigned long dirty_rate,
476 unsigned long task_ratelimit),
477
478 TP_ARGS(wb, dirty_rate, task_ratelimit),
479
480 TP_FIELDS(
3b8be22c 481 ctf_string(bdi, lttng_bdi_dev_name(wb->bdi))
a40cb509
MD
482 ctf_integer(unsigned long, write_bw, KBps(wb->bdi->wb.write_bandwidth))
483 ctf_integer(unsigned long, avg_write_bw, KBps(wb->bdi->wb.avg_write_bandwidth))
484 ctf_integer(unsigned long, dirty_rate, KBps(dirty_rate))
485 ctf_integer(unsigned long, dirty_ratelimit, KBps(wb->bdi->wb.dirty_ratelimit))
486 ctf_integer(unsigned long, task_ratelimit, KBps(task_ratelimit))
487 ctf_integer(unsigned long, balanced_dirty_ratelimit,
488 KBps(wb->bdi->wb.balanced_dirty_ratelimit))
489 )
490)
491
360d3efe 492#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,2,0))
c7d89a6d 493
3bc29f0a 494LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit,
9cf29d3e
MD
495
496 writeback_bdi_dirty_ratelimit,
b87700e3
AG
497
498 TP_PROTO(struct backing_dev_info *bdi,
499 unsigned long dirty_rate,
500 unsigned long task_ratelimit),
501
502 TP_ARGS(bdi, dirty_rate, task_ratelimit),
503
f127e61e 504 TP_FIELDS(
3b8be22c 505 ctf_string(bdi, lttng_bdi_dev_name(bdi))
902947a4
MJ
506 ctf_integer(unsigned long, write_bw, KBps(bdi->wb.write_bandwidth))
507 ctf_integer(unsigned long, avg_write_bw, KBps(bdi->wb.avg_write_bandwidth))
f127e61e 508 ctf_integer(unsigned long, dirty_rate, KBps(dirty_rate))
902947a4 509 ctf_integer(unsigned long, dirty_ratelimit, KBps(bdi->wb.dirty_ratelimit))
f127e61e 510 ctf_integer(unsigned long, task_ratelimit, KBps(task_ratelimit))
902947a4
MJ
511 ctf_integer(unsigned long, balanced_dirty_ratelimit,
512 KBps(bdi->wb.balanced_dirty_ratelimit))
c7d89a6d
MD
513 )
514)
515
360d3efe 516#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,2,0)) */
c7d89a6d
MD
517
518LTTNG_TRACEPOINT_EVENT_MAP(bdi_dirty_ratelimit,
519
520 writeback_bdi_dirty_ratelimit,
521
522 TP_PROTO(struct backing_dev_info *bdi,
523 unsigned long dirty_rate,
524 unsigned long task_ratelimit),
525
526 TP_ARGS(bdi, dirty_rate, task_ratelimit),
527
528 TP_FIELDS(
3b8be22c 529 ctf_string(bdi, lttng_bdi_dev_name(bdi))
c7d89a6d
MD
530 ctf_integer(unsigned long, write_bw, KBps(bdi->write_bandwidth))
531 ctf_integer(unsigned long, avg_write_bw, KBps(bdi->avg_write_bandwidth))
532 ctf_integer(unsigned long, dirty_rate, KBps(dirty_rate))
533 ctf_integer(unsigned long, dirty_ratelimit, KBps(bdi->dirty_ratelimit))
534 ctf_integer(unsigned long, task_ratelimit, KBps(task_ratelimit))
f127e61e 535 ctf_integer(unsigned long, balanced_dirty_ratelimit,
b87700e3 536 KBps(bdi->balanced_dirty_ratelimit))
b87700e3
AG
537 )
538)
539
360d3efe 540#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,2,0)) */
c7d89a6d 541
360d3efe 542#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0))
a40cb509
MD
543
544LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_pages,
545
546 writeback_balance_dirty_pages,
547
548 TP_PROTO(struct bdi_writeback *wb,
549 unsigned long thresh,
550 unsigned long bg_thresh,
551 unsigned long dirty,
552 unsigned long bdi_thresh,
553 unsigned long bdi_dirty,
554 unsigned long dirty_ratelimit,
555 unsigned long task_ratelimit,
556 unsigned long dirtied,
557 unsigned long period,
558 long pause,
559 unsigned long start_time),
560
561 TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty,
562 dirty_ratelimit, task_ratelimit,
563 dirtied, period, pause, start_time
564 ),
565
566 TP_FIELDS(
3b8be22c 567 ctf_string(bdi, lttng_bdi_dev_name(wb->bdi))
a40cb509
MD
568 ctf_integer(unsigned long, limit, global_dirty_limit)
569 ctf_integer(unsigned long, setpoint,
570 (global_dirty_limit + (thresh + bg_thresh) / 2) / 2)
571 ctf_integer(unsigned long, dirty, dirty)
572 ctf_integer(unsigned long, bdi_setpoint,
573 ((global_dirty_limit + (thresh + bg_thresh) / 2) / 2) *
574 bdi_thresh / (thresh + 1))
575 ctf_integer(unsigned long, bdi_dirty, bdi_dirty)
576 ctf_integer(unsigned long, dirty_ratelimit,
577 KBps(dirty_ratelimit))
578 ctf_integer(unsigned long, task_ratelimit,
579 KBps(task_ratelimit))
580 ctf_integer(unsigned int, dirtied, dirtied)
581 ctf_integer(unsigned int, dirtied_pause,
582 current->nr_dirtied_pause)
583 ctf_integer(unsigned long, paused,
584 (jiffies - start_time) * 1000 / HZ)
585 ctf_integer(long, pause, pause * 1000 / HZ)
586 ctf_integer(unsigned long, period,
587 period * 1000 / HZ)
588 ctf_integer(long, think,
589 current->dirty_paused_when == 0 ? 0 :
590 (long)(jiffies - current->dirty_paused_when) * 1000/HZ)
591 )
592)
593
360d3efe 594#else /* #if LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 595
3bc29f0a 596LTTNG_TRACEPOINT_EVENT_MAP(balance_dirty_pages,
9cf29d3e
MD
597
598 writeback_balance_dirty_pages,
b87700e3
AG
599
600 TP_PROTO(struct backing_dev_info *bdi,
601 unsigned long thresh,
602 unsigned long bg_thresh,
603 unsigned long dirty,
604 unsigned long bdi_thresh,
605 unsigned long bdi_dirty,
606 unsigned long dirty_ratelimit,
607 unsigned long task_ratelimit,
608 unsigned long dirtied,
360d3efe 609#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,3,0))
b87700e3
AG
610 unsigned long period,
611#endif
612 long pause,
613 unsigned long start_time),
614
615 TP_ARGS(bdi, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty,
616 dirty_ratelimit, task_ratelimit,
360d3efe 617#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,3,0))
f127e61e 618 dirtied, period, pause, start_time
b87700e3 619#else
f127e61e 620 dirtied, pause, start_time
b87700e3
AG
621#endif
622 ),
623
f127e61e 624 TP_FIELDS(
3b8be22c 625 ctf_string(bdi, lttng_bdi_dev_name(bdi))
f127e61e
MD
626 ctf_integer(unsigned long, limit, global_dirty_limit)
627 ctf_integer(unsigned long, setpoint,
b87700e3 628 (global_dirty_limit + (thresh + bg_thresh) / 2) / 2)
f127e61e
MD
629 ctf_integer(unsigned long, dirty, dirty)
630 ctf_integer(unsigned long, bdi_setpoint,
b87700e3 631 ((global_dirty_limit + (thresh + bg_thresh) / 2) / 2) *
f127e61e
MD
632 bdi_thresh / (thresh + 1))
633 ctf_integer(unsigned long, bdi_dirty, bdi_dirty)
634 ctf_integer(unsigned long, dirty_ratelimit,
635 KBps(dirty_ratelimit))
636 ctf_integer(unsigned long, task_ratelimit,
637 KBps(task_ratelimit))
638 ctf_integer(unsigned int, dirtied, dirtied)
639 ctf_integer(unsigned int, dirtied_pause,
640 current->nr_dirtied_pause)
641 ctf_integer(unsigned long, paused,
642 (jiffies - start_time) * 1000 / HZ)
643 ctf_integer(long, pause, pause * 1000 / HZ)
360d3efe 644#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,3,0))
f127e61e
MD
645 ctf_integer(unsigned long, period,
646 period * 1000 / HZ)
647 ctf_integer(long, think,
648 current->dirty_paused_when == 0 ? 0 :
649 (long)(jiffies - current->dirty_paused_when) * 1000/HZ)
b87700e3 650#endif
f127e61e 651 )
b87700e3 652)
360d3efe 653#endif /* #else #if LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,3,0)) */
a40cb509 654
360d3efe 655#endif /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,2,0)) */
b87700e3 656
360d3efe 657#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,5,0))
3bc29f0a 658LTTNG_TRACEPOINT_EVENT(writeback_sb_inodes_requeue,
b87700e3
AG
659
660 TP_PROTO(struct inode *inode),
661 TP_ARGS(inode),
662
f127e61e 663 TP_FIELDS(
3b8be22c 664 ctf_string(name, lttng_bdi_dev_name(lttng_inode_to_bdi(inode)))
f127e61e
MD
665 ctf_integer(unsigned long, ino, inode->i_ino)
666 ctf_integer(unsigned long, state, inode->i_state)
667 ctf_integer(unsigned long, dirtied_when, inode->dirtied_when)
b87700e3
AG
668 )
669)
670#endif
671
360d3efe 672#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(2,6,37))
3bc29f0a 673LTTNG_TRACEPOINT_EVENT_CLASS(writeback_congest_waited_template,
b87700e3
AG
674
675 TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
676
677 TP_ARGS(usec_timeout, usec_delayed),
678
f127e61e
MD
679 TP_FIELDS(
680 ctf_integer(unsigned int, usec_timeout, usec_timeout)
681 ctf_integer(unsigned int, usec_delayed, usec_delayed)
682 )
b87700e3
AG
683)
684
3bc29f0a 685LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_congest_waited_template, writeback_congestion_wait,
b87700e3
AG
686
687 TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
688
689 TP_ARGS(usec_timeout, usec_delayed)
690)
691
3bc29f0a 692LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_congest_waited_template, writeback_wait_iff_congested,
b87700e3
AG
693
694 TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
695
696 TP_ARGS(usec_timeout, usec_delayed)
697)
698#endif
699
360d3efe 700#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(3,1,0))
3bc29f0a 701LTTNG_TRACEPOINT_EVENT_CLASS(writeback_single_inode_template,
b87700e3
AG
702
703 TP_PROTO(struct inode *inode,
704 struct writeback_control *wbc,
705 unsigned long nr_to_write
706 ),
707
708 TP_ARGS(inode, wbc, nr_to_write),
709
f127e61e 710 TP_FIELDS(
3b8be22c 711 ctf_string(name, lttng_bdi_dev_name(lttng_inode_to_bdi(inode)))
f127e61e
MD
712 ctf_integer(unsigned long, ino, inode->i_ino)
713 ctf_integer(unsigned long, state, inode->i_state)
714 ctf_integer(unsigned long, dirtied_when, inode->dirtied_when)
715 ctf_integer(unsigned long, writeback_index,
716 inode->i_mapping->writeback_index)
717 ctf_integer(long, nr_to_write, nr_to_write)
718 ctf_integer(unsigned long, wrote,
719 nr_to_write - wbc->nr_to_write)
b87700e3
AG
720 )
721)
722
360d3efe 723#if (LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(3,5,0))
3bc29f0a 724LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_single_inode_template, writeback_single_inode_requeue,
b87700e3
AG
725 TP_PROTO(struct inode *inode,
726 struct writeback_control *wbc,
727 unsigned long nr_to_write),
728 TP_ARGS(inode, wbc, nr_to_write)
729)
730#endif
731
3bc29f0a 732LTTNG_TRACEPOINT_EVENT_INSTANCE(writeback_single_inode_template, writeback_single_inode,
b87700e3
AG
733 TP_PROTO(struct inode *inode,
734 struct writeback_control *wbc,
735 unsigned long nr_to_write),
736 TP_ARGS(inode, wbc, nr_to_write)
737)
738#endif
739
3bc29f0a 740#endif /* LTTNG_TRACE_WRITEBACK_H */
b87700e3
AG
741
742/* This part must be outside protection */
6ec43db8 743#include <probes/define_trace.h>
This page took 0.068929 seconds and 4 git commands to generate.