Commit 60fab107 authored by Prabhakar Kushwaha's avatar Prabhakar Kushwaha Committed by Jason Gunthorpe

rdma/qedr: Fix crash due to redundant release of device's qp memory

Device's QP memory should only be allocated and released by IB layer.
This patch removes the redundant release of the device's qp memory and
uses completion APIs to make sure that .destroy_qp() only return, when qp
reference becomes 0.

Fixes: 514aee66 ("RDMA: Globally allocate and release QP memory")
Link: https://lore.kernel.org/r/20211019082212.7052-1-pkushwaha@marvell.comAcked-by: default avatarMichal Kalderon <michal.kalderon@marvell.com>
Signed-off-by: default avatarAriel Elior <aelior@marvell.com>
Signed-off-by: default avatarShai Malin <smalin@marvell.com>
Signed-off-by: default avatarAlok Prasad <palok@marvell.com>
Signed-off-by: default avatarPrabhakar Kushwaha <pkushwaha@marvell.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 663991f3
...@@ -455,6 +455,7 @@ struct qedr_qp { ...@@ -455,6 +455,7 @@ struct qedr_qp {
/* synchronization objects used with iwarp ep */ /* synchronization objects used with iwarp ep */
struct kref refcnt; struct kref refcnt;
struct completion iwarp_cm_comp; struct completion iwarp_cm_comp;
struct completion qp_rel_comp;
unsigned long iwarp_cm_flags; /* enum iwarp_cm_flags */ unsigned long iwarp_cm_flags; /* enum iwarp_cm_flags */
}; };
......
...@@ -83,7 +83,7 @@ static void qedr_iw_free_qp(struct kref *ref) ...@@ -83,7 +83,7 @@ static void qedr_iw_free_qp(struct kref *ref)
{ {
struct qedr_qp *qp = container_of(ref, struct qedr_qp, refcnt); struct qedr_qp *qp = container_of(ref, struct qedr_qp, refcnt);
kfree(qp); complete(&qp->qp_rel_comp);
} }
static void static void
......
...@@ -1357,6 +1357,7 @@ static void qedr_set_common_qp_params(struct qedr_dev *dev, ...@@ -1357,6 +1357,7 @@ static void qedr_set_common_qp_params(struct qedr_dev *dev,
if (rdma_protocol_iwarp(&dev->ibdev, 1)) { if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
kref_init(&qp->refcnt); kref_init(&qp->refcnt);
init_completion(&qp->iwarp_cm_comp); init_completion(&qp->iwarp_cm_comp);
init_completion(&qp->qp_rel_comp);
} }
qp->pd = pd; qp->pd = pd;
...@@ -2857,8 +2858,10 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) ...@@ -2857,8 +2858,10 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
qedr_free_qp_resources(dev, qp, udata); qedr_free_qp_resources(dev, qp, udata);
if (rdma_protocol_iwarp(&dev->ibdev, 1)) if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
qedr_iw_qp_rem_ref(&qp->ibqp); qedr_iw_qp_rem_ref(&qp->ibqp);
wait_for_completion(&qp->qp_rel_comp);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment