Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0f2faf7 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Roland Dreier
Browse files

IB/qib: Precompute timeout jiffies to optimize latency



A new field is added to qib_qp called timeout_jiffies. It is
initialized upon create and modify.

The field is now used instead of a computation based on qp->timeout.

Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent af061a64
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -801,8 +801,12 @@ int qib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
	if (attr_mask & IB_QP_MIN_RNR_TIMER)
		qp->r_min_rnr_timer = attr->min_rnr_timer;

	if (attr_mask & IB_QP_TIMEOUT)
	if (attr_mask & IB_QP_TIMEOUT) {
		qp->timeout = attr->timeout;
		qp->timeout_jiffies =
			usecs_to_jiffies((4096UL * (1UL << qp->timeout)) /
				1000UL);
	}

	if (attr_mask & IB_QP_QKEY)
		qp->qkey = attr->qkey;
@@ -1034,6 +1038,9 @@ struct ib_qp *qib_create_qp(struct ib_pd *ibpd,
			goto bail_swq;
		}
		RCU_INIT_POINTER(qp->next, NULL);
		qp->timeout_jiffies =
			usecs_to_jiffies((4096UL * (1UL << qp->timeout)) /
				1000UL);
		if (init_attr->srq)
			sz = 0;
		else {
+2 −5
Original line number Diff line number Diff line
@@ -59,8 +59,7 @@ static void start_timer(struct qib_qp *qp)
	qp->s_flags |= QIB_S_TIMER;
	qp->s_timer.function = rc_timeout;
	/* 4.096 usec. * (1 << qp->timeout) */
	qp->s_timer.expires = jiffies +
		usecs_to_jiffies((4096UL * (1UL << qp->timeout)) / 1000UL);
	qp->s_timer.expires = jiffies + qp->timeout_jiffies;
	add_timer(&qp->s_timer);
}

@@ -1519,9 +1518,7 @@ static void qib_rc_rcv_resp(struct qib_ibport *ibp,
		 * 4.096 usec. * (1 << qp->timeout)
		 */
		qp->s_flags |= QIB_S_TIMER;
		mod_timer(&qp->s_timer, jiffies +
			usecs_to_jiffies((4096UL * (1UL << qp->timeout)) /
					 1000UL));
		mod_timer(&qp->s_timer, jiffies + qp->timeout_jiffies);
		if (qp->s_flags & QIB_S_WAIT_ACK) {
			qp->s_flags &= ~QIB_S_WAIT_ACK;
			qib_schedule_send(qp);
+1 −0
Original line number Diff line number Diff line
@@ -496,6 +496,7 @@ struct qib_qp {
	u32 s_last;             /* last completed entry */
	u32 s_ssn;              /* SSN of tail entry */
	u32 s_lsn;              /* limit sequence number (credit) */
	unsigned long timeout_jiffies;  /* computed from timeout */
	struct qib_swqe *s_wq;  /* send work queue */
	struct qib_swqe *s_wqe;
	struct qib_rq r_rq;             /* receive work queue */