diff options
author | Ismail, Mustafa | 2016-04-18 17:32:59 +0200 |
---|---|---|
committer | Doug Ledford | 2016-04-28 22:32:53 +0200 |
commit | 996abf0a52e62e844b50344157060bb6ec609bc7 (patch) | |
tree | 3c4711726323a5074ed3ca81433d80de2850bbe6 /drivers/infiniband/hw/i40iw/i40iw_utils.c | |
parent | RDMA/i40iw: Do not set self-referencing pointer to NULL after free (diff) | |
download | kernel-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.c | 9 |
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; |