IB/rdmavt: Add trace for RNRNAK timer
authorKaike Wan <kaike.wan@intel.com>
Tue, 19 Dec 2017 03:57:28 +0000 (19:57 -0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 5 Jan 2018 18:34:55 +0000 (13:34 -0500)
This patch adds static trace for RNRNAK timer. Currently the output from
hrtimer static trace only shows the addresses of hrtimers in the system
and there is no easy way to correlate an RNRNAK timer with its entries in
the hrtimer trace. This patch adds the correlation among a QP, its RNRNAK
timer, and its entries in the hrtimer trace. This correlation will be
enormously helpful when debugging RNRNAK related issues. In addition, this
patch cleans up rvt_stop_rnr_timer() to be void while here.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/sw/rdmavt/qp.c
drivers/infiniband/sw/rdmavt/trace_qp.h

index 73705a19bd2e35d359eb8be1bee73df3a2f8a10e..0bbf20597056bd3b2aa666144965da61e8320c6c 100644 (file)
@@ -2075,6 +2075,7 @@ void rvt_add_rnr_timer(struct rvt_qp *qp, u32 aeth)
        lockdep_assert_held(&qp->s_lock);
        qp->s_flags |= RVT_S_WAIT_RNR;
        to = rvt_aeth_to_usec(aeth);
+       trace_rvt_rnrnak_add(qp, to);
        hrtimer_start(&qp->s_rnr_timer,
                      ns_to_ktime(1000 * to), HRTIMER_MODE_REL);
 }
@@ -2104,15 +2105,14 @@ EXPORT_SYMBOL(rvt_stop_rc_timers);
  * stop an rnr timer and return if the timer
  * had been pending.
  */
-static int rvt_stop_rnr_timer(struct rvt_qp *qp)
+static void rvt_stop_rnr_timer(struct rvt_qp *qp)
 {
-       int rval = 0;
-
        lockdep_assert_held(&qp->s_lock);
        /* Remove QP from rnr timer */
-       if (qp->s_flags & RVT_S_WAIT_RNR)
+       if (qp->s_flags & RVT_S_WAIT_RNR) {
                qp->s_flags &= ~RVT_S_WAIT_RNR;
-       return rval;
+               trace_rvt_rnrnak_stop(qp, 0);
+       }
 }
 
 /**
@@ -2165,6 +2165,7 @@ enum hrtimer_restart rvt_rc_rnr_retry(struct hrtimer *t)
 
        spin_lock_irqsave(&qp->s_lock, flags);
        rvt_stop_rnr_timer(qp);
+       trace_rvt_rnrnak_timeout(qp, 0);
        rdi->driver_f.schedule_send(qp);
        spin_unlock_irqrestore(&qp->s_lock, flags);
        return HRTIMER_NORESTART;
index 4c77a3119bdad40bb5f9a2039954b144a1d0da20..efc9d814b032a4f3d6c2245f508ccf2022ad9115 100644 (file)
@@ -85,6 +85,48 @@ DEFINE_EVENT(rvt_qphash_template, rvt_qpremove,
        TP_PROTO(struct rvt_qp *qp, u32 bucket),
        TP_ARGS(qp, bucket));
 
+DECLARE_EVENT_CLASS(
+       rvt_rnrnak_template,
+       TP_PROTO(struct rvt_qp *qp, u32 to),
+       TP_ARGS(qp, to),
+       TP_STRUCT__entry(
+               RDI_DEV_ENTRY(ib_to_rvt(qp->ibqp.device))
+               __field(u32, qpn)
+               __field(void *, hrtimer)
+               __field(u32, s_flags)
+               __field(u32, to)
+       ),
+       TP_fast_assign(
+               RDI_DEV_ASSIGN(ib_to_rvt(qp->ibqp.device))
+               __entry->qpn = qp->ibqp.qp_num;
+               __entry->hrtimer = &qp->s_rnr_timer;
+               __entry->s_flags = qp->s_flags;
+               __entry->to = to;
+       ),
+       TP_printk(
+               "[%s] qpn 0x%x hrtimer 0x%p s_flags 0x%x timeout %u us",
+               __get_str(dev),
+               __entry->qpn,
+               __entry->hrtimer,
+               __entry->s_flags,
+               __entry->to
+       )
+);
+
+DEFINE_EVENT(
+       rvt_rnrnak_template, rvt_rnrnak_add,
+       TP_PROTO(struct rvt_qp *qp, u32 to),
+       TP_ARGS(qp, to));
+
+DEFINE_EVENT(
+       rvt_rnrnak_template, rvt_rnrnak_timeout,
+       TP_PROTO(struct rvt_qp *qp, u32 to),
+       TP_ARGS(qp, to));
+
+DEFINE_EVENT(
+       rvt_rnrnak_template, rvt_rnrnak_stop,
+       TP_PROTO(struct rvt_qp *qp, u32 to),
+       TP_ARGS(qp, to));
 
 #endif /* __RVT_TRACE_QP_H */