diff options
Diffstat (limited to 'drivers/infiniband/hw/qedr')
| -rw-r--r-- | drivers/infiniband/hw/qedr/qedr.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qedr/qedr_iw_cm.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qedr/verbs.c | 5 | 
3 files changed, 6 insertions, 2 deletions
| diff --git a/drivers/infiniband/hw/qedr/qedr.h b/drivers/infiniband/hw/qedr/qedr.h index 3cb4febaad0f..8def88cfa300 100644 --- a/drivers/infiniband/hw/qedr/qedr.h +++ b/drivers/infiniband/hw/qedr/qedr.h @@ -455,6 +455,7 @@ struct qedr_qp {  	/* synchronization objects used with iwarp ep */  	struct kref refcnt;  	struct completion iwarp_cm_comp; +	struct completion qp_rel_comp;  	unsigned long iwarp_cm_flags; /* enum iwarp_cm_flags */  }; diff --git a/drivers/infiniband/hw/qedr/qedr_iw_cm.c b/drivers/infiniband/hw/qedr/qedr_iw_cm.c index 1715fbe0719d..a51fc6854984 100644 --- a/drivers/infiniband/hw/qedr/qedr_iw_cm.c +++ b/drivers/infiniband/hw/qedr/qedr_iw_cm.c @@ -83,7 +83,7 @@ static void qedr_iw_free_qp(struct kref *ref)  {  	struct qedr_qp *qp = container_of(ref, struct qedr_qp, refcnt); -	kfree(qp); +	complete(&qp->qp_rel_comp);  }  static void diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c index 3fbf172dbbef..dcb3653db72d 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c @@ -1357,6 +1357,7 @@ static void qedr_set_common_qp_params(struct qedr_dev *dev,  	if (rdma_protocol_iwarp(&dev->ibdev, 1)) {  		kref_init(&qp->refcnt);  		init_completion(&qp->iwarp_cm_comp); +		init_completion(&qp->qp_rel_comp);  	}  	qp->pd = pd; @@ -2857,8 +2858,10 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *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); +		wait_for_completion(&qp->qp_rel_comp); +	}  	return 0;  } |