IB/hfi1: Correct error calldown locking
authorMike Marciniszyn <mike.marciniszyn@intel.com>
Wed, 8 Feb 2017 13:26:20 +0000 (05:26 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 19 Feb 2017 14:18:34 +0000 (09:18 -0500)
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 4e045572e2c2 ("IB/hfi1: Add unique txwait_lock for txreq events")
Reviewed-by: Sebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/qp.c

index d752d67..c2a166d 100644 (file)
@@ -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)
 {
-       struct hfi1_ibdev *dev = to_idev(qp->ibqp.device);
        struct hfi1_qp_priv *priv = qp->priv;
+       seqlock_t *lock = priv->s_iowait.lock;
 
-       write_seqlock(&dev->iowait_lock);
-       if (!list_empty(&priv->s_iowait.list) && !(qp->s_flags & RVT_S_BUSY)) {
-               qp->s_flags &= ~RVT_S_ANY_WAIT_IO;
-               list_del_init(&priv->s_iowait.list);
-               priv->s_iowait.lock = NULL;
-               rvt_put_qp(qp);
+       if (lock) {
+               write_seqlock(lock);
+               if (!list_empty(&priv->s_iowait.list) &&
+                   !(qp->s_flags & RVT_S_BUSY)) {
+                       qp->s_flags &= ~RVT_S_ANY_WAIT_IO;
+                       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)) {
                qp->s_hdrwords = 0;