| From d359f35430c4ea4dd4e24d809aeaeff1fa54c314 Mon Sep 17 00:00:00 2001 |
| From: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Date: Thu, 24 Jan 2013 18:59:34 +0000 |
| Subject: IB/qib: Fix for broken sparse warning fix |
| |
| From: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| |
| commit d359f35430c4ea4dd4e24d809aeaeff1fa54c314 upstream. |
| |
| Commit 1fb9fed6d489 ("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. |
| |
| Reviewed-by: Gary Leshner <gary.s.leshner@intel.com> |
| Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Signed-off-by: Roland Dreier <roland@purestorage.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/hw/qib/qib_qp.c | 11 +++-------- |
| 1 file changed, 3 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/infiniband/hw/qib/qib_qp.c |
| +++ b/drivers/infiniband/hw/qib/qib_qp.c |
| @@ -263,20 +263,15 @@ static void remove_qp(struct qib_ibdev * |
| 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); |