IB: Remove 'uobject->context' dependency in object destroy APIs
Now that we have the udata passed to all the ib_xxx object destroy APIs and the additional macro 'rdma_udata_to_drv_context' to get the ib_ucontext from ib_udata stored in uverbs_attr_bundle, we can finally start to remove the dependency of the drivers in the ib_xxx->uobject->context. Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@oracle.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:

committed by
Jason Gunthorpe

父節點
c4367a2635
當前提交
bdeacabd1a
@@ -38,6 +38,7 @@
|
||||
|
||||
#include "mlx4_ib.h"
|
||||
#include <rdma/mlx4-abi.h>
|
||||
#include <rdma/uverbs_ioctl.h>
|
||||
|
||||
static void mlx4_ib_cq_comp(struct mlx4_cq *cq)
|
||||
{
|
||||
@@ -493,8 +494,13 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
|
||||
mlx4_cq_free(dev->dev, &mcq->mcq);
|
||||
mlx4_mtt_cleanup(dev->dev, &mcq->buf.mtt);
|
||||
|
||||
if (cq->uobject) {
|
||||
mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db);
|
||||
if (udata) {
|
||||
mlx4_ib_db_unmap_user(
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx4_ib_ucontext,
|
||||
ibucontext),
|
||||
&mcq->db);
|
||||
ib_umem_release(mcq->umem);
|
||||
} else {
|
||||
mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe);
|
||||
|
@@ -1338,7 +1338,8 @@ static void destroy_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp)
|
||||
}
|
||||
|
||||
static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
|
||||
enum mlx4_ib_source_type src, bool is_user)
|
||||
enum mlx4_ib_source_type src,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct mlx4_ib_cq *send_cq, *recv_cq;
|
||||
unsigned long flags;
|
||||
@@ -1380,7 +1381,7 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
|
||||
list_del(&qp->qps_list);
|
||||
list_del(&qp->cq_send_list);
|
||||
list_del(&qp->cq_recv_list);
|
||||
if (!is_user) {
|
||||
if (!udata) {
|
||||
__mlx4_ib_cq_clean(recv_cq, qp->mqp.qpn,
|
||||
qp->ibqp.srq ? to_msrq(qp->ibqp.srq): NULL);
|
||||
if (send_cq != recv_cq)
|
||||
@@ -1398,19 +1399,26 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
|
||||
if (qp->flags & MLX4_IB_QP_NETIF)
|
||||
mlx4_ib_steer_qp_free(dev, qp->mqp.qpn, 1);
|
||||
else if (src == MLX4_IB_RWQ_SRC)
|
||||
mlx4_ib_release_wqn(to_mucontext(
|
||||
qp->ibwq.uobject->context), qp, 1);
|
||||
mlx4_ib_release_wqn(
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx4_ib_ucontext,
|
||||
ibucontext),
|
||||
qp, 1);
|
||||
else
|
||||
mlx4_qp_release_range(dev->dev, qp->mqp.qpn, 1);
|
||||
}
|
||||
|
||||
mlx4_mtt_cleanup(dev->dev, &qp->mtt);
|
||||
|
||||
if (is_user) {
|
||||
if (udata) {
|
||||
if (qp->rq.wqe_cnt) {
|
||||
struct mlx4_ib_ucontext *mcontext = !src ?
|
||||
to_mucontext(qp->ibqp.uobject->context) :
|
||||
to_mucontext(qp->ibwq.uobject->context);
|
||||
struct mlx4_ib_ucontext *mcontext =
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx4_ib_ucontext,
|
||||
ibucontext);
|
||||
|
||||
mlx4_ib_db_unmap_user(mcontext, &qp->db);
|
||||
}
|
||||
ib_umem_release(qp->umem);
|
||||
@@ -1594,7 +1602,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd,
|
||||
return ibqp;
|
||||
}
|
||||
|
||||
static int _mlx4_ib_destroy_qp(struct ib_qp *qp)
|
||||
static int _mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
|
||||
{
|
||||
struct mlx4_ib_dev *dev = to_mdev(qp->device);
|
||||
struct mlx4_ib_qp *mqp = to_mqp(qp);
|
||||
@@ -1615,7 +1623,7 @@ static int _mlx4_ib_destroy_qp(struct ib_qp *qp)
|
||||
if (qp->rwq_ind_tbl) {
|
||||
destroy_qp_rss(dev, mqp);
|
||||
} else {
|
||||
destroy_qp_common(dev, mqp, MLX4_IB_QP_SRC, qp->uobject);
|
||||
destroy_qp_common(dev, mqp, MLX4_IB_QP_SRC, udata);
|
||||
}
|
||||
|
||||
if (is_sqp(dev, mqp))
|
||||
@@ -1637,7 +1645,7 @@ int mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
|
||||
ib_destroy_qp(sqp->roce_v2_gsi);
|
||||
}
|
||||
|
||||
return _mlx4_ib_destroy_qp(qp);
|
||||
return _mlx4_ib_destroy_qp(qp, udata);
|
||||
}
|
||||
|
||||
static int to_mlx4_st(struct mlx4_ib_dev *dev, enum mlx4_ib_qp_type type)
|
||||
@@ -4252,7 +4260,7 @@ int mlx4_ib_destroy_wq(struct ib_wq *ibwq, struct ib_udata *udata)
|
||||
if (qp->counter_index)
|
||||
mlx4_ib_free_qp_counter(dev, qp);
|
||||
|
||||
destroy_qp_common(dev, qp, MLX4_IB_RWQ_SRC, 1);
|
||||
destroy_qp_common(dev, qp, MLX4_IB_RWQ_SRC, udata);
|
||||
|
||||
kfree(qp);
|
||||
|
||||
|
@@ -280,8 +280,13 @@ int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
|
||||
mlx4_srq_free(dev->dev, &msrq->msrq);
|
||||
mlx4_mtt_cleanup(dev->dev, &msrq->mtt);
|
||||
|
||||
if (srq->uobject) {
|
||||
mlx4_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db);
|
||||
if (udata) {
|
||||
mlx4_ib_db_unmap_user(
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx4_ib_ucontext,
|
||||
ibucontext),
|
||||
&msrq->db);
|
||||
ib_umem_release(msrq->umem);
|
||||
} else {
|
||||
kvfree(msrq->wrid);
|
||||
|
Reference in New Issue
Block a user