summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/i40iw/i40iw_utils.c
diff options
context:
space:
mode:
authorIsmail, Mustafa2016-04-18 17:32:59 +0200
committerDoug Ledford2016-04-28 22:32:53 +0200
commit996abf0a52e62e844b50344157060bb6ec609bc7 (patch)
tree3c4711726323a5074ed3ca81433d80de2850bbe6 /drivers/infiniband/hw/i40iw/i40iw_utils.c
parentRDMA/i40iw: Do not set self-referencing pointer to NULL after free (diff)
downloadkernel-qcow2-linux-996abf0a52e62e844b50344157060bb6ec609bc7.tar.gz
kernel-qcow2-linux-996abf0a52e62e844b50344157060bb6ec609bc7.tar.xz
kernel-qcow2-linux-996abf0a52e62e844b50344157060bb6ec609bc7.zip
RDMA/i40iw: Add qp table lock around AE processing
QP may be freed during Async Event processing. Add a lock around QP table to prevent it. Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com> Signed-off-by: Faisal Latif <faisal.latif@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/hw/i40iw/i40iw_utils.c')
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_utils.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c
index 1ceec81bd8eb..7ed998c573a4 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_utils.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c
@@ -506,14 +506,19 @@ void i40iw_rem_ref(struct ib_qp *ibqp)
struct cqp_commands_info *cqp_info;
struct i40iw_device *iwdev;
u32 qp_num;
+ unsigned long flags;
iwqp = to_iwqp(ibqp);
- if (!atomic_dec_and_test(&iwqp->refcount))
+ iwdev = iwqp->iwdev;
+ spin_lock_irqsave(&iwdev->qptable_lock, flags);
+ if (!atomic_dec_and_test(&iwqp->refcount)) {
+ spin_unlock_irqrestore(&iwdev->qptable_lock, flags);
return;
+ }
- iwdev = iwqp->iwdev;
qp_num = iwqp->ibqp.qp_num;
iwdev->qp_table[qp_num] = NULL;
+ spin_unlock_irqrestore(&iwdev->qptable_lock, flags);
cqp_request = i40iw_get_cqp_request(&iwdev->cqp, false);
if (!cqp_request)
return;