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

parent
c4367a2635
commit
bdeacabd1a
@@ -796,9 +796,12 @@ err_umem:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_ucontext *context)
|
||||
static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_udata *udata)
|
||||
{
|
||||
mlx5_ib_db_unmap_user(to_mucontext(context), &cq->db);
|
||||
struct mlx5_ib_ucontext *context = rdma_udata_to_drv_context(
|
||||
udata, struct mlx5_ib_ucontext, ibucontext);
|
||||
|
||||
mlx5_ib_db_unmap_user(context, &cq->db);
|
||||
ib_umem_release(cq->buf.umem);
|
||||
}
|
||||
|
||||
@@ -923,7 +926,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
||||
INIT_LIST_HEAD(&cq->list_send_qp);
|
||||
INIT_LIST_HEAD(&cq->list_recv_qp);
|
||||
|
||||
if (context) {
|
||||
if (udata) {
|
||||
err = create_cq_user(dev, udata, context, cq, entries,
|
||||
&cqb, &cqe_size, &index, &inlen);
|
||||
if (err)
|
||||
@@ -985,8 +988,8 @@ err_cmd:
|
||||
|
||||
err_cqb:
|
||||
kvfree(cqb);
|
||||
if (context)
|
||||
destroy_cq_user(cq, context);
|
||||
if (udata)
|
||||
destroy_cq_user(cq, udata);
|
||||
else
|
||||
destroy_cq_kernel(dev, cq);
|
||||
|
||||
@@ -1000,14 +1003,10 @@ int mlx5_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_dev *dev = to_mdev(cq->device);
|
||||
struct mlx5_ib_cq *mcq = to_mcq(cq);
|
||||
struct ib_ucontext *context = NULL;
|
||||
|
||||
if (cq->uobject)
|
||||
context = cq->uobject->context;
|
||||
|
||||
mlx5_core_destroy_cq(dev->mdev, &mcq->mcq);
|
||||
if (context)
|
||||
destroy_cq_user(mcq, context);
|
||||
if (udata)
|
||||
destroy_cq_user(mcq, udata);
|
||||
else
|
||||
destroy_cq_kernel(dev, mcq);
|
||||
|
||||
|
@@ -2329,7 +2329,10 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
|
||||
page_idx = (dm->dev_addr - pci_resource_start(memic->dev->pdev, 0) -
|
||||
MLX5_CAP64_DEV_MEM(memic->dev, memic_bar_start_addr)) >>
|
||||
PAGE_SHIFT;
|
||||
bitmap_clear(to_mucontext(ibdm->uobject->context)->dm_pages,
|
||||
bitmap_clear(rdma_udata_to_drv_context(
|
||||
&attrs->driver_udata,
|
||||
struct mlx5_ib_ucontext,
|
||||
ibucontext)->dm_pages,
|
||||
page_idx,
|
||||
DIV_ROUND_UP(act_size, PAGE_SIZE));
|
||||
|
||||
|
@@ -777,14 +777,17 @@ err_umem:
|
||||
}
|
||||
|
||||
static void destroy_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
struct mlx5_ib_rwq *rwq)
|
||||
struct mlx5_ib_rwq *rwq, struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_ucontext *context;
|
||||
struct mlx5_ib_ucontext *context =
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx5_ib_ucontext,
|
||||
ibucontext);
|
||||
|
||||
if (rwq->create_flags & MLX5_IB_WQ_FLAGS_DELAY_DROP)
|
||||
atomic_dec(&dev->delay_drop.rqs_cnt);
|
||||
|
||||
context = to_mucontext(pd->uobject->context);
|
||||
mlx5_ib_db_unmap_user(context, &rwq->db);
|
||||
if (rwq->umem)
|
||||
ib_umem_release(rwq->umem);
|
||||
@@ -983,11 +986,15 @@ err_bfreg:
|
||||
}
|
||||
|
||||
static void destroy_qp_user(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
struct mlx5_ib_qp *qp, struct mlx5_ib_qp_base *base)
|
||||
struct mlx5_ib_qp *qp, struct mlx5_ib_qp_base *base,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_ucontext *context;
|
||||
struct mlx5_ib_ucontext *context =
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx5_ib_ucontext,
|
||||
ibucontext);
|
||||
|
||||
context = to_mucontext(pd->uobject->context);
|
||||
mlx5_ib_db_unmap_user(context, &qp->db);
|
||||
if (base->ubuffer.umem)
|
||||
ib_umem_release(base->ubuffer.umem);
|
||||
@@ -2284,7 +2291,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
|
||||
err_create:
|
||||
if (qp->create_type == MLX5_QP_USER)
|
||||
destroy_qp_user(dev, pd, qp, base);
|
||||
destroy_qp_user(dev, pd, qp, base, udata);
|
||||
else if (qp->create_type == MLX5_QP_KERNEL)
|
||||
destroy_qp_kernel(dev, qp);
|
||||
|
||||
@@ -2395,7 +2402,8 @@ static int modify_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
const struct mlx5_modify_raw_qp_param *raw_qp_param,
|
||||
u8 lag_tx_affinity);
|
||||
|
||||
static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
|
||||
static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
struct mlx5_ib_cq *send_cq, *recv_cq;
|
||||
struct mlx5_ib_qp_base *base;
|
||||
@@ -2466,7 +2474,7 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
|
||||
if (qp->create_type == MLX5_QP_KERNEL)
|
||||
destroy_qp_kernel(dev, qp);
|
||||
else if (qp->create_type == MLX5_QP_USER)
|
||||
destroy_qp_user(dev, &get_pd(qp)->ibpd, qp, base);
|
||||
destroy_qp_user(dev, &get_pd(qp)->ibpd, qp, base, udata);
|
||||
}
|
||||
|
||||
static const char *ib_qp_type_str(enum ib_qp_type type)
|
||||
@@ -2743,7 +2751,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
|
||||
if (mqp->qp_sub_type == MLX5_IB_QPT_DCT)
|
||||
return mlx5_ib_destroy_dct(mqp);
|
||||
|
||||
destroy_qp_common(dev, mqp);
|
||||
destroy_qp_common(dev, mqp, udata);
|
||||
|
||||
kfree(mqp);
|
||||
|
||||
@@ -5959,7 +5967,7 @@ struct ib_wq *mlx5_ib_create_wq(struct ib_pd *pd,
|
||||
err_copy:
|
||||
mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp);
|
||||
err_user_rq:
|
||||
destroy_user_rq(dev, pd, rwq);
|
||||
destroy_user_rq(dev, pd, rwq, udata);
|
||||
err:
|
||||
kfree(rwq);
|
||||
return ERR_PTR(err);
|
||||
@@ -5971,7 +5979,7 @@ int mlx5_ib_destroy_wq(struct ib_wq *wq, struct ib_udata *udata)
|
||||
struct mlx5_ib_rwq *rwq = to_mrwq(wq);
|
||||
|
||||
mlx5_core_destroy_rq_tracked(dev->mdev, &rwq->core_qp);
|
||||
destroy_user_rq(dev, wq->pd, rwq);
|
||||
destroy_user_rq(dev, wq->pd, rwq, udata);
|
||||
kfree(rwq);
|
||||
|
||||
return 0;
|
||||
|
@@ -194,9 +194,15 @@ err_db:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq)
|
||||
static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
||||
struct ib_udata *udata)
|
||||
{
|
||||
mlx5_ib_db_unmap_user(to_mucontext(pd->uobject->context), &srq->db);
|
||||
mlx5_ib_db_unmap_user(
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx5_ib_ucontext,
|
||||
ibucontext),
|
||||
&srq->db);
|
||||
ib_umem_release(srq->umem);
|
||||
}
|
||||
|
||||
@@ -327,7 +333,7 @@ err_core:
|
||||
|
||||
err_usr_kern_srq:
|
||||
if (udata)
|
||||
destroy_srq_user(pd, srq);
|
||||
destroy_srq_user(pd, srq, udata);
|
||||
else
|
||||
destroy_srq_kernel(dev, srq);
|
||||
|
||||
@@ -395,7 +401,12 @@ int mlx5_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata)
|
||||
mlx5_cmd_destroy_srq(dev, &msrq->msrq);
|
||||
|
||||
if (srq->uobject) {
|
||||
mlx5_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db);
|
||||
mlx5_ib_db_unmap_user(
|
||||
rdma_udata_to_drv_context(
|
||||
udata,
|
||||
struct mlx5_ib_ucontext,
|
||||
ibucontext),
|
||||
&msrq->db);
|
||||
ib_umem_release(msrq->umem);
|
||||
} else {
|
||||
destroy_srq_kernel(dev, msrq);
|
||||
|
Reference in New Issue
Block a user