fscache.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. /* FS-Cache tracepoints
  2. *
  3. * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public Licence
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the Licence, or (at your option) any later version.
  10. */
  11. #undef TRACE_SYSTEM
  12. #define TRACE_SYSTEM fscache
  13. #if !defined(_TRACE_FSCACHE_H) || defined(TRACE_HEADER_MULTI_READ)
  14. #define _TRACE_FSCACHE_H
  15. #include <linux/fscache.h>
  16. #include <linux/tracepoint.h>
  17. /*
  18. * Define enums for tracing information.
  19. */
  20. #ifndef __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY
  21. #define __FSCACHE_DECLARE_TRACE_ENUMS_ONCE_ONLY
  22. enum fscache_cookie_trace {
  23. fscache_cookie_collision,
  24. fscache_cookie_discard,
  25. fscache_cookie_get_acquire_parent,
  26. fscache_cookie_get_attach_object,
  27. fscache_cookie_get_reacquire,
  28. fscache_cookie_get_register_netfs,
  29. fscache_cookie_put_acquire_nobufs,
  30. fscache_cookie_put_dup_netfs,
  31. fscache_cookie_put_relinquish,
  32. fscache_cookie_put_object,
  33. fscache_cookie_put_parent,
  34. };
  35. enum fscache_page_trace {
  36. fscache_page_cached,
  37. fscache_page_inval,
  38. fscache_page_maybe_release,
  39. fscache_page_radix_clear_store,
  40. fscache_page_radix_delete,
  41. fscache_page_radix_insert,
  42. fscache_page_radix_pend2store,
  43. fscache_page_radix_set_pend,
  44. fscache_page_uncache,
  45. fscache_page_write,
  46. fscache_page_write_end,
  47. fscache_page_write_end_pend,
  48. fscache_page_write_end_noc,
  49. fscache_page_write_wait,
  50. fscache_page_trace__nr
  51. };
  52. enum fscache_op_trace {
  53. fscache_op_cancel,
  54. fscache_op_cancel_all,
  55. fscache_op_cancelled,
  56. fscache_op_completed,
  57. fscache_op_enqueue_async,
  58. fscache_op_enqueue_mythread,
  59. fscache_op_gc,
  60. fscache_op_init,
  61. fscache_op_put,
  62. fscache_op_run,
  63. fscache_op_signal,
  64. fscache_op_submit,
  65. fscache_op_submit_ex,
  66. fscache_op_work,
  67. fscache_op_trace__nr
  68. };
  69. enum fscache_page_op_trace {
  70. fscache_page_op_alloc_one,
  71. fscache_page_op_attr_changed,
  72. fscache_page_op_check_consistency,
  73. fscache_page_op_invalidate,
  74. fscache_page_op_retr_multi,
  75. fscache_page_op_retr_one,
  76. fscache_page_op_write_one,
  77. fscache_page_op_trace__nr
  78. };
  79. #endif
  80. /*
  81. * Declare tracing information enums and their string mappings for display.
  82. */
  83. #define fscache_cookie_traces \
  84. EM(fscache_cookie_collision, "*COLLISION*") \
  85. EM(fscache_cookie_discard, "DISCARD") \
  86. EM(fscache_cookie_get_acquire_parent, "GET prn") \
  87. EM(fscache_cookie_get_attach_object, "GET obj") \
  88. EM(fscache_cookie_get_reacquire, "GET raq") \
  89. EM(fscache_cookie_get_register_netfs, "GET net") \
  90. EM(fscache_cookie_put_acquire_nobufs, "PUT nbf") \
  91. EM(fscache_cookie_put_dup_netfs, "PUT dnt") \
  92. EM(fscache_cookie_put_relinquish, "PUT rlq") \
  93. EM(fscache_cookie_put_object, "PUT obj") \
  94. E_(fscache_cookie_put_parent, "PUT prn")
  95. #define fscache_page_traces \
  96. EM(fscache_page_cached, "Cached ") \
  97. EM(fscache_page_inval, "InvalPg") \
  98. EM(fscache_page_maybe_release, "MayRels") \
  99. EM(fscache_page_uncache, "Uncache") \
  100. EM(fscache_page_radix_clear_store, "RxCStr ") \
  101. EM(fscache_page_radix_delete, "RxDel ") \
  102. EM(fscache_page_radix_insert, "RxIns ") \
  103. EM(fscache_page_radix_pend2store, "RxP2S ") \
  104. EM(fscache_page_radix_set_pend, "RxSPend ") \
  105. EM(fscache_page_write, "WritePg") \
  106. EM(fscache_page_write_end, "EndPgWr") \
  107. EM(fscache_page_write_end_pend, "EndPgWP") \
  108. EM(fscache_page_write_end_noc, "EndPgNC") \
  109. E_(fscache_page_write_wait, "WtOnWrt")
  110. #define fscache_op_traces \
  111. EM(fscache_op_cancel, "Cancel1") \
  112. EM(fscache_op_cancel_all, "CancelA") \
  113. EM(fscache_op_cancelled, "Canclld") \
  114. EM(fscache_op_completed, "Complet") \
  115. EM(fscache_op_enqueue_async, "EnqAsyn") \
  116. EM(fscache_op_enqueue_mythread, "EnqMyTh") \
  117. EM(fscache_op_gc, "GC ") \
  118. EM(fscache_op_init, "Init ") \
  119. EM(fscache_op_put, "Put ") \
  120. EM(fscache_op_run, "Run ") \
  121. EM(fscache_op_signal, "Signal ") \
  122. EM(fscache_op_submit, "Submit ") \
  123. EM(fscache_op_submit_ex, "SubmitX") \
  124. E_(fscache_op_work, "Work ")
  125. #define fscache_page_op_traces \
  126. EM(fscache_page_op_alloc_one, "Alloc1 ") \
  127. EM(fscache_page_op_attr_changed, "AttrChg") \
  128. EM(fscache_page_op_check_consistency, "CheckCn") \
  129. EM(fscache_page_op_invalidate, "Inval ") \
  130. EM(fscache_page_op_retr_multi, "RetrMul") \
  131. EM(fscache_page_op_retr_one, "Retr1 ") \
  132. E_(fscache_page_op_write_one, "Write1 ")
  133. /*
  134. * Export enum symbols via userspace.
  135. */
  136. #undef EM
  137. #undef E_
  138. #define EM(a, b) TRACE_DEFINE_ENUM(a);
  139. #define E_(a, b) TRACE_DEFINE_ENUM(a);
  140. fscache_cookie_traces;
  141. /*
  142. * Now redefine the EM() and E_() macros to map the enums to the strings that
  143. * will be printed in the output.
  144. */
  145. #undef EM
  146. #undef E_
  147. #define EM(a, b) { a, b },
  148. #define E_(a, b) { a, b }
  149. TRACE_EVENT(fscache_cookie,
  150. TP_PROTO(struct fscache_cookie *cookie,
  151. enum fscache_cookie_trace where,
  152. int usage),
  153. TP_ARGS(cookie, where, usage),
  154. TP_STRUCT__entry(
  155. __field(struct fscache_cookie *, cookie )
  156. __field(struct fscache_cookie *, parent )
  157. __field(enum fscache_cookie_trace, where )
  158. __field(int, usage )
  159. __field(int, n_children )
  160. __field(int, n_active )
  161. __field(u8, flags )
  162. ),
  163. TP_fast_assign(
  164. __entry->cookie = cookie;
  165. __entry->parent = cookie->parent;
  166. __entry->where = where;
  167. __entry->usage = usage;
  168. __entry->n_children = atomic_read(&cookie->n_children);
  169. __entry->n_active = atomic_read(&cookie->n_active);
  170. __entry->flags = cookie->flags;
  171. ),
  172. TP_printk("%s c=%p u=%d p=%p Nc=%d Na=%d f=%02x",
  173. __print_symbolic(__entry->where, fscache_cookie_traces),
  174. __entry->cookie, __entry->usage,
  175. __entry->parent, __entry->n_children, __entry->n_active,
  176. __entry->flags)
  177. );
  178. TRACE_EVENT(fscache_netfs,
  179. TP_PROTO(struct fscache_netfs *netfs),
  180. TP_ARGS(netfs),
  181. TP_STRUCT__entry(
  182. __field(struct fscache_cookie *, cookie )
  183. __array(char, name, 8 )
  184. ),
  185. TP_fast_assign(
  186. __entry->cookie = netfs->primary_index;
  187. strncpy(__entry->name, netfs->name, 8);
  188. __entry->name[7] = 0;
  189. ),
  190. TP_printk("c=%p n=%s",
  191. __entry->cookie, __entry->name)
  192. );
  193. TRACE_EVENT(fscache_acquire,
  194. TP_PROTO(struct fscache_cookie *cookie),
  195. TP_ARGS(cookie),
  196. TP_STRUCT__entry(
  197. __field(struct fscache_cookie *, cookie )
  198. __field(struct fscache_cookie *, parent )
  199. __array(char, name, 8 )
  200. __field(int, p_usage )
  201. __field(int, p_n_children )
  202. __field(u8, p_flags )
  203. ),
  204. TP_fast_assign(
  205. __entry->cookie = cookie;
  206. __entry->parent = cookie->parent;
  207. __entry->p_usage = atomic_read(&cookie->parent->usage);
  208. __entry->p_n_children = atomic_read(&cookie->parent->n_children);
  209. __entry->p_flags = cookie->parent->flags;
  210. memcpy(__entry->name, cookie->def->name, 8);
  211. __entry->name[7] = 0;
  212. ),
  213. TP_printk("c=%p p=%p pu=%d pc=%d pf=%02x n=%s",
  214. __entry->cookie, __entry->parent, __entry->p_usage,
  215. __entry->p_n_children, __entry->p_flags, __entry->name)
  216. );
  217. TRACE_EVENT(fscache_relinquish,
  218. TP_PROTO(struct fscache_cookie *cookie, bool retire),
  219. TP_ARGS(cookie, retire),
  220. TP_STRUCT__entry(
  221. __field(struct fscache_cookie *, cookie )
  222. __field(struct fscache_cookie *, parent )
  223. __field(int, usage )
  224. __field(int, n_children )
  225. __field(int, n_active )
  226. __field(u8, flags )
  227. __field(bool, retire )
  228. ),
  229. TP_fast_assign(
  230. __entry->cookie = cookie;
  231. __entry->parent = cookie->parent;
  232. __entry->usage = atomic_read(&cookie->usage);
  233. __entry->n_children = atomic_read(&cookie->n_children);
  234. __entry->n_active = atomic_read(&cookie->n_active);
  235. __entry->flags = cookie->flags;
  236. __entry->retire = retire;
  237. ),
  238. TP_printk("c=%p u=%d p=%p Nc=%d Na=%d f=%02x r=%u",
  239. __entry->cookie, __entry->usage,
  240. __entry->parent, __entry->n_children, __entry->n_active,
  241. __entry->flags, __entry->retire)
  242. );
  243. TRACE_EVENT(fscache_enable,
  244. TP_PROTO(struct fscache_cookie *cookie),
  245. TP_ARGS(cookie),
  246. TP_STRUCT__entry(
  247. __field(struct fscache_cookie *, cookie )
  248. __field(int, usage )
  249. __field(int, n_children )
  250. __field(int, n_active )
  251. __field(u8, flags )
  252. ),
  253. TP_fast_assign(
  254. __entry->cookie = cookie;
  255. __entry->usage = atomic_read(&cookie->usage);
  256. __entry->n_children = atomic_read(&cookie->n_children);
  257. __entry->n_active = atomic_read(&cookie->n_active);
  258. __entry->flags = cookie->flags;
  259. ),
  260. TP_printk("c=%p u=%d Nc=%d Na=%d f=%02x",
  261. __entry->cookie, __entry->usage,
  262. __entry->n_children, __entry->n_active, __entry->flags)
  263. );
  264. TRACE_EVENT(fscache_disable,
  265. TP_PROTO(struct fscache_cookie *cookie),
  266. TP_ARGS(cookie),
  267. TP_STRUCT__entry(
  268. __field(struct fscache_cookie *, cookie )
  269. __field(int, usage )
  270. __field(int, n_children )
  271. __field(int, n_active )
  272. __field(u8, flags )
  273. ),
  274. TP_fast_assign(
  275. __entry->cookie = cookie;
  276. __entry->usage = atomic_read(&cookie->usage);
  277. __entry->n_children = atomic_read(&cookie->n_children);
  278. __entry->n_active = atomic_read(&cookie->n_active);
  279. __entry->flags = cookie->flags;
  280. ),
  281. TP_printk("c=%p u=%d Nc=%d Na=%d f=%02x",
  282. __entry->cookie, __entry->usage,
  283. __entry->n_children, __entry->n_active, __entry->flags)
  284. );
  285. TRACE_EVENT(fscache_osm,
  286. TP_PROTO(struct fscache_object *object,
  287. const struct fscache_state *state,
  288. bool wait, bool oob, s8 event_num),
  289. TP_ARGS(object, state, wait, oob, event_num),
  290. TP_STRUCT__entry(
  291. __field(struct fscache_cookie *, cookie )
  292. __field(struct fscache_object *, object )
  293. __array(char, state, 8 )
  294. __field(bool, wait )
  295. __field(bool, oob )
  296. __field(s8, event_num )
  297. ),
  298. TP_fast_assign(
  299. __entry->cookie = object->cookie;
  300. __entry->object = object;
  301. __entry->wait = wait;
  302. __entry->oob = oob;
  303. __entry->event_num = event_num;
  304. memcpy(__entry->state, state->short_name, 8);
  305. ),
  306. TP_printk("c=%p o=%p %s %s%sev=%d",
  307. __entry->cookie,
  308. __entry->object,
  309. __entry->state,
  310. __print_symbolic(__entry->wait,
  311. { true, "WAIT" },
  312. { false, "WORK" }),
  313. __print_symbolic(__entry->oob,
  314. { true, " OOB " },
  315. { false, " " }),
  316. __entry->event_num)
  317. );
  318. TRACE_EVENT(fscache_page,
  319. TP_PROTO(struct fscache_cookie *cookie, struct page *page,
  320. enum fscache_page_trace why),
  321. TP_ARGS(cookie, page, why),
  322. TP_STRUCT__entry(
  323. __field(struct fscache_cookie *, cookie )
  324. __field(pgoff_t, page )
  325. __field(enum fscache_page_trace, why )
  326. ),
  327. TP_fast_assign(
  328. __entry->cookie = cookie;
  329. __entry->page = page->index;
  330. __entry->why = why;
  331. ),
  332. TP_printk("c=%p %s pg=%lx",
  333. __entry->cookie,
  334. __print_symbolic(__entry->why, fscache_page_traces),
  335. __entry->page)
  336. );
  337. TRACE_EVENT(fscache_check_page,
  338. TP_PROTO(struct fscache_cookie *cookie, struct page *page,
  339. void *val, int n),
  340. TP_ARGS(cookie, page, val, n),
  341. TP_STRUCT__entry(
  342. __field(struct fscache_cookie *, cookie )
  343. __field(void *, page )
  344. __field(void *, val )
  345. __field(int, n )
  346. ),
  347. TP_fast_assign(
  348. __entry->cookie = cookie;
  349. __entry->page = page;
  350. __entry->val = val;
  351. __entry->n = n;
  352. ),
  353. TP_printk("c=%p pg=%p val=%p n=%d",
  354. __entry->cookie, __entry->page, __entry->val, __entry->n)
  355. );
  356. TRACE_EVENT(fscache_wake_cookie,
  357. TP_PROTO(struct fscache_cookie *cookie),
  358. TP_ARGS(cookie),
  359. TP_STRUCT__entry(
  360. __field(struct fscache_cookie *, cookie )
  361. ),
  362. TP_fast_assign(
  363. __entry->cookie = cookie;
  364. ),
  365. TP_printk("c=%p", __entry->cookie)
  366. );
  367. TRACE_EVENT(fscache_op,
  368. TP_PROTO(struct fscache_cookie *cookie, struct fscache_operation *op,
  369. enum fscache_op_trace why),
  370. TP_ARGS(cookie, op, why),
  371. TP_STRUCT__entry(
  372. __field(struct fscache_cookie *, cookie )
  373. __field(struct fscache_operation *, op )
  374. __field(enum fscache_op_trace, why )
  375. ),
  376. TP_fast_assign(
  377. __entry->cookie = cookie;
  378. __entry->op = op;
  379. __entry->why = why;
  380. ),
  381. TP_printk("c=%p op=%p %s",
  382. __entry->cookie, __entry->op,
  383. __print_symbolic(__entry->why, fscache_op_traces))
  384. );
  385. TRACE_EVENT(fscache_page_op,
  386. TP_PROTO(struct fscache_cookie *cookie, struct page *page,
  387. struct fscache_operation *op, enum fscache_page_op_trace what),
  388. TP_ARGS(cookie, page, op, what),
  389. TP_STRUCT__entry(
  390. __field(struct fscache_cookie *, cookie )
  391. __field(pgoff_t, page )
  392. __field(struct fscache_operation *, op )
  393. __field(enum fscache_page_op_trace, what )
  394. ),
  395. TP_fast_assign(
  396. __entry->cookie = cookie;
  397. __entry->page = page ? page->index : 0;
  398. __entry->op = op;
  399. __entry->what = what;
  400. ),
  401. TP_printk("c=%p %s pg=%lx op=%p",
  402. __entry->cookie,
  403. __print_symbolic(__entry->what, fscache_page_op_traces),
  404. __entry->page, __entry->op)
  405. );
  406. TRACE_EVENT(fscache_wrote_page,
  407. TP_PROTO(struct fscache_cookie *cookie, struct page *page,
  408. struct fscache_operation *op, int ret),
  409. TP_ARGS(cookie, page, op, ret),
  410. TP_STRUCT__entry(
  411. __field(struct fscache_cookie *, cookie )
  412. __field(pgoff_t, page )
  413. __field(struct fscache_operation *, op )
  414. __field(int, ret )
  415. ),
  416. TP_fast_assign(
  417. __entry->cookie = cookie;
  418. __entry->page = page->index;
  419. __entry->op = op;
  420. __entry->ret = ret;
  421. ),
  422. TP_printk("c=%p pg=%lx op=%p ret=%d",
  423. __entry->cookie, __entry->page, __entry->op, __entry->ret)
  424. );
  425. TRACE_EVENT(fscache_gang_lookup,
  426. TP_PROTO(struct fscache_cookie *cookie, struct fscache_operation *op,
  427. void **results, int n, pgoff_t store_limit),
  428. TP_ARGS(cookie, op, results, n, store_limit),
  429. TP_STRUCT__entry(
  430. __field(struct fscache_cookie *, cookie )
  431. __field(struct fscache_operation *, op )
  432. __field(pgoff_t, results0 )
  433. __field(int, n )
  434. __field(pgoff_t, store_limit )
  435. ),
  436. TP_fast_assign(
  437. __entry->cookie = cookie;
  438. __entry->op = op;
  439. __entry->results0 = results[0] ? ((struct page *)results[0])->index : (pgoff_t)-1;
  440. __entry->n = n;
  441. __entry->store_limit = store_limit;
  442. ),
  443. TP_printk("c=%p op=%p r0=%lx n=%d sl=%lx",
  444. __entry->cookie, __entry->op, __entry->results0, __entry->n,
  445. __entry->store_limit)
  446. );
  447. #endif /* _TRACE_FSCACHE_H */
  448. /* This part must be outside protection */
  449. #include <trace/define_trace.h>