0001
0002
0003
0004
0005
0006 #if !defined(__HFI1_TRACE_IBHDRS_H) || defined(TRACE_HEADER_MULTI_READ)
0007 #define __HFI1_TRACE_IBHDRS_H
0008
0009 #include <linux/tracepoint.h>
0010 #include <linux/trace_seq.h>
0011
0012 #include "hfi.h"
0013
0014 #undef TRACE_SYSTEM
0015 #define TRACE_SYSTEM hfi1_ibhdrs
0016
0017 #define ib_opcode_name(opcode) { IB_OPCODE_##opcode, #opcode }
0018 #define show_ib_opcode(opcode) \
0019 __print_symbolic(opcode, \
0020 ib_opcode_name(RC_SEND_FIRST), \
0021 ib_opcode_name(RC_SEND_MIDDLE), \
0022 ib_opcode_name(RC_SEND_LAST), \
0023 ib_opcode_name(RC_SEND_LAST_WITH_IMMEDIATE), \
0024 ib_opcode_name(RC_SEND_ONLY), \
0025 ib_opcode_name(RC_SEND_ONLY_WITH_IMMEDIATE), \
0026 ib_opcode_name(RC_RDMA_WRITE_FIRST), \
0027 ib_opcode_name(RC_RDMA_WRITE_MIDDLE), \
0028 ib_opcode_name(RC_RDMA_WRITE_LAST), \
0029 ib_opcode_name(RC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
0030 ib_opcode_name(RC_RDMA_WRITE_ONLY), \
0031 ib_opcode_name(RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
0032 ib_opcode_name(RC_RDMA_READ_REQUEST), \
0033 ib_opcode_name(RC_RDMA_READ_RESPONSE_FIRST), \
0034 ib_opcode_name(RC_RDMA_READ_RESPONSE_MIDDLE), \
0035 ib_opcode_name(RC_RDMA_READ_RESPONSE_LAST), \
0036 ib_opcode_name(RC_RDMA_READ_RESPONSE_ONLY), \
0037 ib_opcode_name(RC_ACKNOWLEDGE), \
0038 ib_opcode_name(RC_ATOMIC_ACKNOWLEDGE), \
0039 ib_opcode_name(RC_COMPARE_SWAP), \
0040 ib_opcode_name(RC_FETCH_ADD), \
0041 ib_opcode_name(RC_SEND_LAST_WITH_INVALIDATE), \
0042 ib_opcode_name(RC_SEND_ONLY_WITH_INVALIDATE), \
0043 ib_opcode_name(TID_RDMA_WRITE_REQ), \
0044 ib_opcode_name(TID_RDMA_WRITE_RESP), \
0045 ib_opcode_name(TID_RDMA_WRITE_DATA), \
0046 ib_opcode_name(TID_RDMA_WRITE_DATA_LAST), \
0047 ib_opcode_name(TID_RDMA_READ_REQ), \
0048 ib_opcode_name(TID_RDMA_READ_RESP), \
0049 ib_opcode_name(TID_RDMA_RESYNC), \
0050 ib_opcode_name(TID_RDMA_ACK), \
0051 ib_opcode_name(UC_SEND_FIRST), \
0052 ib_opcode_name(UC_SEND_MIDDLE), \
0053 ib_opcode_name(UC_SEND_LAST), \
0054 ib_opcode_name(UC_SEND_LAST_WITH_IMMEDIATE), \
0055 ib_opcode_name(UC_SEND_ONLY), \
0056 ib_opcode_name(UC_SEND_ONLY_WITH_IMMEDIATE), \
0057 ib_opcode_name(UC_RDMA_WRITE_FIRST), \
0058 ib_opcode_name(UC_RDMA_WRITE_MIDDLE), \
0059 ib_opcode_name(UC_RDMA_WRITE_LAST), \
0060 ib_opcode_name(UC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
0061 ib_opcode_name(UC_RDMA_WRITE_ONLY), \
0062 ib_opcode_name(UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
0063 ib_opcode_name(UD_SEND_ONLY), \
0064 ib_opcode_name(UD_SEND_ONLY_WITH_IMMEDIATE), \
0065 ib_opcode_name(CNP))
0066
0067 u8 ibhdr_exhdr_len(struct ib_header *hdr);
0068 const char *parse_everbs_hdrs(struct trace_seq *p, u8 opcode,
0069 u8 l4, u32 dest_qpn, u32 src_qpn,
0070 void *ehdrs);
0071 u8 hfi1_trace_opa_hdr_len(struct hfi1_opa_header *opah);
0072 u8 hfi1_trace_packet_hdr_len(struct hfi1_packet *packet);
0073 const char *hfi1_trace_get_packet_l4_str(u8 l4);
0074 void hfi1_trace_parse_9b_bth(struct ib_other_headers *ohdr,
0075 u8 *ack, bool *becn, bool *fecn, u8 *mig,
0076 u8 *se, u8 *pad, u8 *opcode, u8 *tver,
0077 u16 *pkey, u32 *psn, u32 *qpn);
0078 void hfi1_trace_parse_9b_hdr(struct ib_header *hdr, bool sc5,
0079 u8 *lnh, u8 *lver, u8 *sl, u8 *sc,
0080 u16 *len, u32 *dlid, u32 *slid);
0081 void hfi1_trace_parse_16b_bth(struct ib_other_headers *ohdr,
0082 u8 *ack, u8 *mig, u8 *opcode,
0083 u8 *pad, u8 *se, u8 *tver,
0084 u32 *psn, u32 *qpn);
0085 void hfi1_trace_parse_16b_hdr(struct hfi1_16b_header *hdr,
0086 u8 *age, bool *becn, bool *fecn,
0087 u8 *l4, u8 *rc, u8 *sc,
0088 u16 *entropy, u16 *len, u16 *pkey,
0089 u32 *dlid, u32 *slid);
0090
0091 const char *hfi1_trace_fmt_lrh(struct trace_seq *p, bool bypass,
0092 u8 age, bool becn, bool fecn, u8 l4,
0093 u8 lnh, const char *lnh_name, u8 lver,
0094 u8 rc, u8 sc, u8 sl, u16 entropy,
0095 u16 len, u16 pkey, u32 dlid, u32 slid);
0096
0097 const char *hfi1_trace_fmt_rest(struct trace_seq *p, bool bypass, u8 l4,
0098 u8 ack, bool becn, bool fecn, u8 mig,
0099 u8 se, u8 pad, u8 opcode, const char *opname,
0100 u8 tver, u16 pkey, u32 psn, u32 qpn,
0101 u32 dest_qpn, u32 src_qpn);
0102
0103 const char *hfi1_trace_get_packet_l2_str(u8 l2);
0104
0105 #define __parse_ib_ehdrs(op, l4, dest_qpn, src_qpn, ehdrs) \
0106 parse_everbs_hdrs(p, op, l4, dest_qpn, src_qpn, ehdrs)
0107
0108 #define lrh_name(lrh) { HFI1_##lrh, #lrh }
0109 #define show_lnh(lrh) \
0110 __print_symbolic(lrh, \
0111 lrh_name(LRH_BTH), \
0112 lrh_name(LRH_GRH))
0113
0114 DECLARE_EVENT_CLASS(hfi1_input_ibhdr_template,
0115 TP_PROTO(struct hfi1_devdata *dd,
0116 struct hfi1_packet *packet,
0117 bool sc5),
0118 TP_ARGS(dd, packet, sc5),
0119 TP_STRUCT__entry(
0120 DD_DEV_ENTRY(dd)
0121 __field(u8, etype)
0122 __field(u8, ack)
0123 __field(u8, age)
0124 __field(bool, becn)
0125 __field(bool, fecn)
0126 __field(u8, l2)
0127 __field(u8, l4)
0128 __field(u8, lnh)
0129 __field(u8, lver)
0130 __field(u8, mig)
0131 __field(u8, opcode)
0132 __field(u8, pad)
0133 __field(u8, rc)
0134 __field(u8, sc)
0135 __field(u8, se)
0136 __field(u8, sl)
0137 __field(u8, tver)
0138 __field(u16, entropy)
0139 __field(u16, len)
0140 __field(u16, pkey)
0141 __field(u32, dlid)
0142 __field(u32, psn)
0143 __field(u32, qpn)
0144 __field(u32, slid)
0145 __field(u32, dest_qpn)
0146 __field(u32, src_qpn)
0147
0148 __dynamic_array(u8, ehdrs,
0149 hfi1_trace_packet_hdr_len(packet))
0150 ),
0151 TP_fast_assign(
0152 DD_DEV_ASSIGN(dd);
0153
0154 __entry->etype = packet->etype;
0155 __entry->l2 = hfi1_16B_get_l2(packet->hdr);
0156 __entry->dest_qpn = 0;
0157 __entry->src_qpn = 0;
0158 if (__entry->etype == RHF_RCV_TYPE_BYPASS) {
0159 hfi1_trace_parse_16b_hdr(packet->hdr,
0160 &__entry->age,
0161 &__entry->becn,
0162 &__entry->fecn,
0163 &__entry->l4,
0164 &__entry->rc,
0165 &__entry->sc,
0166 &__entry->entropy,
0167 &__entry->len,
0168 &__entry->pkey,
0169 &__entry->dlid,
0170 &__entry->slid);
0171
0172 if (__entry->l4 == OPA_16B_L4_FM) {
0173 __entry->opcode = IB_OPCODE_UD_SEND_ONLY;
0174 __entry->dest_qpn = hfi1_16B_get_dest_qpn(packet->mgmt);
0175 __entry->src_qpn = hfi1_16B_get_src_qpn(packet->mgmt);
0176 } else {
0177 hfi1_trace_parse_16b_bth(packet->ohdr,
0178 &__entry->ack,
0179 &__entry->mig,
0180 &__entry->opcode,
0181 &__entry->pad,
0182 &__entry->se,
0183 &__entry->tver,
0184 &__entry->psn,
0185 &__entry->qpn);
0186 }
0187 } else {
0188 __entry->l4 = OPA_16B_L4_9B;
0189 hfi1_trace_parse_9b_hdr(packet->hdr, sc5,
0190 &__entry->lnh,
0191 &__entry->lver,
0192 &__entry->sl,
0193 &__entry->sc,
0194 &__entry->len,
0195 &__entry->dlid,
0196 &__entry->slid);
0197
0198 hfi1_trace_parse_9b_bth(packet->ohdr,
0199 &__entry->ack,
0200 &__entry->becn,
0201 &__entry->fecn,
0202 &__entry->mig,
0203 &__entry->se,
0204 &__entry->pad,
0205 &__entry->opcode,
0206 &__entry->tver,
0207 &__entry->pkey,
0208 &__entry->psn,
0209 &__entry->qpn);
0210 }
0211
0212 if (__entry->l4 != OPA_16B_L4_FM)
0213 memcpy(__get_dynamic_array(ehdrs),
0214 &packet->ohdr->u,
0215 __get_dynamic_array_len(ehdrs));
0216 ),
0217 TP_printk("[%s] (%s) %s %s hlen:%d %s",
0218 __get_str(dev),
0219 __entry->etype != RHF_RCV_TYPE_BYPASS ?
0220 show_packettype(__entry->etype) :
0221 hfi1_trace_get_packet_l2_str(
0222 __entry->l2),
0223 hfi1_trace_fmt_lrh(p,
0224 __entry->etype ==
0225 RHF_RCV_TYPE_BYPASS,
0226 __entry->age,
0227 __entry->becn,
0228 __entry->fecn,
0229 __entry->l4,
0230 __entry->lnh,
0231 show_lnh(__entry->lnh),
0232 __entry->lver,
0233 __entry->rc,
0234 __entry->sc,
0235 __entry->sl,
0236 __entry->entropy,
0237 __entry->len,
0238 __entry->pkey,
0239 __entry->dlid,
0240 __entry->slid),
0241 hfi1_trace_fmt_rest(p,
0242 __entry->etype ==
0243 RHF_RCV_TYPE_BYPASS,
0244 __entry->l4,
0245 __entry->ack,
0246 __entry->becn,
0247 __entry->fecn,
0248 __entry->mig,
0249 __entry->se,
0250 __entry->pad,
0251 __entry->opcode,
0252 show_ib_opcode(__entry->opcode),
0253 __entry->tver,
0254 __entry->pkey,
0255 __entry->psn,
0256 __entry->qpn,
0257 __entry->dest_qpn,
0258 __entry->src_qpn),
0259
0260 __get_dynamic_array_len(ehdrs),
0261 __parse_ib_ehdrs(
0262 __entry->opcode,
0263 __entry->l4,
0264 __entry->dest_qpn,
0265 __entry->src_qpn,
0266 (void *)__get_dynamic_array(ehdrs))
0267 )
0268 );
0269
0270 DEFINE_EVENT(hfi1_input_ibhdr_template, input_ibhdr,
0271 TP_PROTO(struct hfi1_devdata *dd,
0272 struct hfi1_packet *packet, bool sc5),
0273 TP_ARGS(dd, packet, sc5));
0274
0275 DECLARE_EVENT_CLASS(hfi1_output_ibhdr_template,
0276 TP_PROTO(struct hfi1_devdata *dd,
0277 struct hfi1_opa_header *opah, bool sc5),
0278 TP_ARGS(dd, opah, sc5),
0279 TP_STRUCT__entry(
0280 DD_DEV_ENTRY(dd)
0281 __field(u8, hdr_type)
0282 __field(u8, ack)
0283 __field(u8, age)
0284 __field(bool, becn)
0285 __field(bool, fecn)
0286 __field(u8, l4)
0287 __field(u8, lnh)
0288 __field(u8, lver)
0289 __field(u8, mig)
0290 __field(u8, opcode)
0291 __field(u8, pad)
0292 __field(u8, rc)
0293 __field(u8, sc)
0294 __field(u8, se)
0295 __field(u8, sl)
0296 __field(u8, tver)
0297 __field(u16, entropy)
0298 __field(u16, len)
0299 __field(u16, pkey)
0300 __field(u32, dlid)
0301 __field(u32, psn)
0302 __field(u32, qpn)
0303 __field(u32, slid)
0304 __field(u32, dest_qpn)
0305 __field(u32, src_qpn)
0306
0307 __dynamic_array(u8, ehdrs,
0308 hfi1_trace_opa_hdr_len(opah))
0309 ),
0310 TP_fast_assign(
0311 struct ib_other_headers *ohdr;
0312
0313 DD_DEV_ASSIGN(dd);
0314
0315 __entry->hdr_type = opah->hdr_type;
0316 __entry->dest_qpn = 0;
0317 __entry->src_qpn = 0;
0318 if (__entry->hdr_type) {
0319 hfi1_trace_parse_16b_hdr(&opah->opah,
0320 &__entry->age,
0321 &__entry->becn,
0322 &__entry->fecn,
0323 &__entry->l4,
0324 &__entry->rc,
0325 &__entry->sc,
0326 &__entry->entropy,
0327 &__entry->len,
0328 &__entry->pkey,
0329 &__entry->dlid,
0330 &__entry->slid);
0331
0332 if (__entry->l4 == OPA_16B_L4_FM) {
0333 ohdr = NULL;
0334 __entry->opcode = IB_OPCODE_UD_SEND_ONLY;
0335 __entry->dest_qpn = hfi1_16B_get_dest_qpn(&opah->opah.u.mgmt);
0336 __entry->src_qpn = hfi1_16B_get_src_qpn(&opah->opah.u.mgmt);
0337 } else {
0338 if (__entry->l4 == OPA_16B_L4_IB_LOCAL)
0339 ohdr = &opah->opah.u.oth;
0340 else
0341 ohdr = &opah->opah.u.l.oth;
0342 hfi1_trace_parse_16b_bth(ohdr,
0343 &__entry->ack,
0344 &__entry->mig,
0345 &__entry->opcode,
0346 &__entry->pad,
0347 &__entry->se,
0348 &__entry->tver,
0349 &__entry->psn,
0350 &__entry->qpn);
0351 }
0352 } else {
0353 __entry->l4 = OPA_16B_L4_9B;
0354 hfi1_trace_parse_9b_hdr(&opah->ibh, sc5,
0355 &__entry->lnh,
0356 &__entry->lver,
0357 &__entry->sl,
0358 &__entry->sc,
0359 &__entry->len,
0360 &__entry->dlid,
0361 &__entry->slid);
0362 if (__entry->lnh == HFI1_LRH_BTH)
0363 ohdr = &opah->ibh.u.oth;
0364 else
0365 ohdr = &opah->ibh.u.l.oth;
0366 hfi1_trace_parse_9b_bth(ohdr,
0367 &__entry->ack,
0368 &__entry->becn,
0369 &__entry->fecn,
0370 &__entry->mig,
0371 &__entry->se,
0372 &__entry->pad,
0373 &__entry->opcode,
0374 &__entry->tver,
0375 &__entry->pkey,
0376 &__entry->psn,
0377 &__entry->qpn);
0378 }
0379
0380
0381 if (__entry->l4 != OPA_16B_L4_FM)
0382 memcpy(__get_dynamic_array(ehdrs),
0383 &ohdr->u, __get_dynamic_array_len(ehdrs));
0384 ),
0385 TP_printk("[%s] (%s) %s %s hlen:%d %s",
0386 __get_str(dev),
0387 hfi1_trace_get_packet_l4_str(__entry->l4),
0388 hfi1_trace_fmt_lrh(p,
0389 !!__entry->hdr_type,
0390 __entry->age,
0391 __entry->becn,
0392 __entry->fecn,
0393 __entry->l4,
0394 __entry->lnh,
0395 show_lnh(__entry->lnh),
0396 __entry->lver,
0397 __entry->rc,
0398 __entry->sc,
0399 __entry->sl,
0400 __entry->entropy,
0401 __entry->len,
0402 __entry->pkey,
0403 __entry->dlid,
0404 __entry->slid),
0405 hfi1_trace_fmt_rest(p,
0406 !!__entry->hdr_type,
0407 __entry->l4,
0408 __entry->ack,
0409 __entry->becn,
0410 __entry->fecn,
0411 __entry->mig,
0412 __entry->se,
0413 __entry->pad,
0414 __entry->opcode,
0415 show_ib_opcode(__entry->opcode),
0416 __entry->tver,
0417 __entry->pkey,
0418 __entry->psn,
0419 __entry->qpn,
0420 __entry->dest_qpn,
0421 __entry->src_qpn),
0422
0423 __get_dynamic_array_len(ehdrs),
0424 __parse_ib_ehdrs(
0425 __entry->opcode,
0426 __entry->l4,
0427 __entry->dest_qpn,
0428 __entry->src_qpn,
0429 (void *)__get_dynamic_array(ehdrs))
0430 )
0431 );
0432
0433 DEFINE_EVENT(hfi1_output_ibhdr_template, pio_output_ibhdr,
0434 TP_PROTO(struct hfi1_devdata *dd,
0435 struct hfi1_opa_header *opah, bool sc5),
0436 TP_ARGS(dd, opah, sc5));
0437
0438 DEFINE_EVENT(hfi1_output_ibhdr_template, ack_output_ibhdr,
0439 TP_PROTO(struct hfi1_devdata *dd,
0440 struct hfi1_opa_header *opah, bool sc5),
0441 TP_ARGS(dd, opah, sc5));
0442
0443 DEFINE_EVENT(hfi1_output_ibhdr_template, sdma_output_ibhdr,
0444 TP_PROTO(struct hfi1_devdata *dd,
0445 struct hfi1_opa_header *opah, bool sc5),
0446 TP_ARGS(dd, opah, sc5));
0447
0448
0449 #endif
0450
0451 #undef TRACE_INCLUDE_PATH
0452 #undef TRACE_INCLUDE_FILE
0453 #define TRACE_INCLUDE_PATH .
0454 #define TRACE_INCLUDE_FILE trace_ibhdrs
0455 #include <trace/define_trace.h>