sunrpc.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #undef TRACE_SYSTEM
  2. #define TRACE_SYSTEM sunrpc
  3. #if !defined(_TRACE_SUNRPC_H) || defined(TRACE_HEADER_MULTI_READ)
  4. #define _TRACE_SUNRPC_H
  5. #include <linux/sunrpc/sched.h>
  6. #include <linux/sunrpc/clnt.h>
  7. #include <net/tcp_states.h>
  8. #include <linux/net.h>
  9. #include <linux/tracepoint.h>
  10. DECLARE_EVENT_CLASS(rpc_task_status,
  11. TP_PROTO(struct rpc_task *task),
  12. TP_ARGS(task),
  13. TP_STRUCT__entry(
  14. __field(const struct rpc_task *, task)
  15. __field(const struct rpc_clnt *, clnt)
  16. __field(int, status)
  17. ),
  18. TP_fast_assign(
  19. __entry->task = task;
  20. __entry->clnt = task->tk_client;
  21. __entry->status = task->tk_status;
  22. ),
  23. TP_printk("task:%p@%p, status %d",__entry->task, __entry->clnt, __entry->status)
  24. );
  25. DEFINE_EVENT(rpc_task_status, rpc_call_status,
  26. TP_PROTO(struct rpc_task *task),
  27. TP_ARGS(task)
  28. );
  29. DEFINE_EVENT(rpc_task_status, rpc_bind_status,
  30. TP_PROTO(struct rpc_task *task),
  31. TP_ARGS(task)
  32. );
  33. TRACE_EVENT(rpc_connect_status,
  34. TP_PROTO(struct rpc_task *task, int status),
  35. TP_ARGS(task, status),
  36. TP_STRUCT__entry(
  37. __field(const struct rpc_task *, task)
  38. __field(const struct rpc_clnt *, clnt)
  39. __field(int, status)
  40. ),
  41. TP_fast_assign(
  42. __entry->task = task;
  43. __entry->clnt = task->tk_client;
  44. __entry->status = status;
  45. ),
  46. TP_printk("task:%p@%p, status %d",__entry->task, __entry->clnt, __entry->status)
  47. );
  48. DECLARE_EVENT_CLASS(rpc_task_running,
  49. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const void *action),
  50. TP_ARGS(clnt, task, action),
  51. TP_STRUCT__entry(
  52. __field(const struct rpc_clnt *, clnt)
  53. __field(const struct rpc_task *, task)
  54. __field(const void *, action)
  55. __field(unsigned long, runstate)
  56. __field(int, status)
  57. __field(unsigned short, flags)
  58. ),
  59. TP_fast_assign(
  60. __entry->clnt = clnt;
  61. __entry->task = task;
  62. __entry->action = action;
  63. __entry->runstate = task->tk_runstate;
  64. __entry->status = task->tk_status;
  65. __entry->flags = task->tk_flags;
  66. ),
  67. TP_printk("task:%p@%p flags=%4.4x state=%4.4lx status=%d action=%pf",
  68. __entry->task,
  69. __entry->clnt,
  70. __entry->flags,
  71. __entry->runstate,
  72. __entry->status,
  73. __entry->action
  74. )
  75. );
  76. DEFINE_EVENT(rpc_task_running, rpc_task_begin,
  77. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const void *action),
  78. TP_ARGS(clnt, task, action)
  79. );
  80. DEFINE_EVENT(rpc_task_running, rpc_task_run_action,
  81. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const void *action),
  82. TP_ARGS(clnt, task, action)
  83. );
  84. DEFINE_EVENT(rpc_task_running, rpc_task_complete,
  85. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const void *action),
  86. TP_ARGS(clnt, task, action)
  87. );
  88. DECLARE_EVENT_CLASS(rpc_task_queued,
  89. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const struct rpc_wait_queue *q),
  90. TP_ARGS(clnt, task, q),
  91. TP_STRUCT__entry(
  92. __field(const struct rpc_clnt *, clnt)
  93. __field(const struct rpc_task *, task)
  94. __field(unsigned long, timeout)
  95. __field(unsigned long, runstate)
  96. __field(int, status)
  97. __field(unsigned short, flags)
  98. __string(q_name, rpc_qname(q))
  99. ),
  100. TP_fast_assign(
  101. __entry->clnt = clnt;
  102. __entry->task = task;
  103. __entry->timeout = task->tk_timeout;
  104. __entry->runstate = task->tk_runstate;
  105. __entry->status = task->tk_status;
  106. __entry->flags = task->tk_flags;
  107. __assign_str(q_name, rpc_qname(q));
  108. ),
  109. TP_printk("task:%p@%p flags=%4.4x state=%4.4lx status=%d timeout=%lu queue=%s",
  110. __entry->task,
  111. __entry->clnt,
  112. __entry->flags,
  113. __entry->runstate,
  114. __entry->status,
  115. __entry->timeout,
  116. __get_str(q_name)
  117. )
  118. );
  119. DEFINE_EVENT(rpc_task_queued, rpc_task_sleep,
  120. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const struct rpc_wait_queue *q),
  121. TP_ARGS(clnt, task, q)
  122. );
  123. DEFINE_EVENT(rpc_task_queued, rpc_task_wakeup,
  124. TP_PROTO(const struct rpc_clnt *clnt, const struct rpc_task *task, const struct rpc_wait_queue *q),
  125. TP_ARGS(clnt, task, q)
  126. );
  127. #define rpc_show_socket_state(state) \
  128. __print_symbolic(state, \
  129. { SS_FREE, "FREE" }, \
  130. { SS_UNCONNECTED, "UNCONNECTED" }, \
  131. { SS_CONNECTING, "CONNECTING," }, \
  132. { SS_CONNECTED, "CONNECTED," }, \
  133. { SS_DISCONNECTING, "DISCONNECTING" })
  134. #define rpc_show_sock_state(state) \
  135. __print_symbolic(state, \
  136. { TCP_ESTABLISHED, "ESTABLISHED" }, \
  137. { TCP_SYN_SENT, "SYN_SENT" }, \
  138. { TCP_SYN_RECV, "SYN_RECV" }, \
  139. { TCP_FIN_WAIT1, "FIN_WAIT1" }, \
  140. { TCP_FIN_WAIT2, "FIN_WAIT2" }, \
  141. { TCP_TIME_WAIT, "TIME_WAIT" }, \
  142. { TCP_CLOSE, "CLOSE" }, \
  143. { TCP_CLOSE_WAIT, "CLOSE_WAIT" }, \
  144. { TCP_LAST_ACK, "LAST_ACK" }, \
  145. { TCP_LISTEN, "LISTEN" }, \
  146. { TCP_CLOSING, "CLOSING" })
  147. DECLARE_EVENT_CLASS(xs_socket_event,
  148. TP_PROTO(
  149. struct rpc_xprt *xprt,
  150. struct socket *socket
  151. ),
  152. TP_ARGS(xprt, socket),
  153. TP_STRUCT__entry(
  154. __field(unsigned int, socket_state)
  155. __field(unsigned int, sock_state)
  156. __field(unsigned long long, ino)
  157. __string(dstaddr,
  158. xprt->address_strings[RPC_DISPLAY_ADDR])
  159. __string(dstport,
  160. xprt->address_strings[RPC_DISPLAY_PORT])
  161. ),
  162. TP_fast_assign(
  163. struct inode *inode = SOCK_INODE(socket);
  164. __entry->socket_state = socket->state;
  165. __entry->sock_state = socket->sk->sk_state;
  166. __entry->ino = (unsigned long long)inode->i_ino;
  167. __assign_str(dstaddr,
  168. xprt->address_strings[RPC_DISPLAY_ADDR]);
  169. __assign_str(dstport,
  170. xprt->address_strings[RPC_DISPLAY_PORT]);
  171. ),
  172. TP_printk(
  173. "socket:[%llu] dstaddr=%s/%s "
  174. "state=%u (%s) sk_state=%u (%s)",
  175. __entry->ino, __get_str(dstaddr), __get_str(dstport),
  176. __entry->socket_state,
  177. rpc_show_socket_state(__entry->socket_state),
  178. __entry->sock_state,
  179. rpc_show_sock_state(__entry->sock_state)
  180. )
  181. );
  182. #define DEFINE_RPC_SOCKET_EVENT(name) \
  183. DEFINE_EVENT(xs_socket_event, name, \
  184. TP_PROTO( \
  185. struct rpc_xprt *xprt, \
  186. struct socket *socket \
  187. ), \
  188. TP_ARGS(xprt, socket))
  189. DECLARE_EVENT_CLASS(xs_socket_event_done,
  190. TP_PROTO(
  191. struct rpc_xprt *xprt,
  192. struct socket *socket,
  193. int error
  194. ),
  195. TP_ARGS(xprt, socket, error),
  196. TP_STRUCT__entry(
  197. __field(int, error)
  198. __field(unsigned int, socket_state)
  199. __field(unsigned int, sock_state)
  200. __field(unsigned long long, ino)
  201. __string(dstaddr,
  202. xprt->address_strings[RPC_DISPLAY_ADDR])
  203. __string(dstport,
  204. xprt->address_strings[RPC_DISPLAY_PORT])
  205. ),
  206. TP_fast_assign(
  207. struct inode *inode = SOCK_INODE(socket);
  208. __entry->socket_state = socket->state;
  209. __entry->sock_state = socket->sk->sk_state;
  210. __entry->ino = (unsigned long long)inode->i_ino;
  211. __entry->error = error;
  212. __assign_str(dstaddr,
  213. xprt->address_strings[RPC_DISPLAY_ADDR]);
  214. __assign_str(dstport,
  215. xprt->address_strings[RPC_DISPLAY_PORT]);
  216. ),
  217. TP_printk(
  218. "error=%d socket:[%llu] dstaddr=%s/%s "
  219. "state=%u (%s) sk_state=%u (%s)",
  220. __entry->error,
  221. __entry->ino, __get_str(dstaddr), __get_str(dstport),
  222. __entry->socket_state,
  223. rpc_show_socket_state(__entry->socket_state),
  224. __entry->sock_state,
  225. rpc_show_sock_state(__entry->sock_state)
  226. )
  227. );
  228. #define DEFINE_RPC_SOCKET_EVENT_DONE(name) \
  229. DEFINE_EVENT(xs_socket_event_done, name, \
  230. TP_PROTO( \
  231. struct rpc_xprt *xprt, \
  232. struct socket *socket, \
  233. int error \
  234. ), \
  235. TP_ARGS(xprt, socket, error))
  236. DEFINE_RPC_SOCKET_EVENT(rpc_socket_state_change);
  237. DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_connect);
  238. DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_reset_connection);
  239. DEFINE_RPC_SOCKET_EVENT(rpc_socket_close);
  240. DEFINE_RPC_SOCKET_EVENT(rpc_socket_shutdown);
  241. #endif /* _TRACE_SUNRPC_H */
  242. #include <trace/define_trace.h>