1 /* 2 * Copyright(c) 2015 - 2017 Intel Corporation. 3 * 4 * This file is provided under a dual BSD/GPLv2 license. When using or 5 * redistributing this file, you may do so under either license. 6 * 7 * GPL LICENSE SUMMARY 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of version 2 of the GNU General Public License as 11 * published by the Free Software Foundation. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 * 18 * BSD LICENSE 19 * 20 * Redistribution and use in source and binary forms, with or without 21 * modification, are permitted provided that the following conditions 22 * are met: 23 * 24 * - Redistributions of source code must retain the above copyright 25 * notice, this list of conditions and the following disclaimer. 26 * - Redistributions in binary form must reproduce the above copyright 27 * notice, this list of conditions and the following disclaimer in 28 * the documentation and/or other materials provided with the 29 * distribution. 30 * - Neither the name of Intel Corporation nor the names of its 31 * contributors may be used to endorse or promote products derived 32 * from this software without specific prior written permission. 33 * 34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 35 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 37 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 38 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 40 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 41 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 42 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 43 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 44 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45 * 46 */ 47 #if !defined(__HFI1_TRACE_IBHDRS_H) || defined(TRACE_HEADER_MULTI_READ) 48 #define __HFI1_TRACE_IBHDRS_H 49 50 #include <linux/tracepoint.h> 51 #include <linux/trace_seq.h> 52 53 #include "hfi.h" 54 55 #undef TRACE_SYSTEM 56 #define TRACE_SYSTEM hfi1_ibhdrs 57 58 #define ib_opcode_name(opcode) { IB_OPCODE_##opcode, #opcode } 59 #define show_ib_opcode(opcode) \ 60 __print_symbolic(opcode, \ 61 ib_opcode_name(RC_SEND_FIRST), \ 62 ib_opcode_name(RC_SEND_MIDDLE), \ 63 ib_opcode_name(RC_SEND_LAST), \ 64 ib_opcode_name(RC_SEND_LAST_WITH_IMMEDIATE), \ 65 ib_opcode_name(RC_SEND_ONLY), \ 66 ib_opcode_name(RC_SEND_ONLY_WITH_IMMEDIATE), \ 67 ib_opcode_name(RC_RDMA_WRITE_FIRST), \ 68 ib_opcode_name(RC_RDMA_WRITE_MIDDLE), \ 69 ib_opcode_name(RC_RDMA_WRITE_LAST), \ 70 ib_opcode_name(RC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \ 71 ib_opcode_name(RC_RDMA_WRITE_ONLY), \ 72 ib_opcode_name(RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \ 73 ib_opcode_name(RC_RDMA_READ_REQUEST), \ 74 ib_opcode_name(RC_RDMA_READ_RESPONSE_FIRST), \ 75 ib_opcode_name(RC_RDMA_READ_RESPONSE_MIDDLE), \ 76 ib_opcode_name(RC_RDMA_READ_RESPONSE_LAST), \ 77 ib_opcode_name(RC_RDMA_READ_RESPONSE_ONLY), \ 78 ib_opcode_name(RC_ACKNOWLEDGE), \ 79 ib_opcode_name(RC_ATOMIC_ACKNOWLEDGE), \ 80 ib_opcode_name(RC_COMPARE_SWAP), \ 81 ib_opcode_name(RC_FETCH_ADD), \ 82 ib_opcode_name(RC_SEND_LAST_WITH_INVALIDATE), \ 83 ib_opcode_name(RC_SEND_ONLY_WITH_INVALIDATE), \ 84 ib_opcode_name(TID_RDMA_WRITE_REQ), \ 85 ib_opcode_name(TID_RDMA_WRITE_RESP), \ 86 ib_opcode_name(TID_RDMA_WRITE_DATA), \ 87 ib_opcode_name(TID_RDMA_WRITE_DATA_LAST), \ 88 ib_opcode_name(TID_RDMA_READ_REQ), \ 89 ib_opcode_name(TID_RDMA_READ_RESP), \ 90 ib_opcode_name(TID_RDMA_RESYNC), \ 91 ib_opcode_name(TID_RDMA_ACK), \ 92 ib_opcode_name(UC_SEND_FIRST), \ 93 ib_opcode_name(UC_SEND_MIDDLE), \ 94 ib_opcode_name(UC_SEND_LAST), \ 95 ib_opcode_name(UC_SEND_LAST_WITH_IMMEDIATE), \ 96 ib_opcode_name(UC_SEND_ONLY), \ 97 ib_opcode_name(UC_SEND_ONLY_WITH_IMMEDIATE), \ 98 ib_opcode_name(UC_RDMA_WRITE_FIRST), \ 99 ib_opcode_name(UC_RDMA_WRITE_MIDDLE), \ 100 ib_opcode_name(UC_RDMA_WRITE_LAST), \ 101 ib_opcode_name(UC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \ 102 ib_opcode_name(UC_RDMA_WRITE_ONLY), \ 103 ib_opcode_name(UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \ 104 ib_opcode_name(UD_SEND_ONLY), \ 105 ib_opcode_name(UD_SEND_ONLY_WITH_IMMEDIATE), \ 106 ib_opcode_name(CNP)) 107 108 u8 ibhdr_exhdr_len(struct ib_header *hdr); 109 const char *parse_everbs_hdrs(struct trace_seq *p, u8 opcode, 110 u8 l4, u32 dest_qpn, u32 src_qpn, 111 void *ehdrs); 112 u8 hfi1_trace_opa_hdr_len(struct hfi1_opa_header *opah); 113 u8 hfi1_trace_packet_hdr_len(struct hfi1_packet *packet); 114 const char *hfi1_trace_get_packet_l4_str(u8 l4); 115 void hfi1_trace_parse_9b_bth(struct ib_other_headers *ohdr, 116 u8 *ack, bool *becn, bool *fecn, u8 *mig, 117 u8 *se, u8 *pad, u8 *opcode, u8 *tver, 118 u16 *pkey, u32 *psn, u32 *qpn); 119 void hfi1_trace_parse_9b_hdr(struct ib_header *hdr, bool sc5, 120 u8 *lnh, u8 *lver, u8 *sl, u8 *sc, 121 u16 *len, u32 *dlid, u32 *slid); 122 void hfi1_trace_parse_16b_bth(struct ib_other_headers *ohdr, 123 u8 *ack, u8 *mig, u8 *opcode, 124 u8 *pad, u8 *se, u8 *tver, 125 u32 *psn, u32 *qpn); 126 void hfi1_trace_parse_16b_hdr(struct hfi1_16b_header *hdr, 127 u8 *age, bool *becn, bool *fecn, 128 u8 *l4, u8 *rc, u8 *sc, 129 u16 *entropy, u16 *len, u16 *pkey, 130 u32 *dlid, u32 *slid); 131 132 const char *hfi1_trace_fmt_lrh(struct trace_seq *p, bool bypass, 133 u8 age, bool becn, bool fecn, u8 l4, 134 u8 lnh, const char *lnh_name, u8 lver, 135 u8 rc, u8 sc, u8 sl, u16 entropy, 136 u16 len, u16 pkey, u32 dlid, u32 slid); 137 138 const char *hfi1_trace_fmt_rest(struct trace_seq *p, bool bypass, u8 l4, 139 u8 ack, bool becn, bool fecn, u8 mig, 140 u8 se, u8 pad, u8 opcode, const char *opname, 141 u8 tver, u16 pkey, u32 psn, u32 qpn, 142 u32 dest_qpn, u32 src_qpn); 143 144 const char *hfi1_trace_get_packet_l2_str(u8 l2); 145 146 #define __parse_ib_ehdrs(op, l4, dest_qpn, src_qpn, ehdrs) \ 147 parse_everbs_hdrs(p, op, l4, dest_qpn, src_qpn, ehdrs) 148 149 #define lrh_name(lrh) { HFI1_##lrh, #lrh } 150 #define show_lnh(lrh) \ 151 __print_symbolic(lrh, \ 152 lrh_name(LRH_BTH), \ 153 lrh_name(LRH_GRH)) 154 155 DECLARE_EVENT_CLASS(hfi1_input_ibhdr_template, 156 TP_PROTO(struct hfi1_devdata *dd, 157 struct hfi1_packet *packet, 158 bool sc5), 159 TP_ARGS(dd, packet, sc5), 160 TP_STRUCT__entry( 161 DD_DEV_ENTRY(dd) 162 __field(u8, etype) 163 __field(u8, ack) 164 __field(u8, age) 165 __field(bool, becn) 166 __field(bool, fecn) 167 __field(u8, l2) 168 __field(u8, l4) 169 __field(u8, lnh) 170 __field(u8, lver) 171 __field(u8, mig) 172 __field(u8, opcode) 173 __field(u8, pad) 174 __field(u8, rc) 175 __field(u8, sc) 176 __field(u8, se) 177 __field(u8, sl) 178 __field(u8, tver) 179 __field(u16, entropy) 180 __field(u16, len) 181 __field(u16, pkey) 182 __field(u32, dlid) 183 __field(u32, psn) 184 __field(u32, qpn) 185 __field(u32, slid) 186 __field(u32, dest_qpn) 187 __field(u32, src_qpn) 188 /* extended headers */ 189 __dynamic_array(u8, ehdrs, 190 hfi1_trace_packet_hdr_len(packet)) 191 ), 192 TP_fast_assign( 193 DD_DEV_ASSIGN(dd); 194 195 __entry->etype = packet->etype; 196 __entry->l2 = hfi1_16B_get_l2(packet->hdr); 197 __entry->dest_qpn = 0; 198 __entry->src_qpn = 0; 199 if (__entry->etype == RHF_RCV_TYPE_BYPASS) { 200 hfi1_trace_parse_16b_hdr(packet->hdr, 201 &__entry->age, 202 &__entry->becn, 203 &__entry->fecn, 204 &__entry->l4, 205 &__entry->rc, 206 &__entry->sc, 207 &__entry->entropy, 208 &__entry->len, 209 &__entry->pkey, 210 &__entry->dlid, 211 &__entry->slid); 212 213 if (__entry->l4 == OPA_16B_L4_FM) { 214 __entry->opcode = IB_OPCODE_UD_SEND_ONLY; 215 __entry->dest_qpn = hfi1_16B_get_dest_qpn(packet->mgmt); 216 __entry->src_qpn = hfi1_16B_get_src_qpn(packet->mgmt); 217 } else { 218 hfi1_trace_parse_16b_bth(packet->ohdr, 219 &__entry->ack, 220 &__entry->mig, 221 &__entry->opcode, 222 &__entry->pad, 223 &__entry->se, 224 &__entry->tver, 225 &__entry->psn, 226 &__entry->qpn); 227 } 228 } else { 229 __entry->l4 = OPA_16B_L4_9B; 230 hfi1_trace_parse_9b_hdr(packet->hdr, sc5, 231 &__entry->lnh, 232 &__entry->lver, 233 &__entry->sl, 234 &__entry->sc, 235 &__entry->len, 236 &__entry->dlid, 237 &__entry->slid); 238 239 hfi1_trace_parse_9b_bth(packet->ohdr, 240 &__entry->ack, 241 &__entry->becn, 242 &__entry->fecn, 243 &__entry->mig, 244 &__entry->se, 245 &__entry->pad, 246 &__entry->opcode, 247 &__entry->tver, 248 &__entry->pkey, 249 &__entry->psn, 250 &__entry->qpn); 251 } 252 /* extended headers */ 253 if (__entry->l4 != OPA_16B_L4_FM) 254 memcpy(__get_dynamic_array(ehdrs), 255 &packet->ohdr->u, 256 __get_dynamic_array_len(ehdrs)); 257 ), 258 TP_printk("[%s] (%s) %s %s hlen:%d %s", 259 __get_str(dev), 260 __entry->etype != RHF_RCV_TYPE_BYPASS ? 261 show_packettype(__entry->etype) : 262 hfi1_trace_get_packet_l2_str( 263 __entry->l2), 264 hfi1_trace_fmt_lrh(p, 265 __entry->etype == 266 RHF_RCV_TYPE_BYPASS, 267 __entry->age, 268 __entry->becn, 269 __entry->fecn, 270 __entry->l4, 271 __entry->lnh, 272 show_lnh(__entry->lnh), 273 __entry->lver, 274 __entry->rc, 275 __entry->sc, 276 __entry->sl, 277 __entry->entropy, 278 __entry->len, 279 __entry->pkey, 280 __entry->dlid, 281 __entry->slid), 282 hfi1_trace_fmt_rest(p, 283 __entry->etype == 284 RHF_RCV_TYPE_BYPASS, 285 __entry->l4, 286 __entry->ack, 287 __entry->becn, 288 __entry->fecn, 289 __entry->mig, 290 __entry->se, 291 __entry->pad, 292 __entry->opcode, 293 show_ib_opcode(__entry->opcode), 294 __entry->tver, 295 __entry->pkey, 296 __entry->psn, 297 __entry->qpn, 298 __entry->dest_qpn, 299 __entry->src_qpn), 300 /* extended headers */ 301 __get_dynamic_array_len(ehdrs), 302 __parse_ib_ehdrs( 303 __entry->opcode, 304 __entry->l4, 305 __entry->dest_qpn, 306 __entry->src_qpn, 307 (void *)__get_dynamic_array(ehdrs)) 308 ) 309 ); 310 311 DEFINE_EVENT(hfi1_input_ibhdr_template, input_ibhdr, 312 TP_PROTO(struct hfi1_devdata *dd, 313 struct hfi1_packet *packet, bool sc5), 314 TP_ARGS(dd, packet, sc5)); 315 316 DECLARE_EVENT_CLASS(hfi1_output_ibhdr_template, 317 TP_PROTO(struct hfi1_devdata *dd, 318 struct hfi1_opa_header *opah, bool sc5), 319 TP_ARGS(dd, opah, sc5), 320 TP_STRUCT__entry( 321 DD_DEV_ENTRY(dd) 322 __field(u8, hdr_type) 323 __field(u8, ack) 324 __field(u8, age) 325 __field(bool, becn) 326 __field(bool, fecn) 327 __field(u8, l4) 328 __field(u8, lnh) 329 __field(u8, lver) 330 __field(u8, mig) 331 __field(u8, opcode) 332 __field(u8, pad) 333 __field(u8, rc) 334 __field(u8, sc) 335 __field(u8, se) 336 __field(u8, sl) 337 __field(u8, tver) 338 __field(u16, entropy) 339 __field(u16, len) 340 __field(u16, pkey) 341 __field(u32, dlid) 342 __field(u32, psn) 343 __field(u32, qpn) 344 __field(u32, slid) 345 __field(u32, dest_qpn) 346 __field(u32, src_qpn) 347 /* extended headers */ 348 __dynamic_array(u8, ehdrs, 349 hfi1_trace_opa_hdr_len(opah)) 350 ), 351 TP_fast_assign( 352 struct ib_other_headers *ohdr; 353 354 DD_DEV_ASSIGN(dd); 355 356 __entry->hdr_type = opah->hdr_type; 357 __entry->dest_qpn = 0; 358 __entry->src_qpn = 0; 359 if (__entry->hdr_type) { 360 hfi1_trace_parse_16b_hdr(&opah->opah, 361 &__entry->age, 362 &__entry->becn, 363 &__entry->fecn, 364 &__entry->l4, 365 &__entry->rc, 366 &__entry->sc, 367 &__entry->entropy, 368 &__entry->len, 369 &__entry->pkey, 370 &__entry->dlid, 371 &__entry->slid); 372 373 if (__entry->l4 == OPA_16B_L4_FM) { 374 ohdr = NULL; 375 __entry->opcode = IB_OPCODE_UD_SEND_ONLY; 376 __entry->dest_qpn = hfi1_16B_get_dest_qpn(&opah->opah.u.mgmt); 377 __entry->src_qpn = hfi1_16B_get_src_qpn(&opah->opah.u.mgmt); 378 } else { 379 if (__entry->l4 == OPA_16B_L4_IB_LOCAL) 380 ohdr = &opah->opah.u.oth; 381 else 382 ohdr = &opah->opah.u.l.oth; 383 hfi1_trace_parse_16b_bth(ohdr, 384 &__entry->ack, 385 &__entry->mig, 386 &__entry->opcode, 387 &__entry->pad, 388 &__entry->se, 389 &__entry->tver, 390 &__entry->psn, 391 &__entry->qpn); 392 } 393 } else { 394 __entry->l4 = OPA_16B_L4_9B; 395 hfi1_trace_parse_9b_hdr(&opah->ibh, sc5, 396 &__entry->lnh, 397 &__entry->lver, 398 &__entry->sl, 399 &__entry->sc, 400 &__entry->len, 401 &__entry->dlid, 402 &__entry->slid); 403 if (__entry->lnh == HFI1_LRH_BTH) 404 ohdr = &opah->ibh.u.oth; 405 else 406 ohdr = &opah->ibh.u.l.oth; 407 hfi1_trace_parse_9b_bth(ohdr, 408 &__entry->ack, 409 &__entry->becn, 410 &__entry->fecn, 411 &__entry->mig, 412 &__entry->se, 413 &__entry->pad, 414 &__entry->opcode, 415 &__entry->tver, 416 &__entry->pkey, 417 &__entry->psn, 418 &__entry->qpn); 419 } 420 421 /* extended headers */ 422 if (__entry->l4 != OPA_16B_L4_FM) 423 memcpy(__get_dynamic_array(ehdrs), 424 &ohdr->u, __get_dynamic_array_len(ehdrs)); 425 ), 426 TP_printk("[%s] (%s) %s %s hlen:%d %s", 427 __get_str(dev), 428 hfi1_trace_get_packet_l4_str(__entry->l4), 429 hfi1_trace_fmt_lrh(p, 430 !!__entry->hdr_type, 431 __entry->age, 432 __entry->becn, 433 __entry->fecn, 434 __entry->l4, 435 __entry->lnh, 436 show_lnh(__entry->lnh), 437 __entry->lver, 438 __entry->rc, 439 __entry->sc, 440 __entry->sl, 441 __entry->entropy, 442 __entry->len, 443 __entry->pkey, 444 __entry->dlid, 445 __entry->slid), 446 hfi1_trace_fmt_rest(p, 447 !!__entry->hdr_type, 448 __entry->l4, 449 __entry->ack, 450 __entry->becn, 451 __entry->fecn, 452 __entry->mig, 453 __entry->se, 454 __entry->pad, 455 __entry->opcode, 456 show_ib_opcode(__entry->opcode), 457 __entry->tver, 458 __entry->pkey, 459 __entry->psn, 460 __entry->qpn, 461 __entry->dest_qpn, 462 __entry->src_qpn), 463 /* extended headers */ 464 __get_dynamic_array_len(ehdrs), 465 __parse_ib_ehdrs( 466 __entry->opcode, 467 __entry->l4, 468 __entry->dest_qpn, 469 __entry->src_qpn, 470 (void *)__get_dynamic_array(ehdrs)) 471 ) 472 ); 473 474 DEFINE_EVENT(hfi1_output_ibhdr_template, pio_output_ibhdr, 475 TP_PROTO(struct hfi1_devdata *dd, 476 struct hfi1_opa_header *opah, bool sc5), 477 TP_ARGS(dd, opah, sc5)); 478 479 DEFINE_EVENT(hfi1_output_ibhdr_template, ack_output_ibhdr, 480 TP_PROTO(struct hfi1_devdata *dd, 481 struct hfi1_opa_header *opah, bool sc5), 482 TP_ARGS(dd, opah, sc5)); 483 484 DEFINE_EVENT(hfi1_output_ibhdr_template, sdma_output_ibhdr, 485 TP_PROTO(struct hfi1_devdata *dd, 486 struct hfi1_opa_header *opah, bool sc5), 487 TP_ARGS(dd, opah, sc5)); 488 489 490 #endif /* __HFI1_TRACE_IBHDRS_H */ 491 492 #undef TRACE_INCLUDE_PATH 493 #undef TRACE_INCLUDE_FILE 494 #define TRACE_INCLUDE_PATH . 495 #define TRACE_INCLUDE_FILE trace_ibhdrs 496 #include <trace/define_trace.h> 497