cmp_psn(qp->s_sending_psn, qp->s_sending_hpsn) <= 0)
                        break;
                s_last = qp->s_last;
+               trace_hfi1_qp_send_completion(qp, wqe, s_last);
                if (++s_last >= qp->s_size)
                        s_last = 0;
                qp->s_last = s_last;
 
                rvt_put_swqe(wqe);
                s_last = qp->s_last;
+               trace_hfi1_qp_send_completion(qp, wqe, s_last);
                if (++s_last >= qp->s_size)
                        s_last = 0;
                qp->s_last = s_last;
 
 
        last = qp->s_last;
        old_last = last;
+       trace_hfi1_qp_send_completion(qp, wqe, last);
        if (++last >= qp->s_size)
                last = 0;
+       trace_hfi1_qp_send_completion(qp, wqe, last);
        qp->s_last = last;
        /* See post_send() */
        barrier();
 
             TP_PROTO(struct hfi1_devdata *dd, struct buffer_control *bc),
             TP_ARGS(dd, bc));
 
+TRACE_EVENT(
+       hfi1_qp_send_completion,
+       TP_PROTO(struct rvt_qp *qp, struct rvt_swqe *wqe, u32 idx),
+       TP_ARGS(qp, wqe, idx),
+       TP_STRUCT__entry(
+               DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
+               __field(struct rvt_swqe *, wqe)
+               __field(u64, wr_id)
+               __field(u32, qpn)
+               __field(u32, qpt)
+               __field(u32, length)
+               __field(u32, idx)
+               __field(u32, ssn)
+               __field(enum ib_wr_opcode, opcode)
+               __field(int, send_flags)
+       ),
+       TP_fast_assign(
+               DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
+               __entry->wqe = wqe;
+               __entry->wr_id = wqe->wr.wr_id;
+               __entry->qpn = qp->ibqp.qp_num;
+               __entry->qpt = qp->ibqp.qp_type;
+               __entry->length = wqe->length;
+               __entry->idx = idx;
+               __entry->ssn = wqe->ssn;
+               __entry->opcode = wqe->wr.opcode;
+               __entry->send_flags = wqe->wr.send_flags;
+       ),
+       TP_printk(
+               "[%s] qpn 0x%x qpt %u wqe %p idx %u wr_id %llx length %u ssn %u opcode %x send_flags %x",
+               __get_str(dev),
+               __entry->qpn,
+               __entry->qpt,
+               __entry->wqe,
+               __entry->idx,
+               __entry->wr_id,
+               __entry->length,
+               __entry->ssn,
+               __entry->opcode,
+               __entry->send_flags
+       )
+);
+
 #endif /* __HFI1_TRACE_TX_H */
 
 #undef TRACE_INCLUDE_PATH