Commit a8715b97 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Doug Ledford

IB/hfi1: Correct error calldown locking

The resource specific wait locking missed correcting the lock
for the notify_error_qp() calldown.

The code is fixed to correctly use the iowait lock field to protect
the head that is protected by that lock.

Fixes: Commit 4e045572 ("IB/hfi1: Add unique txwait_lock for txreq events")
Reviewed-by: default avatarSebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 39e2afa8
...@@ -961,17 +961,20 @@ int get_pmtu_from_attr(struct rvt_dev_info *rdi, struct rvt_qp *qp, ...@@ -961,17 +961,20 @@ int get_pmtu_from_attr(struct rvt_dev_info *rdi, struct rvt_qp *qp,
void notify_error_qp(struct rvt_qp *qp) void notify_error_qp(struct rvt_qp *qp)
{ {
struct hfi1_ibdev *dev = to_idev(qp->ibqp.device);
struct hfi1_qp_priv *priv = qp->priv; struct hfi1_qp_priv *priv = qp->priv;
seqlock_t *lock = priv->s_iowait.lock;
write_seqlock(&dev->iowait_lock); if (lock) {
if (!list_empty(&priv->s_iowait.list) && !(qp->s_flags & RVT_S_BUSY)) { write_seqlock(lock);
qp->s_flags &= ~RVT_S_ANY_WAIT_IO; if (!list_empty(&priv->s_iowait.list) &&
list_del_init(&priv->s_iowait.list); !(qp->s_flags & RVT_S_BUSY)) {
priv->s_iowait.lock = NULL; qp->s_flags &= ~RVT_S_ANY_WAIT_IO;
rvt_put_qp(qp); list_del_init(&priv->s_iowait.list);
priv->s_iowait.lock = NULL;
rvt_put_qp(qp);
}
write_sequnlock(lock);
} }
write_sequnlock(&dev->iowait_lock);
if (!(qp->s_flags & RVT_S_BUSY)) { if (!(qp->s_flags & RVT_S_BUSY)) {
qp->s_hdrwords = 0; qp->s_hdrwords = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment