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

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

IB/qib: Fix for broken sparse warning fix



Commit 1fb9fed6 ("IB/qib: Fix QP RCU sparse warning") broke QP
hash list deletion in qp_remove() badly.

This patch restores the former for loop behavior, while still fixing
the sparse warnings.

Cc: <stable@vger.kernel.org>
Reviewed-by: default avatarGary Leshner <gary.s.leshner@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 949db153
Loading
Loading
Loading
Loading
+3 −8
Original line number Diff line number Diff line
@@ -263,20 +263,15 @@ static void remove_qp(struct qib_ibdev *dev, struct qib_qp *qp)
		struct qib_qp __rcu **qpp;

		qpp = &dev->qp_table[n];
		q = rcu_dereference_protected(*qpp,
			lockdep_is_held(&dev->qpt_lock));
		for (; q; qpp = &q->next) {
		for (; (q = rcu_dereference_protected(*qpp,
				lockdep_is_held(&dev->qpt_lock))) != NULL;
				qpp = &q->next)
			if (q == qp) {
				atomic_dec(&qp->refcount);
				*qpp = qp->next;
				rcu_assign_pointer(qp->next, NULL);
				q = rcu_dereference_protected(*qpp,
					lockdep_is_held(&dev->qpt_lock));
				break;
			}
			q = rcu_dereference_protected(*qpp,
				lockdep_is_held(&dev->qpt_lock));
		}
	}

	spin_unlock_irqrestore(&dev->qpt_lock, flags);