diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-08 18:11:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-08 18:11:48 -0400 |
commit | 942d33da999b86821c9aee9615fcb81207ee04c7 (patch) | |
tree | db14ab92982f936c0a2ea2202f5e301310f33bdd /include/trace | |
parent | 246e6a0d781091c4657890ffa497c2576bd99095 (diff) | |
parent | 59bbd474abb9dd6a0c1a74df758ec29c7a8b150f (diff) |
Merge tag 'f2fs-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs updates from Jaegeuk Kim:
"This patch-set includes the following major enhancement patches.
- introduce a new gloabl lock scheme
- add tracepoints on several major functions
- fix the overall cleaning process focused on victim selection
- apply the block plugging to merge IOs as much as possible
- enhance management of free nids and its list
- enhance the readahead mode for node pages
- address several cretical deadlock conditions
- reduce lock_page calls
The other minor bug fixes and enhancements are as follows.
- calculation mistakes: overflow
- bio types: READ, READA, and READ_SYNC
- fix the recovery flow, data races, and null pointer errors"
* tag 'f2fs-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (68 commits)
f2fs: cover free_nid management with spin_lock
f2fs: optimize scan_nat_page()
f2fs: code cleanup for scan_nat_page() and build_free_nids()
f2fs: bugfix for alloc_nid_failed()
f2fs: recover when journal contains deleted files
f2fs: continue to mount after failing recovery
f2fs: avoid deadlock during evict after f2fs_gc
f2fs: modify the number of issued pages to merge IOs
f2fs: remove useless #include <linux/proc_fs.h> as we're now using sysfs as debug entry.
f2fs: fix inconsistent using of NM_WOUT_THRESHOLD
f2fs: check truncation of mapping after lock_page
f2fs: enhance alloc_nid and build_free_nids flows
f2fs: add a tracepoint on f2fs_new_inode
f2fs: check nid == 0 in add_free_nid
f2fs: add REQ_META about metadata requests for submit
f2fs: give a chance to merge IOs by IO scheduler
f2fs: avoid frequent background GC
f2fs: add tracepoints to debug checkpoint request
f2fs: add tracepoints for write page operations
f2fs: add tracepoints to debug the block allocation
...
Diffstat (limited to 'include/trace')
-rw-r--r-- | include/trace/events/f2fs.h | 682 |
1 files changed, 682 insertions, 0 deletions
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h new file mode 100644 index 000000000000..52ae54828eda --- /dev/null +++ b/include/trace/events/f2fs.h | |||
@@ -0,0 +1,682 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM f2fs | ||
3 | |||
4 | #if !defined(_TRACE_F2FS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_F2FS_H | ||
6 | |||
7 | #include <linux/tracepoint.h> | ||
8 | |||
9 | #define show_dev(entry) MAJOR(entry->dev), MINOR(entry->dev) | ||
10 | #define show_dev_ino(entry) show_dev(entry), (unsigned long)entry->ino | ||
11 | |||
12 | #define show_block_type(type) \ | ||
13 | __print_symbolic(type, \ | ||
14 | { NODE, "NODE" }, \ | ||
15 | { DATA, "DATA" }, \ | ||
16 | { META, "META" }, \ | ||
17 | { META_FLUSH, "META_FLUSH" }) | ||
18 | |||
19 | #define show_bio_type(type) \ | ||
20 | __print_symbolic(type, \ | ||
21 | { READ, "READ" }, \ | ||
22 | { READA, "READAHEAD" }, \ | ||
23 | { READ_SYNC, "READ_SYNC" }, \ | ||
24 | { WRITE, "WRITE" }, \ | ||
25 | { WRITE_SYNC, "WRITE_SYNC" }, \ | ||
26 | { WRITE_FLUSH, "WRITE_FLUSH" }, \ | ||
27 | { WRITE_FUA, "WRITE_FUA" }) | ||
28 | |||
29 | #define show_data_type(type) \ | ||
30 | __print_symbolic(type, \ | ||
31 | { CURSEG_HOT_DATA, "Hot DATA" }, \ | ||
32 | { CURSEG_WARM_DATA, "Warm DATA" }, \ | ||
33 | { CURSEG_COLD_DATA, "Cold DATA" }, \ | ||
34 | { CURSEG_HOT_NODE, "Hot NODE" }, \ | ||
35 | { CURSEG_WARM_NODE, "Warm NODE" }, \ | ||
36 | { CURSEG_COLD_NODE, "Cold NODE" }, \ | ||
37 | { NO_CHECK_TYPE, "No TYPE" }) | ||
38 | |||
39 | #define show_gc_type(type) \ | ||
40 | __print_symbolic(type, \ | ||
41 | { FG_GC, "Foreground GC" }, \ | ||
42 | { BG_GC, "Background GC" }) | ||
43 | |||
44 | #define show_alloc_mode(type) \ | ||
45 | __print_symbolic(type, \ | ||
46 | { LFS, "LFS-mode" }, \ | ||
47 | { SSR, "SSR-mode" }) | ||
48 | |||
49 | #define show_victim_policy(type) \ | ||
50 | __print_symbolic(type, \ | ||
51 | { GC_GREEDY, "Greedy" }, \ | ||
52 | { GC_CB, "Cost-Benefit" }) | ||
53 | |||
54 | struct victim_sel_policy; | ||
55 | |||
56 | DECLARE_EVENT_CLASS(f2fs__inode, | ||
57 | |||
58 | TP_PROTO(struct inode *inode), | ||
59 | |||
60 | TP_ARGS(inode), | ||
61 | |||
62 | TP_STRUCT__entry( | ||
63 | __field(dev_t, dev) | ||
64 | __field(ino_t, ino) | ||
65 | __field(ino_t, pino) | ||
66 | __field(umode_t, mode) | ||
67 | __field(loff_t, size) | ||
68 | __field(unsigned int, nlink) | ||
69 | __field(blkcnt_t, blocks) | ||
70 | __field(__u8, advise) | ||
71 | ), | ||
72 | |||
73 | TP_fast_assign( | ||
74 | __entry->dev = inode->i_sb->s_dev; | ||
75 | __entry->ino = inode->i_ino; | ||
76 | __entry->pino = F2FS_I(inode)->i_pino; | ||
77 | __entry->mode = inode->i_mode; | ||
78 | __entry->nlink = inode->i_nlink; | ||
79 | __entry->size = inode->i_size; | ||
80 | __entry->blocks = inode->i_blocks; | ||
81 | __entry->advise = F2FS_I(inode)->i_advise; | ||
82 | ), | ||
83 | |||
84 | TP_printk("dev = (%d,%d), ino = %lu, pino = %lu, i_mode = 0x%hx, " | ||
85 | "i_size = %lld, i_nlink = %u, i_blocks = %llu, i_advise = 0x%x", | ||
86 | show_dev_ino(__entry), | ||
87 | (unsigned long)__entry->pino, | ||
88 | __entry->mode, | ||
89 | __entry->size, | ||
90 | (unsigned int)__entry->nlink, | ||
91 | (unsigned long long)__entry->blocks, | ||
92 | (unsigned char)__entry->advise) | ||
93 | ); | ||
94 | |||
95 | DECLARE_EVENT_CLASS(f2fs__inode_exit, | ||
96 | |||
97 | TP_PROTO(struct inode *inode, int ret), | ||
98 | |||
99 | TP_ARGS(inode, ret), | ||
100 | |||
101 | TP_STRUCT__entry( | ||
102 | __field(dev_t, dev) | ||
103 | __field(ino_t, ino) | ||
104 | __field(int, ret) | ||
105 | ), | ||
106 | |||
107 | TP_fast_assign( | ||
108 | __entry->dev = inode->i_sb->s_dev; | ||
109 | __entry->ino = inode->i_ino; | ||
110 | __entry->ret = ret; | ||
111 | ), | ||
112 | |||
113 | TP_printk("dev = (%d,%d), ino = %lu, ret = %d", | ||
114 | show_dev_ino(__entry), | ||
115 | __entry->ret) | ||
116 | ); | ||
117 | |||
118 | DEFINE_EVENT(f2fs__inode, f2fs_sync_file_enter, | ||
119 | |||
120 | TP_PROTO(struct inode *inode), | ||
121 | |||
122 | TP_ARGS(inode) | ||
123 | ); | ||
124 | |||
125 | TRACE_EVENT(f2fs_sync_file_exit, | ||
126 | |||
127 | TP_PROTO(struct inode *inode, bool need_cp, int datasync, int ret), | ||
128 | |||
129 | TP_ARGS(inode, need_cp, datasync, ret), | ||
130 | |||
131 | TP_STRUCT__entry( | ||
132 | __field(dev_t, dev) | ||
133 | __field(ino_t, ino) | ||
134 | __field(bool, need_cp) | ||
135 | __field(int, datasync) | ||
136 | __field(int, ret) | ||
137 | ), | ||
138 | |||
139 | TP_fast_assign( | ||
140 | __entry->dev = inode->i_sb->s_dev; | ||
141 | __entry->ino = inode->i_ino; | ||
142 | __entry->need_cp = need_cp; | ||
143 | __entry->datasync = datasync; | ||
144 | __entry->ret = ret; | ||
145 | ), | ||
146 | |||
147 | TP_printk("dev = (%d,%d), ino = %lu, checkpoint is %s, " | ||
148 | "datasync = %d, ret = %d", | ||
149 | show_dev_ino(__entry), | ||
150 | __entry->need_cp ? "needed" : "not needed", | ||
151 | __entry->datasync, | ||
152 | __entry->ret) | ||
153 | ); | ||
154 | |||
155 | TRACE_EVENT(f2fs_sync_fs, | ||
156 | |||
157 | TP_PROTO(struct super_block *sb, int wait), | ||
158 | |||
159 | TP_ARGS(sb, wait), | ||
160 | |||
161 | TP_STRUCT__entry( | ||
162 | __field(dev_t, dev) | ||
163 | __field(int, dirty) | ||
164 | __field(int, wait) | ||
165 | ), | ||
166 | |||
167 | TP_fast_assign( | ||
168 | __entry->dev = sb->s_dev; | ||
169 | __entry->dirty = F2FS_SB(sb)->s_dirty; | ||
170 | __entry->wait = wait; | ||
171 | ), | ||
172 | |||
173 | TP_printk("dev = (%d,%d), superblock is %s, wait = %d", | ||
174 | show_dev(__entry), | ||
175 | __entry->dirty ? "dirty" : "not dirty", | ||
176 | __entry->wait) | ||
177 | ); | ||
178 | |||
179 | DEFINE_EVENT(f2fs__inode, f2fs_iget, | ||
180 | |||
181 | TP_PROTO(struct inode *inode), | ||
182 | |||
183 | TP_ARGS(inode) | ||
184 | ); | ||
185 | |||
186 | DEFINE_EVENT(f2fs__inode_exit, f2fs_iget_exit, | ||
187 | |||
188 | TP_PROTO(struct inode *inode, int ret), | ||
189 | |||
190 | TP_ARGS(inode, ret) | ||
191 | ); | ||
192 | |||
193 | DEFINE_EVENT(f2fs__inode, f2fs_evict_inode, | ||
194 | |||
195 | TP_PROTO(struct inode *inode), | ||
196 | |||
197 | TP_ARGS(inode) | ||
198 | ); | ||
199 | |||
200 | DEFINE_EVENT(f2fs__inode_exit, f2fs_new_inode, | ||
201 | |||
202 | TP_PROTO(struct inode *inode, int ret), | ||
203 | |||
204 | TP_ARGS(inode, ret) | ||
205 | ); | ||
206 | |||
207 | TRACE_EVENT(f2fs_unlink_enter, | ||
208 | |||
209 | TP_PROTO(struct inode *dir, struct dentry *dentry), | ||
210 | |||
211 | TP_ARGS(dir, dentry), | ||
212 | |||
213 | TP_STRUCT__entry( | ||
214 | __field(dev_t, dev) | ||
215 | __field(ino_t, ino) | ||
216 | __field(loff_t, size) | ||
217 | __field(blkcnt_t, blocks) | ||
218 | __field(const char *, name) | ||
219 | ), | ||
220 | |||
221 | TP_fast_assign( | ||
222 | __entry->dev = dir->i_sb->s_dev; | ||
223 | __entry->ino = dir->i_ino; | ||
224 | __entry->size = dir->i_size; | ||
225 | __entry->blocks = dir->i_blocks; | ||
226 | __entry->name = dentry->d_name.name; | ||
227 | ), | ||
228 | |||
229 | TP_printk("dev = (%d,%d), dir ino = %lu, i_size = %lld, " | ||
230 | "i_blocks = %llu, name = %s", | ||
231 | show_dev_ino(__entry), | ||
232 | __entry->size, | ||
233 | (unsigned long long)__entry->blocks, | ||
234 | __entry->name) | ||
235 | ); | ||
236 | |||
237 | DEFINE_EVENT(f2fs__inode_exit, f2fs_unlink_exit, | ||
238 | |||
239 | TP_PROTO(struct inode *inode, int ret), | ||
240 | |||
241 | TP_ARGS(inode, ret) | ||
242 | ); | ||
243 | |||
244 | DEFINE_EVENT(f2fs__inode, f2fs_truncate, | ||
245 | |||
246 | TP_PROTO(struct inode *inode), | ||
247 | |||
248 | TP_ARGS(inode) | ||
249 | ); | ||
250 | |||
251 | TRACE_EVENT(f2fs_truncate_data_blocks_range, | ||
252 | |||
253 | TP_PROTO(struct inode *inode, nid_t nid, unsigned int ofs, int free), | ||
254 | |||
255 | TP_ARGS(inode, nid, ofs, free), | ||
256 | |||
257 | TP_STRUCT__entry( | ||
258 | __field(dev_t, dev) | ||
259 | __field(ino_t, ino) | ||
260 | __field(nid_t, nid) | ||
261 | __field(unsigned int, ofs) | ||
262 | __field(int, free) | ||
263 | ), | ||
264 | |||
265 | TP_fast_assign( | ||
266 | __entry->dev = inode->i_sb->s_dev; | ||
267 | __entry->ino = inode->i_ino; | ||
268 | __entry->nid = nid; | ||
269 | __entry->ofs = ofs; | ||
270 | __entry->free = free; | ||
271 | ), | ||
272 | |||
273 | TP_printk("dev = (%d,%d), ino = %lu, nid = %u, offset = %u, freed = %d", | ||
274 | show_dev_ino(__entry), | ||
275 | (unsigned int)__entry->nid, | ||
276 | __entry->ofs, | ||
277 | __entry->free) | ||
278 | ); | ||
279 | |||
280 | DECLARE_EVENT_CLASS(f2fs__truncate_op, | ||
281 | |||
282 | TP_PROTO(struct inode *inode, u64 from), | ||
283 | |||
284 | TP_ARGS(inode, from), | ||
285 | |||
286 | TP_STRUCT__entry( | ||
287 | __field(dev_t, dev) | ||
288 | __field(ino_t, ino) | ||
289 | __field(loff_t, size) | ||
290 | __field(blkcnt_t, blocks) | ||
291 | __field(u64, from) | ||
292 | ), | ||
293 | |||
294 | TP_fast_assign( | ||
295 | __entry->dev = inode->i_sb->s_dev; | ||
296 | __entry->ino = inode->i_ino; | ||
297 | __entry->size = inode->i_size; | ||
298 | __entry->blocks = inode->i_blocks; | ||
299 | __entry->from = from; | ||
300 | ), | ||
301 | |||
302 | TP_printk("dev = (%d,%d), ino = %lu, i_size = %lld, i_blocks = %llu, " | ||
303 | "start file offset = %llu", | ||
304 | show_dev_ino(__entry), | ||
305 | __entry->size, | ||
306 | (unsigned long long)__entry->blocks, | ||
307 | (unsigned long long)__entry->from) | ||
308 | ); | ||
309 | |||
310 | DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_blocks_enter, | ||
311 | |||
312 | TP_PROTO(struct inode *inode, u64 from), | ||
313 | |||
314 | TP_ARGS(inode, from) | ||
315 | ); | ||
316 | |||
317 | DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_blocks_exit, | ||
318 | |||
319 | TP_PROTO(struct inode *inode, int ret), | ||
320 | |||
321 | TP_ARGS(inode, ret) | ||
322 | ); | ||
323 | |||
324 | DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_inode_blocks_enter, | ||
325 | |||
326 | TP_PROTO(struct inode *inode, u64 from), | ||
327 | |||
328 | TP_ARGS(inode, from) | ||
329 | ); | ||
330 | |||
331 | DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_inode_blocks_exit, | ||
332 | |||
333 | TP_PROTO(struct inode *inode, int ret), | ||
334 | |||
335 | TP_ARGS(inode, ret) | ||
336 | ); | ||
337 | |||
338 | DECLARE_EVENT_CLASS(f2fs__truncate_node, | ||
339 | |||
340 | TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr), | ||
341 | |||
342 | TP_ARGS(inode, nid, blk_addr), | ||
343 | |||
344 | TP_STRUCT__entry( | ||
345 | __field(dev_t, dev) | ||
346 | __field(ino_t, ino) | ||
347 | __field(nid_t, nid) | ||
348 | __field(block_t, blk_addr) | ||
349 | ), | ||
350 | |||
351 | TP_fast_assign( | ||
352 | __entry->dev = inode->i_sb->s_dev; | ||
353 | __entry->ino = inode->i_ino; | ||
354 | __entry->nid = nid; | ||
355 | __entry->blk_addr = blk_addr; | ||
356 | ), | ||
357 | |||
358 | TP_printk("dev = (%d,%d), ino = %lu, nid = %u, block_address = 0x%llx", | ||
359 | show_dev_ino(__entry), | ||
360 | (unsigned int)__entry->nid, | ||
361 | (unsigned long long)__entry->blk_addr) | ||
362 | ); | ||
363 | |||
364 | DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_nodes_enter, | ||
365 | |||
366 | TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr), | ||
367 | |||
368 | TP_ARGS(inode, nid, blk_addr) | ||
369 | ); | ||
370 | |||
371 | DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_nodes_exit, | ||
372 | |||
373 | TP_PROTO(struct inode *inode, int ret), | ||
374 | |||
375 | TP_ARGS(inode, ret) | ||
376 | ); | ||
377 | |||
378 | DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_node, | ||
379 | |||
380 | TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr), | ||
381 | |||
382 | TP_ARGS(inode, nid, blk_addr) | ||
383 | ); | ||
384 | |||
385 | TRACE_EVENT(f2fs_truncate_partial_nodes, | ||
386 | |||
387 | TP_PROTO(struct inode *inode, nid_t nid[], int depth, int err), | ||
388 | |||
389 | TP_ARGS(inode, nid, depth, err), | ||
390 | |||
391 | TP_STRUCT__entry( | ||
392 | __field(dev_t, dev) | ||
393 | __field(ino_t, ino) | ||
394 | __field(nid_t, nid[3]) | ||
395 | __field(int, depth) | ||
396 | __field(int, err) | ||
397 | ), | ||
398 | |||
399 | TP_fast_assign( | ||
400 | __entry->dev = inode->i_sb->s_dev; | ||
401 | __entry->ino = inode->i_ino; | ||
402 | __entry->nid[0] = nid[0]; | ||
403 | __entry->nid[1] = nid[1]; | ||
404 | __entry->nid[2] = nid[2]; | ||
405 | __entry->depth = depth; | ||
406 | __entry->err = err; | ||
407 | ), | ||
408 | |||
409 | TP_printk("dev = (%d,%d), ino = %lu, " | ||
410 | "nid[0] = %u, nid[1] = %u, nid[2] = %u, depth = %d, err = %d", | ||
411 | show_dev_ino(__entry), | ||
412 | (unsigned int)__entry->nid[0], | ||
413 | (unsigned int)__entry->nid[1], | ||
414 | (unsigned int)__entry->nid[2], | ||
415 | __entry->depth, | ||
416 | __entry->err) | ||
417 | ); | ||
418 | |||
419 | TRACE_EVENT_CONDITION(f2fs_readpage, | ||
420 | |||
421 | TP_PROTO(struct page *page, sector_t blkaddr, int type), | ||
422 | |||
423 | TP_ARGS(page, blkaddr, type), | ||
424 | |||
425 | TP_CONDITION(page->mapping), | ||
426 | |||
427 | TP_STRUCT__entry( | ||
428 | __field(dev_t, dev) | ||
429 | __field(ino_t, ino) | ||
430 | __field(pgoff_t, index) | ||
431 | __field(sector_t, blkaddr) | ||
432 | __field(int, type) | ||
433 | ), | ||
434 | |||
435 | TP_fast_assign( | ||
436 | __entry->dev = page->mapping->host->i_sb->s_dev; | ||
437 | __entry->ino = page->mapping->host->i_ino; | ||
438 | __entry->index = page->index; | ||
439 | __entry->blkaddr = blkaddr; | ||
440 | __entry->type = type; | ||
441 | ), | ||
442 | |||
443 | TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, " | ||
444 | "blkaddr = 0x%llx, bio_type = %s", | ||
445 | show_dev_ino(__entry), | ||
446 | (unsigned long)__entry->index, | ||
447 | (unsigned long long)__entry->blkaddr, | ||
448 | show_bio_type(__entry->type)) | ||
449 | ); | ||
450 | |||
451 | TRACE_EVENT(f2fs_get_data_block, | ||
452 | TP_PROTO(struct inode *inode, sector_t iblock, | ||
453 | struct buffer_head *bh, int ret), | ||
454 | |||
455 | TP_ARGS(inode, iblock, bh, ret), | ||
456 | |||
457 | TP_STRUCT__entry( | ||
458 | __field(dev_t, dev) | ||
459 | __field(ino_t, ino) | ||
460 | __field(sector_t, iblock) | ||
461 | __field(sector_t, bh_start) | ||
462 | __field(size_t, bh_size) | ||
463 | __field(int, ret) | ||
464 | ), | ||
465 | |||
466 | TP_fast_assign( | ||
467 | __entry->dev = inode->i_sb->s_dev; | ||
468 | __entry->ino = inode->i_ino; | ||
469 | __entry->iblock = iblock; | ||
470 | __entry->bh_start = bh->b_blocknr; | ||
471 | __entry->bh_size = bh->b_size; | ||
472 | __entry->ret = ret; | ||
473 | ), | ||
474 | |||
475 | TP_printk("dev = (%d,%d), ino = %lu, file offset = %llu, " | ||
476 | "start blkaddr = 0x%llx, len = 0x%llx bytes, err = %d", | ||
477 | show_dev_ino(__entry), | ||
478 | (unsigned long long)__entry->iblock, | ||
479 | (unsigned long long)__entry->bh_start, | ||
480 | (unsigned long long)__entry->bh_size, | ||
481 | __entry->ret) | ||
482 | ); | ||
483 | |||
484 | TRACE_EVENT(f2fs_get_victim, | ||
485 | |||
486 | TP_PROTO(struct super_block *sb, int type, int gc_type, | ||
487 | struct victim_sel_policy *p, unsigned int pre_victim, | ||
488 | unsigned int prefree, unsigned int free), | ||
489 | |||
490 | TP_ARGS(sb, type, gc_type, p, pre_victim, prefree, free), | ||
491 | |||
492 | TP_STRUCT__entry( | ||
493 | __field(dev_t, dev) | ||
494 | __field(int, type) | ||
495 | __field(int, gc_type) | ||
496 | __field(int, alloc_mode) | ||
497 | __field(int, gc_mode) | ||
498 | __field(unsigned int, victim) | ||
499 | __field(unsigned int, ofs_unit) | ||
500 | __field(unsigned int, pre_victim) | ||
501 | __field(unsigned int, prefree) | ||
502 | __field(unsigned int, free) | ||
503 | ), | ||
504 | |||
505 | TP_fast_assign( | ||
506 | __entry->dev = sb->s_dev; | ||
507 | __entry->type = type; | ||
508 | __entry->gc_type = gc_type; | ||
509 | __entry->alloc_mode = p->alloc_mode; | ||
510 | __entry->gc_mode = p->gc_mode; | ||
511 | __entry->victim = p->min_segno; | ||
512 | __entry->ofs_unit = p->ofs_unit; | ||
513 | __entry->pre_victim = pre_victim; | ||
514 | __entry->prefree = prefree; | ||
515 | __entry->free = free; | ||
516 | ), | ||
517 | |||
518 | TP_printk("dev = (%d,%d), type = %s, policy = (%s, %s, %s), victim = %u " | ||
519 | "ofs_unit = %u, pre_victim_secno = %d, prefree = %u, free = %u", | ||
520 | show_dev(__entry), | ||
521 | show_data_type(__entry->type), | ||
522 | show_gc_type(__entry->gc_type), | ||
523 | show_alloc_mode(__entry->alloc_mode), | ||
524 | show_victim_policy(__entry->gc_mode), | ||
525 | __entry->victim, | ||
526 | __entry->ofs_unit, | ||
527 | (int)__entry->pre_victim, | ||
528 | __entry->prefree, | ||
529 | __entry->free) | ||
530 | ); | ||
531 | |||
532 | TRACE_EVENT(f2fs_fallocate, | ||
533 | |||
534 | TP_PROTO(struct inode *inode, int mode, | ||
535 | loff_t offset, loff_t len, int ret), | ||
536 | |||
537 | TP_ARGS(inode, mode, offset, len, ret), | ||
538 | |||
539 | TP_STRUCT__entry( | ||
540 | __field(dev_t, dev) | ||
541 | __field(ino_t, ino) | ||
542 | __field(int, mode) | ||
543 | __field(loff_t, offset) | ||
544 | __field(loff_t, len) | ||
545 | __field(loff_t, size) | ||
546 | __field(blkcnt_t, blocks) | ||
547 | __field(int, ret) | ||
548 | ), | ||
549 | |||
550 | TP_fast_assign( | ||
551 | __entry->dev = inode->i_sb->s_dev; | ||
552 | __entry->ino = inode->i_ino; | ||
553 | __entry->mode = mode; | ||
554 | __entry->offset = offset; | ||
555 | __entry->len = len; | ||
556 | __entry->size = inode->i_size; | ||
557 | __entry->blocks = inode->i_blocks; | ||
558 | __entry->ret = ret; | ||
559 | ), | ||
560 | |||
561 | TP_printk("dev = (%d,%d), ino = %lu, mode = %x, offset = %lld, " | ||
562 | "len = %lld, i_size = %lld, i_blocks = %llu, ret = %d", | ||
563 | show_dev_ino(__entry), | ||
564 | __entry->mode, | ||
565 | (unsigned long long)__entry->offset, | ||
566 | (unsigned long long)__entry->len, | ||
567 | (unsigned long long)__entry->size, | ||
568 | (unsigned long long)__entry->blocks, | ||
569 | __entry->ret) | ||
570 | ); | ||
571 | |||
572 | TRACE_EVENT(f2fs_reserve_new_block, | ||
573 | |||
574 | TP_PROTO(struct inode *inode, nid_t nid, unsigned int ofs_in_node), | ||
575 | |||
576 | TP_ARGS(inode, nid, ofs_in_node), | ||
577 | |||
578 | TP_STRUCT__entry( | ||
579 | __field(dev_t, dev) | ||
580 | __field(nid_t, nid) | ||
581 | __field(unsigned int, ofs_in_node) | ||
582 | ), | ||
583 | |||
584 | TP_fast_assign( | ||
585 | __entry->dev = inode->i_sb->s_dev; | ||
586 | __entry->nid = nid; | ||
587 | __entry->ofs_in_node = ofs_in_node; | ||
588 | ), | ||
589 | |||
590 | TP_printk("dev = (%d,%d), nid = %u, ofs_in_node = %u", | ||
591 | show_dev(__entry), | ||
592 | (unsigned int)__entry->nid, | ||
593 | __entry->ofs_in_node) | ||
594 | ); | ||
595 | |||
596 | TRACE_EVENT(f2fs_do_submit_bio, | ||
597 | |||
598 | TP_PROTO(struct super_block *sb, int btype, bool sync, struct bio *bio), | ||
599 | |||
600 | TP_ARGS(sb, btype, sync, bio), | ||
601 | |||
602 | TP_STRUCT__entry( | ||
603 | __field(dev_t, dev) | ||
604 | __field(int, btype) | ||
605 | __field(bool, sync) | ||
606 | __field(sector_t, sector) | ||
607 | __field(unsigned int, size) | ||
608 | ), | ||
609 | |||
610 | TP_fast_assign( | ||
611 | __entry->dev = sb->s_dev; | ||
612 | __entry->btype = btype; | ||
613 | __entry->sync = sync; | ||
614 | __entry->sector = bio->bi_sector; | ||
615 | __entry->size = bio->bi_size; | ||
616 | ), | ||
617 | |||
618 | TP_printk("dev = (%d,%d), type = %s, io = %s, sector = %lld, size = %u", | ||
619 | show_dev(__entry), | ||
620 | show_block_type(__entry->btype), | ||
621 | __entry->sync ? "sync" : "no sync", | ||
622 | (unsigned long long)__entry->sector, | ||
623 | __entry->size) | ||
624 | ); | ||
625 | |||
626 | TRACE_EVENT(f2fs_submit_write_page, | ||
627 | |||
628 | TP_PROTO(struct page *page, block_t blk_addr, int type), | ||
629 | |||
630 | TP_ARGS(page, blk_addr, type), | ||
631 | |||
632 | TP_STRUCT__entry( | ||
633 | __field(dev_t, dev) | ||
634 | __field(ino_t, ino) | ||
635 | __field(int, type) | ||
636 | __field(pgoff_t, index) | ||
637 | __field(block_t, block) | ||
638 | ), | ||
639 | |||
640 | TP_fast_assign( | ||
641 | __entry->dev = page->mapping->host->i_sb->s_dev; | ||
642 | __entry->ino = page->mapping->host->i_ino; | ||
643 | __entry->type = type; | ||
644 | __entry->index = page->index; | ||
645 | __entry->block = blk_addr; | ||
646 | ), | ||
647 | |||
648 | TP_printk("dev = (%d,%d), ino = %lu, %s, index = %lu, blkaddr = 0x%llx", | ||
649 | show_dev_ino(__entry), | ||
650 | show_block_type(__entry->type), | ||
651 | (unsigned long)__entry->index, | ||
652 | (unsigned long long)__entry->block) | ||
653 | ); | ||
654 | |||
655 | TRACE_EVENT(f2fs_write_checkpoint, | ||
656 | |||
657 | TP_PROTO(struct super_block *sb, bool is_umount, char *msg), | ||
658 | |||
659 | TP_ARGS(sb, is_umount, msg), | ||
660 | |||
661 | TP_STRUCT__entry( | ||
662 | __field(dev_t, dev) | ||
663 | __field(bool, is_umount) | ||
664 | __field(char *, msg) | ||
665 | ), | ||
666 | |||
667 | TP_fast_assign( | ||
668 | __entry->dev = sb->s_dev; | ||
669 | __entry->is_umount = is_umount; | ||
670 | __entry->msg = msg; | ||
671 | ), | ||
672 | |||
673 | TP_printk("dev = (%d,%d), checkpoint for %s, state = %s", | ||
674 | show_dev(__entry), | ||
675 | __entry->is_umount ? "clean umount" : "consistency", | ||
676 | __entry->msg) | ||
677 | ); | ||
678 | |||
679 | #endif /* _TRACE_F2FS_H */ | ||
680 | |||
681 | /* This part must be outside protection */ | ||
682 | #include <trace/define_trace.h> | ||