Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
0002 /*
0003  * Copyright(c) 2015 - 2017 Intel Corporation.
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             /* extended headers */
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             /* extended headers */
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                   /* extended headers */
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             /* extended headers */
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             /* extended headers */
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                   /* extended headers */
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 /* __HFI1_TRACE_IBHDRS_H */
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>