IB/ipath: Wait for PIO available interrupt
The send function is called when posting new send work requests. There is no point in trying to send a packet if the QP is already waiting for a HW send buffer so don't clear the busy bit until the buffer available interrupt happens. Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
06ee109002
commit
db5518cd09
|
@ -503,11 +503,9 @@ void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev)
|
||||||
* could be called. If we are still in the tasklet function,
|
* could be called. If we are still in the tasklet function,
|
||||||
* tasklet_hi_schedule() will not call us until the next time
|
* tasklet_hi_schedule() will not call us until the next time
|
||||||
* tasklet_hi_schedule() is called.
|
* tasklet_hi_schedule() is called.
|
||||||
* We clear the tasklet flag now since we are committing to return
|
* We leave the busy flag set so that another post send doesn't
|
||||||
* from the tasklet function.
|
* try to put the same QP on the piowait list again.
|
||||||
*/
|
*/
|
||||||
clear_bit(IPATH_S_BUSY, &qp->s_busy);
|
|
||||||
tasklet_unlock(&qp->s_task);
|
|
||||||
want_buffer(dev->dd);
|
want_buffer(dev->dd);
|
||||||
dev->n_piowait++;
|
dev->n_piowait++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -948,6 +948,7 @@ int ipath_ib_piobufavail(struct ipath_ibdev *dev)
|
||||||
qp = list_entry(dev->piowait.next, struct ipath_qp,
|
qp = list_entry(dev->piowait.next, struct ipath_qp,
|
||||||
piowait);
|
piowait);
|
||||||
list_del_init(&qp->piowait);
|
list_del_init(&qp->piowait);
|
||||||
|
clear_bit(IPATH_S_BUSY, &qp->s_busy);
|
||||||
tasklet_hi_schedule(&qp->s_task);
|
tasklet_hi_schedule(&qp->s_task);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||||
|
|
Loading…
Reference in New Issue