trace_ibhdrs.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
  2. /*
  3. * Copyright(c) 2015 - 2017 Intel Corporation.
  4. */
  5. #if !defined(__HFI1_TRACE_IBHDRS_H) || defined(TRACE_HEADER_MULTI_READ)
  6. #define __HFI1_TRACE_IBHDRS_H
  7. #include <linux/tracepoint.h>
  8. #include <linux/trace_seq.h>
  9. #include "hfi.h"
  10. #undef TRACE_SYSTEM
  11. #define TRACE_SYSTEM hfi1_ibhdrs
  12. #define ib_opcode_name(opcode) { IB_OPCODE_##opcode, #opcode }
  13. #define show_ib_opcode(opcode) \
  14. __print_symbolic(opcode, \
  15. ib_opcode_name(RC_SEND_FIRST), \
  16. ib_opcode_name(RC_SEND_MIDDLE), \
  17. ib_opcode_name(RC_SEND_LAST), \
  18. ib_opcode_name(RC_SEND_LAST_WITH_IMMEDIATE), \
  19. ib_opcode_name(RC_SEND_ONLY), \
  20. ib_opcode_name(RC_SEND_ONLY_WITH_IMMEDIATE), \
  21. ib_opcode_name(RC_RDMA_WRITE_FIRST), \
  22. ib_opcode_name(RC_RDMA_WRITE_MIDDLE), \
  23. ib_opcode_name(RC_RDMA_WRITE_LAST), \
  24. ib_opcode_name(RC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
  25. ib_opcode_name(RC_RDMA_WRITE_ONLY), \
  26. ib_opcode_name(RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
  27. ib_opcode_name(RC_RDMA_READ_REQUEST), \
  28. ib_opcode_name(RC_RDMA_READ_RESPONSE_FIRST), \
  29. ib_opcode_name(RC_RDMA_READ_RESPONSE_MIDDLE), \
  30. ib_opcode_name(RC_RDMA_READ_RESPONSE_LAST), \
  31. ib_opcode_name(RC_RDMA_READ_RESPONSE_ONLY), \
  32. ib_opcode_name(RC_ACKNOWLEDGE), \
  33. ib_opcode_name(RC_ATOMIC_ACKNOWLEDGE), \
  34. ib_opcode_name(RC_COMPARE_SWAP), \
  35. ib_opcode_name(RC_FETCH_ADD), \
  36. ib_opcode_name(RC_SEND_LAST_WITH_INVALIDATE), \
  37. ib_opcode_name(RC_SEND_ONLY_WITH_INVALIDATE), \
  38. ib_opcode_name(TID_RDMA_WRITE_REQ), \
  39. ib_opcode_name(TID_RDMA_WRITE_RESP), \
  40. ib_opcode_name(TID_RDMA_WRITE_DATA), \
  41. ib_opcode_name(TID_RDMA_WRITE_DATA_LAST), \
  42. ib_opcode_name(TID_RDMA_READ_REQ), \
  43. ib_opcode_name(TID_RDMA_READ_RESP), \
  44. ib_opcode_name(TID_RDMA_RESYNC), \
  45. ib_opcode_name(TID_RDMA_ACK), \
  46. ib_opcode_name(UC_SEND_FIRST), \
  47. ib_opcode_name(UC_SEND_MIDDLE), \
  48. ib_opcode_name(UC_SEND_LAST), \
  49. ib_opcode_name(UC_SEND_LAST_WITH_IMMEDIATE), \
  50. ib_opcode_name(UC_SEND_ONLY), \
  51. ib_opcode_name(UC_SEND_ONLY_WITH_IMMEDIATE), \
  52. ib_opcode_name(UC_RDMA_WRITE_FIRST), \
  53. ib_opcode_name(UC_RDMA_WRITE_MIDDLE), \
  54. ib_opcode_name(UC_RDMA_WRITE_LAST), \
  55. ib_opcode_name(UC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
  56. ib_opcode_name(UC_RDMA_WRITE_ONLY), \
  57. ib_opcode_name(UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
  58. ib_opcode_name(UD_SEND_ONLY), \
  59. ib_opcode_name(UD_SEND_ONLY_WITH_IMMEDIATE), \
  60. ib_opcode_name(CNP))
  61. u8 ibhdr_exhdr_len(struct ib_header *hdr);
  62. const char *parse_everbs_hdrs(struct trace_seq *p, u8 opcode,
  63. u8 l4, u32 dest_qpn, u32 src_qpn,
  64. void *ehdrs);
  65. u8 hfi1_trace_opa_hdr_len(struct hfi1_opa_header *opah);
  66. u8 hfi1_trace_packet_hdr_len(struct hfi1_packet *packet);
  67. const char *hfi1_trace_get_packet_l4_str(u8 l4);
  68. void hfi1_trace_parse_9b_bth(struct ib_other_headers *ohdr,
  69. u8 *ack, bool *becn, bool *fecn, u8 *mig,
  70. u8 *se, u8 *pad, u8 *opcode, u8 *tver,
  71. u16 *pkey, u32 *psn, u32 *qpn);
  72. void hfi1_trace_parse_9b_hdr(struct ib_header *hdr, bool sc5,
  73. u8 *lnh, u8 *lver, u8 *sl, u8 *sc,
  74. u16 *len, u32 *dlid, u32 *slid);
  75. void hfi1_trace_parse_16b_bth(struct ib_other_headers *ohdr,
  76. u8 *ack, u8 *mig, u8 *opcode,
  77. u8 *pad, u8 *se, u8 *tver,
  78. u32 *psn, u32 *qpn);
  79. void hfi1_trace_parse_16b_hdr(struct hfi1_16b_header *hdr,
  80. u8 *age, bool *becn, bool *fecn,
  81. u8 *l4, u8 *rc, u8 *sc,
  82. u16 *entropy, u16 *len, u16 *pkey,
  83. u32 *dlid, u32 *slid);
  84. const char *hfi1_trace_fmt_lrh(struct trace_seq *p, bool bypass,
  85. u8 age, bool becn, bool fecn, u8 l4,
  86. u8 lnh, const char *lnh_name, u8 lver,
  87. u8 rc, u8 sc, u8 sl, u16 entropy,
  88. u16 len, u16 pkey, u32 dlid, u32 slid);
  89. const char *hfi1_trace_fmt_rest(struct trace_seq *p, bool bypass, u8 l4,
  90. u8 ack, bool becn, bool fecn, u8 mig,
  91. u8 se, u8 pad, u8 opcode, const char *opname,
  92. u8 tver, u16 pkey, u32 psn, u32 qpn,
  93. u32 dest_qpn, u32 src_qpn);
  94. const char *hfi1_trace_get_packet_l2_str(u8 l2);
  95. #define __parse_ib_ehdrs(op, l4, dest_qpn, src_qpn, ehdrs) \
  96. parse_everbs_hdrs(p, op, l4, dest_qpn, src_qpn, ehdrs)
  97. #define lrh_name(lrh) { HFI1_##lrh, #lrh }
  98. #define show_lnh(lrh) \
  99. __print_symbolic(lrh, \
  100. lrh_name(LRH_BTH), \
  101. lrh_name(LRH_GRH))
  102. DECLARE_EVENT_CLASS(hfi1_input_ibhdr_template,
  103. TP_PROTO(struct hfi1_devdata *dd,
  104. struct hfi1_packet *packet,
  105. bool sc5),
  106. TP_ARGS(dd, packet, sc5),
  107. TP_STRUCT__entry(
  108. DD_DEV_ENTRY(dd)
  109. __field(u8, etype)
  110. __field(u8, ack)
  111. __field(u8, age)
  112. __field(bool, becn)
  113. __field(bool, fecn)
  114. __field(u8, l2)
  115. __field(u8, l4)
  116. __field(u8, lnh)
  117. __field(u8, lver)
  118. __field(u8, mig)
  119. __field(u8, opcode)
  120. __field(u8, pad)
  121. __field(u8, rc)
  122. __field(u8, sc)
  123. __field(u8, se)
  124. __field(u8, sl)
  125. __field(u8, tver)
  126. __field(u16, entropy)
  127. __field(u16, len)
  128. __field(u16, pkey)
  129. __field(u32, dlid)
  130. __field(u32, psn)
  131. __field(u32, qpn)
  132. __field(u32, slid)
  133. __field(u32, dest_qpn)
  134. __field(u32, src_qpn)
  135. /* extended headers */
  136. __dynamic_array(u8, ehdrs,
  137. hfi1_trace_packet_hdr_len(packet))
  138. ),
  139. TP_fast_assign(
  140. DD_DEV_ASSIGN(dd);
  141. __entry->etype = packet->etype;
  142. __entry->l2 = hfi1_16B_get_l2(packet->hdr);
  143. __entry->dest_qpn = 0;
  144. __entry->src_qpn = 0;
  145. if (__entry->etype == RHF_RCV_TYPE_BYPASS) {
  146. hfi1_trace_parse_16b_hdr(packet->hdr,
  147. &__entry->age,
  148. &__entry->becn,
  149. &__entry->fecn,
  150. &__entry->l4,
  151. &__entry->rc,
  152. &__entry->sc,
  153. &__entry->entropy,
  154. &__entry->len,
  155. &__entry->pkey,
  156. &__entry->dlid,
  157. &__entry->slid);
  158. if (__entry->l4 == OPA_16B_L4_FM) {
  159. __entry->opcode = IB_OPCODE_UD_SEND_ONLY;
  160. __entry->dest_qpn = hfi1_16B_get_dest_qpn(packet->mgmt);
  161. __entry->src_qpn = hfi1_16B_get_src_qpn(packet->mgmt);
  162. } else {
  163. hfi1_trace_parse_16b_bth(packet->ohdr,
  164. &__entry->ack,
  165. &__entry->mig,
  166. &__entry->opcode,
  167. &__entry->pad,
  168. &__entry->se,
  169. &__entry->tver,
  170. &__entry->psn,
  171. &__entry->qpn);
  172. }
  173. } else {
  174. __entry->l4 = OPA_16B_L4_9B;
  175. hfi1_trace_parse_9b_hdr(packet->hdr, sc5,
  176. &__entry->lnh,
  177. &__entry->lver,
  178. &__entry->sl,
  179. &__entry->sc,
  180. &__entry->len,
  181. &__entry->dlid,
  182. &__entry->slid);
  183. hfi1_trace_parse_9b_bth(packet->ohdr,
  184. &__entry->ack,
  185. &__entry->becn,
  186. &__entry->fecn,
  187. &__entry->mig,
  188. &__entry->se,
  189. &__entry->pad,
  190. &__entry->opcode,
  191. &__entry->tver,
  192. &__entry->pkey,
  193. &__entry->psn,
  194. &__entry->qpn);
  195. }
  196. /* extended headers */
  197. if (__entry->l4 != OPA_16B_L4_FM)
  198. memcpy(__get_dynamic_array(ehdrs),
  199. &packet->ohdr->u,
  200. __get_dynamic_array_len(ehdrs));
  201. ),
  202. TP_printk("[%s] (%s) %s %s hlen:%d %s",
  203. __get_str(dev),
  204. __entry->etype != RHF_RCV_TYPE_BYPASS ?
  205. show_packettype(__entry->etype) :
  206. hfi1_trace_get_packet_l2_str(
  207. __entry->l2),
  208. hfi1_trace_fmt_lrh(p,
  209. __entry->etype ==
  210. RHF_RCV_TYPE_BYPASS,
  211. __entry->age,
  212. __entry->becn,
  213. __entry->fecn,
  214. __entry->l4,
  215. __entry->lnh,
  216. show_lnh(__entry->lnh),
  217. __entry->lver,
  218. __entry->rc,
  219. __entry->sc,
  220. __entry->sl,
  221. __entry->entropy,
  222. __entry->len,
  223. __entry->pkey,
  224. __entry->dlid,
  225. __entry->slid),
  226. hfi1_trace_fmt_rest(p,
  227. __entry->etype ==
  228. RHF_RCV_TYPE_BYPASS,
  229. __entry->l4,
  230. __entry->ack,
  231. __entry->becn,
  232. __entry->fecn,
  233. __entry->mig,
  234. __entry->se,
  235. __entry->pad,
  236. __entry->opcode,
  237. show_ib_opcode(__entry->opcode),
  238. __entry->tver,
  239. __entry->pkey,
  240. __entry->psn,
  241. __entry->qpn,
  242. __entry->dest_qpn,
  243. __entry->src_qpn),
  244. /* extended headers */
  245. __get_dynamic_array_len(ehdrs),
  246. __parse_ib_ehdrs(
  247. __entry->opcode,
  248. __entry->l4,
  249. __entry->dest_qpn,
  250. __entry->src_qpn,
  251. (void *)__get_dynamic_array(ehdrs))
  252. )
  253. );
  254. DEFINE_EVENT(hfi1_input_ibhdr_template, input_ibhdr,
  255. TP_PROTO(struct hfi1_devdata *dd,
  256. struct hfi1_packet *packet, bool sc5),
  257. TP_ARGS(dd, packet, sc5));
  258. DECLARE_EVENT_CLASS(hfi1_output_ibhdr_template,
  259. TP_PROTO(struct hfi1_devdata *dd,
  260. struct hfi1_opa_header *opah, bool sc5),
  261. TP_ARGS(dd, opah, sc5),
  262. TP_STRUCT__entry(
  263. DD_DEV_ENTRY(dd)
  264. __field(u8, hdr_type)
  265. __field(u8, ack)
  266. __field(u8, age)
  267. __field(bool, becn)
  268. __field(bool, fecn)
  269. __field(u8, l4)
  270. __field(u8, lnh)
  271. __field(u8, lver)
  272. __field(u8, mig)
  273. __field(u8, opcode)
  274. __field(u8, pad)
  275. __field(u8, rc)
  276. __field(u8, sc)
  277. __field(u8, se)
  278. __field(u8, sl)
  279. __field(u8, tver)
  280. __field(u16, entropy)
  281. __field(u16, len)
  282. __field(u16, pkey)
  283. __field(u32, dlid)
  284. __field(u32, psn)
  285. __field(u32, qpn)
  286. __field(u32, slid)
  287. __field(u32, dest_qpn)
  288. __field(u32, src_qpn)
  289. /* extended headers */
  290. __dynamic_array(u8, ehdrs,
  291. hfi1_trace_opa_hdr_len(opah))
  292. ),
  293. TP_fast_assign(
  294. struct ib_other_headers *ohdr;
  295. DD_DEV_ASSIGN(dd);
  296. __entry->hdr_type = opah->hdr_type;
  297. __entry->dest_qpn = 0;
  298. __entry->src_qpn = 0;
  299. if (__entry->hdr_type) {
  300. hfi1_trace_parse_16b_hdr(&opah->opah,
  301. &__entry->age,
  302. &__entry->becn,
  303. &__entry->fecn,
  304. &__entry->l4,
  305. &__entry->rc,
  306. &__entry->sc,
  307. &__entry->entropy,
  308. &__entry->len,
  309. &__entry->pkey,
  310. &__entry->dlid,
  311. &__entry->slid);
  312. if (__entry->l4 == OPA_16B_L4_FM) {
  313. ohdr = NULL;
  314. __entry->opcode = IB_OPCODE_UD_SEND_ONLY;
  315. __entry->dest_qpn = hfi1_16B_get_dest_qpn(&opah->opah.u.mgmt);
  316. __entry->src_qpn = hfi1_16B_get_src_qpn(&opah->opah.u.mgmt);
  317. } else {
  318. if (__entry->l4 == OPA_16B_L4_IB_LOCAL)
  319. ohdr = &opah->opah.u.oth;
  320. else
  321. ohdr = &opah->opah.u.l.oth;
  322. hfi1_trace_parse_16b_bth(ohdr,
  323. &__entry->ack,
  324. &__entry->mig,
  325. &__entry->opcode,
  326. &__entry->pad,
  327. &__entry->se,
  328. &__entry->tver,
  329. &__entry->psn,
  330. &__entry->qpn);
  331. }
  332. } else {
  333. __entry->l4 = OPA_16B_L4_9B;
  334. hfi1_trace_parse_9b_hdr(&opah->ibh, sc5,
  335. &__entry->lnh,
  336. &__entry->lver,
  337. &__entry->sl,
  338. &__entry->sc,
  339. &__entry->len,
  340. &__entry->dlid,
  341. &__entry->slid);
  342. if (__entry->lnh == HFI1_LRH_BTH)
  343. ohdr = &opah->ibh.u.oth;
  344. else
  345. ohdr = &opah->ibh.u.l.oth;
  346. hfi1_trace_parse_9b_bth(ohdr,
  347. &__entry->ack,
  348. &__entry->becn,
  349. &__entry->fecn,
  350. &__entry->mig,
  351. &__entry->se,
  352. &__entry->pad,
  353. &__entry->opcode,
  354. &__entry->tver,
  355. &__entry->pkey,
  356. &__entry->psn,
  357. &__entry->qpn);
  358. }
  359. /* extended headers */
  360. if (__entry->l4 != OPA_16B_L4_FM)
  361. memcpy(__get_dynamic_array(ehdrs),
  362. &ohdr->u, __get_dynamic_array_len(ehdrs));
  363. ),
  364. TP_printk("[%s] (%s) %s %s hlen:%d %s",
  365. __get_str(dev),
  366. hfi1_trace_get_packet_l4_str(__entry->l4),
  367. hfi1_trace_fmt_lrh(p,
  368. !!__entry->hdr_type,
  369. __entry->age,
  370. __entry->becn,
  371. __entry->fecn,
  372. __entry->l4,
  373. __entry->lnh,
  374. show_lnh(__entry->lnh),
  375. __entry->lver,
  376. __entry->rc,
  377. __entry->sc,
  378. __entry->sl,
  379. __entry->entropy,
  380. __entry->len,
  381. __entry->pkey,
  382. __entry->dlid,
  383. __entry->slid),
  384. hfi1_trace_fmt_rest(p,
  385. !!__entry->hdr_type,
  386. __entry->l4,
  387. __entry->ack,
  388. __entry->becn,
  389. __entry->fecn,
  390. __entry->mig,
  391. __entry->se,
  392. __entry->pad,
  393. __entry->opcode,
  394. show_ib_opcode(__entry->opcode),
  395. __entry->tver,
  396. __entry->pkey,
  397. __entry->psn,
  398. __entry->qpn,
  399. __entry->dest_qpn,
  400. __entry->src_qpn),
  401. /* extended headers */
  402. __get_dynamic_array_len(ehdrs),
  403. __parse_ib_ehdrs(
  404. __entry->opcode,
  405. __entry->l4,
  406. __entry->dest_qpn,
  407. __entry->src_qpn,
  408. (void *)__get_dynamic_array(ehdrs))
  409. )
  410. );
  411. DEFINE_EVENT(hfi1_output_ibhdr_template, pio_output_ibhdr,
  412. TP_PROTO(struct hfi1_devdata *dd,
  413. struct hfi1_opa_header *opah, bool sc5),
  414. TP_ARGS(dd, opah, sc5));
  415. DEFINE_EVENT(hfi1_output_ibhdr_template, ack_output_ibhdr,
  416. TP_PROTO(struct hfi1_devdata *dd,
  417. struct hfi1_opa_header *opah, bool sc5),
  418. TP_ARGS(dd, opah, sc5));
  419. DEFINE_EVENT(hfi1_output_ibhdr_template, sdma_output_ibhdr,
  420. TP_PROTO(struct hfi1_devdata *dd,
  421. struct hfi1_opa_header *opah, bool sc5),
  422. TP_ARGS(dd, opah, sc5));
  423. #endif /* __HFI1_TRACE_IBHDRS_H */
  424. #undef TRACE_INCLUDE_PATH
  425. #undef TRACE_INCLUDE_FILE
  426. #define TRACE_INCLUDE_PATH .
  427. #define TRACE_INCLUDE_FILE trace_ibhdrs
  428. #include <trace/define_trace.h>