From: Ira Weiny <ira.weiny@xxxxxxxxx> Trace received MAD details. Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx> --- Changes from V2 Change dev_name to string Reorder fields for more efficient ring buffer utilization drivers/infiniband/core/mad.c | 10 +++++++ include/trace/events/ib_mad.h | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index e166d584b80c..8f6d5e49337a 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c @@ -2339,6 +2339,16 @@ static void ib_mad_recv_done(struct ib_cq *cq, struct ib_wc *wc) if (!validate_mad((const struct ib_mad_hdr *)recv->mad, qp_info, opa)) goto out; + if (trace_ib_mad_recv_done_handler_enabled()) { + u16 pkey; + + ib_query_pkey(qp_info->port_priv->device, qp_info->port_priv->port_num, + wc->pkey_index, &pkey); + + trace_ib_mad_recv_done_handler(qp_info, wc, (struct ib_mad_hdr *)recv->mad, + pkey); + } + mad_size = recv->mad_size; response = alloc_mad_private(mad_size, GFP_KERNEL); if (!response) diff --git a/include/trace/events/ib_mad.h b/include/trace/events/ib_mad.h index 464b33b2af50..0b294a68cebd 100644 --- a/include/trace/events/ib_mad.h +++ b/include/trace/events/ib_mad.h @@ -158,6 +158,70 @@ ) ); +TRACE_EVENT(ib_mad_recv_done_handler, + TP_PROTO(struct ib_mad_qp_info *qp_info, struct ib_wc *wc, struct ib_mad_hdr *mad_hdr, + u16 pkey), + TP_ARGS(qp_info, wc, mad_hdr, pkey), + + TP_STRUCT__entry( + __field(u8, base_version) + __field(u8, mgmt_class) + __field(u8, class_version) + __field(u8, port_num) + __field(u32, qp_num) + __field(u16, status) + __field(u16, class_specific) + __field(u32, length) + __field(u64, tid) + __field(u8, method) + __field(u8, sl) + __field(u16, attr_id) + __field(u32, attr_mod) + __field(u16, src_qp) + __field(u16, wc_status) + __field(u32, slid) + __string(dev_name, qp_info->port_priv->device->name) + __field(u16, pkey) + ), + + TP_fast_assign( + __assign_str(dev_name, qp_info->port_priv->device->name); + __entry->port_num = qp_info->port_priv->port_num; + __entry->qp_num = qp_info->qp->qp_num; + __entry->length = wc->byte_len; + __entry->base_version = mad_hdr->base_version; + __entry->mgmt_class = mad_hdr->mgmt_class; + __entry->class_version = mad_hdr->class_version; + __entry->method = mad_hdr->method; + __entry->status = mad_hdr->status; + __entry->class_specific = mad_hdr->class_specific; + __entry->tid = mad_hdr->tid; + __entry->attr_id = mad_hdr->attr_id; + __entry->attr_mod = mad_hdr->attr_mod; + __entry->slid = wc->slid; + __entry->src_qp = wc->src_qp; + __entry->sl = wc->sl; + __entry->pkey = pkey; + __entry->wc_status = wc->status; + ), + + TP_printk("%s:%d QP%d : RECV WC Status %d : length %d : hdr : " \ + "base_ver 0x%02x class 0x%02x class_ver 0x%02x method 0x%02x " \ + "status 0x%04x class_specific 0x%04x tid 0x%016llx " \ + "attr_id 0x%04x attr_mod 0x%08x slid 0x%08x src QP%d, sl %d " \ + "pkey 0x%04x", + __get_str(dev_name), __entry->port_num, __entry->qp_num, + __entry->wc_status, + __entry->length, + __entry->base_version, __entry->mgmt_class, __entry->class_version, + __entry->method, be16_to_cpu(__entry->status), + be16_to_cpu(__entry->class_specific), + be64_to_cpu(__entry->tid), be16_to_cpu(__entry->attr_id), + be32_to_cpu(__entry->attr_mod), + __entry->slid, __entry->src_qp, __entry->sl, __entry->pkey + ) +); + #endif /* _TRACE_IB_MAD_H */ -- 1.8.3.1