aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/sw
diff options
context:
space:
mode:
authorDennis Dalessandro <dennis.dalessandro@intel.com>2016-01-22 13:00:42 -0800
committerDoug Ledford <dledford@redhat.com>2016-03-10 20:37:25 -0500
commit5a17ad11da322e3040b570e69a14a41a37060e5f (patch)
treec02d07b4c24103bbffc497975da08501fec1f29d /drivers/infiniband/sw
parentIB/rdmavt: Add modify qp (diff)
downloadlinux-dev-5a17ad11da322e3040b570e69a14a41a37060e5f.tar.xz
linux-dev-5a17ad11da322e3040b570e69a14a41a37060e5f.zip
IB/rdmavt: Add destroy qp verb
This patch adds in support the qp destroy verb call. Reviewed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/sw')
-rw-r--r--drivers/infiniband/sw/rdmavt/qp.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c
index 94421268b84c..cca65a6a2142 100644
--- a/drivers/infiniband/sw/rdmavt/qp.c
+++ b/drivers/infiniband/sw/rdmavt/qp.c
@@ -1201,13 +1201,30 @@ inval:
*/
int rvt_destroy_qp(struct ib_qp *ibqp)
{
- /*
- * VT-DRIVER-API: qp_flush()
- * Driver provies a mechanism to flush and wait for that flush to
- * finish.
- */
+ struct rvt_qp *qp = ibqp_to_rvtqp(ibqp);
+ struct rvt_dev_info *rdi = ib_to_rvt(ibqp->device);
- return -EOPNOTSUPP;
+ spin_lock_irq(&qp->r_lock);
+ spin_lock(&qp->s_lock);
+ rvt_reset_qp(rdi, qp, ibqp->qp_type);
+ spin_unlock(&qp->s_lock);
+ spin_unlock_irq(&qp->r_lock);
+
+ /* qpn is now available for use again */
+ rvt_free_qpn(&rdi->qp_dev->qpn_table, qp->ibqp.qp_num);
+
+ spin_lock(&rdi->n_qps_lock);
+ rdi->n_qps_allocated--;
+ spin_unlock(&rdi->n_qps_lock);
+
+ if (qp->ip)
+ kref_put(&qp->ip->ref, rvt_release_mmap_info);
+ else
+ vfree(qp->r_rq.wq);
+ vfree(qp->s_wq);
+ rdi->driver_f.qp_priv_free(rdi, qp);
+ kfree(qp);
+ return 0;
}
int rvt_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,