diff options
| author | Mike Marciniszyn <mike.marciniszyn@qlogic.com> | 2011-09-23 13:16:49 -0400 | 
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2011-10-21 09:38:56 -0700 | 
| commit | d0f2faf72d51dacf5c5e8dec7dca22d0395896e2 (patch) | |
| tree | 9cdae5f02f9d17dac30c9a140123dc912d897278 | |
| parent | af061a644a0e4d4778fe6cd2246479c1962e153b (diff) | |
| download | olio-linux-3.10-d0f2faf72d51dacf5c5e8dec7dca22d0395896e2.tar.xz olio-linux-3.10-d0f2faf72d51dacf5c5e8dec7dca22d0395896e2.zip  | |
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: Mike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_qp.c | 9 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_rc.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_verbs.h | 1 | 
3 files changed, 11 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/qib/qib_qp.c b/drivers/infiniband/hw/qib/qib_qp.c index 500981bce9c..7e7e16fbee9 100644 --- a/drivers/infiniband/hw/qib/qib_qp.c +++ b/drivers/infiniband/hw/qib/qib_qp.c @@ -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 { diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c index 5d77cb8aa05..ecfa087ad45 100644 --- a/drivers/infiniband/hw/qib/qib_rc.c +++ b/drivers/infiniband/hw/qib/qib_rc.c @@ -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 @@ read_middle:  		 * 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); diff --git a/drivers/infiniband/hw/qib/qib_verbs.h b/drivers/infiniband/hw/qib/qib_verbs.h index d7b6109528a..0c19ef0c412 100644 --- a/drivers/infiniband/hw/qib/qib_verbs.h +++ b/drivers/infiniband/hw/qib/qib_verbs.h @@ -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 */  |