mirror of https://gitee.com/openkylin/linux.git
RDMA/core: Make invalidate_range a device operation
The callback function 'invalidate_range' is implemented in a driver so the place for it is in the ib_device_ops structure and not in ib_ucontext. Signed-off-by: Moni Shoua <monis@mellanox.com> Reviewed-by: Guy Levi <guyle@mellanox.com> Reviewed-by: Jason Gunthorpe <jgg@mellanox.com> Link: https://lore.kernel.org/r/20190819111710.18440-11-leon@kernel.org Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
37824952dc
commit
ce51346fee
|
@ -2562,6 +2562,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
|
||||||
SET_DEVICE_OP(dev_ops, get_vf_config);
|
SET_DEVICE_OP(dev_ops, get_vf_config);
|
||||||
SET_DEVICE_OP(dev_ops, get_vf_stats);
|
SET_DEVICE_OP(dev_ops, get_vf_stats);
|
||||||
SET_DEVICE_OP(dev_ops, init_port);
|
SET_DEVICE_OP(dev_ops, init_port);
|
||||||
|
SET_DEVICE_OP(dev_ops, invalidate_range);
|
||||||
SET_DEVICE_OP(dev_ops, iw_accept);
|
SET_DEVICE_OP(dev_ops, iw_accept);
|
||||||
SET_DEVICE_OP(dev_ops, iw_add_ref);
|
SET_DEVICE_OP(dev_ops, iw_add_ref);
|
||||||
SET_DEVICE_OP(dev_ops, iw_connect);
|
SET_DEVICE_OP(dev_ops, iw_connect);
|
||||||
|
|
|
@ -96,7 +96,7 @@ static void ib_umem_notifier_release(struct mmu_notifier *mn,
|
||||||
*/
|
*/
|
||||||
ib_umem_notifier_start_account(umem_odp);
|
ib_umem_notifier_start_account(umem_odp);
|
||||||
complete_all(&umem_odp->notifier_completion);
|
complete_all(&umem_odp->notifier_completion);
|
||||||
umem_odp->umem.context->invalidate_range(
|
umem_odp->umem.context->device->ops.invalidate_range(
|
||||||
umem_odp, ib_umem_start(umem_odp),
|
umem_odp, ib_umem_start(umem_odp),
|
||||||
ib_umem_end(umem_odp));
|
ib_umem_end(umem_odp));
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ static int invalidate_range_start_trampoline(struct ib_umem_odp *item,
|
||||||
u64 start, u64 end, void *cookie)
|
u64 start, u64 end, void *cookie)
|
||||||
{
|
{
|
||||||
ib_umem_notifier_start_account(item);
|
ib_umem_notifier_start_account(item);
|
||||||
item->umem.context->invalidate_range(item, start, end);
|
item->umem.context->device->ops.invalidate_range(item, start, end);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_udata *udata,
|
||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
return ERR_PTR(-EIO);
|
return ERR_PTR(-EIO);
|
||||||
if (WARN_ON_ONCE(!context->invalidate_range))
|
if (WARN_ON_ONCE(!context->device->ops.invalidate_range))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
umem_odp = kzalloc(sizeof(*umem_odp), GFP_KERNEL);
|
umem_odp = kzalloc(sizeof(*umem_odp), GFP_KERNEL);
|
||||||
|
@ -479,7 +479,7 @@ struct ib_umem_odp *ib_umem_odp_get(struct ib_udata *udata, unsigned long addr,
|
||||||
return ERR_PTR(-EIO);
|
return ERR_PTR(-EIO);
|
||||||
|
|
||||||
if (WARN_ON_ONCE(!(access & IB_ACCESS_ON_DEMAND)) ||
|
if (WARN_ON_ONCE(!(access & IB_ACCESS_ON_DEMAND)) ||
|
||||||
WARN_ON_ONCE(!context->invalidate_range))
|
WARN_ON_ONCE(!context->device->ops.invalidate_range))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
umem_odp = kzalloc(sizeof(struct ib_umem_odp), GFP_KERNEL);
|
umem_odp = kzalloc(sizeof(struct ib_umem_odp), GFP_KERNEL);
|
||||||
|
@ -607,7 +607,7 @@ static int ib_umem_odp_map_dma_single_page(
|
||||||
|
|
||||||
if (remove_existing_mapping) {
|
if (remove_existing_mapping) {
|
||||||
ib_umem_notifier_start_account(umem_odp);
|
ib_umem_notifier_start_account(umem_odp);
|
||||||
context->invalidate_range(
|
dev->ops.invalidate_range(
|
||||||
umem_odp,
|
umem_odp,
|
||||||
ib_umem_start(umem_odp) +
|
ib_umem_start(umem_odp) +
|
||||||
(page_index << umem_odp->page_shift),
|
(page_index << umem_odp->page_shift),
|
||||||
|
|
|
@ -275,8 +275,6 @@ static int ib_uverbs_get_context(struct uverbs_attr_bundle *attrs)
|
||||||
ret = ib_dev->ops.alloc_ucontext(ucontext, &attrs->driver_udata);
|
ret = ib_dev->ops.alloc_ucontext(ucontext, &attrs->driver_udata);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_file;
|
goto err_file;
|
||||||
if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING))
|
|
||||||
ucontext->invalidate_range = NULL;
|
|
||||||
|
|
||||||
rdma_restrack_uadd(&ucontext->res);
|
rdma_restrack_uadd(&ucontext->res);
|
||||||
|
|
||||||
|
|
|
@ -1867,10 +1867,6 @@ static int mlx5_ib_alloc_ucontext(struct ib_ucontext *uctx,
|
||||||
if (err)
|
if (err)
|
||||||
goto out_sys_pages;
|
goto out_sys_pages;
|
||||||
|
|
||||||
if (ibdev->attrs.device_cap_flags & IB_DEVICE_ON_DEMAND_PAGING)
|
|
||||||
context->ibucontext.invalidate_range =
|
|
||||||
&mlx5_ib_invalidate_range;
|
|
||||||
|
|
||||||
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
|
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
|
||||||
err = mlx5_ib_devx_create(dev, true);
|
err = mlx5_ib_devx_create(dev, true);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
|
@ -1612,6 +1612,7 @@ void mlx5_odp_init_mr_cache_entry(struct mlx5_cache_ent *ent)
|
||||||
|
|
||||||
static const struct ib_device_ops mlx5_ib_dev_odp_ops = {
|
static const struct ib_device_ops mlx5_ib_dev_odp_ops = {
|
||||||
.advise_mr = mlx5_ib_advise_mr,
|
.advise_mr = mlx5_ib_advise_mr,
|
||||||
|
.invalidate_range = mlx5_ib_invalidate_range,
|
||||||
};
|
};
|
||||||
|
|
||||||
int mlx5_ib_odp_init_one(struct mlx5_ib_dev *dev)
|
int mlx5_ib_odp_init_one(struct mlx5_ib_dev *dev)
|
||||||
|
|
|
@ -1417,8 +1417,6 @@ struct ib_ucontext {
|
||||||
|
|
||||||
bool cleanup_retryable;
|
bool cleanup_retryable;
|
||||||
|
|
||||||
void (*invalidate_range)(struct ib_umem_odp *umem_odp,
|
|
||||||
unsigned long start, unsigned long end);
|
|
||||||
struct mutex per_mm_list_lock;
|
struct mutex per_mm_list_lock;
|
||||||
struct list_head per_mm_list;
|
struct list_head per_mm_list;
|
||||||
|
|
||||||
|
@ -2378,6 +2376,8 @@ struct ib_device_ops {
|
||||||
u64 iova);
|
u64 iova);
|
||||||
int (*unmap_fmr)(struct list_head *fmr_list);
|
int (*unmap_fmr)(struct list_head *fmr_list);
|
||||||
int (*dealloc_fmr)(struct ib_fmr *fmr);
|
int (*dealloc_fmr)(struct ib_fmr *fmr);
|
||||||
|
void (*invalidate_range)(struct ib_umem_odp *umem_odp,
|
||||||
|
unsigned long start, unsigned long end);
|
||||||
int (*attach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
|
int (*attach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
|
||||||
int (*detach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
|
int (*detach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
|
||||||
struct ib_xrcd *(*alloc_xrcd)(struct ib_device *device,
|
struct ib_xrcd *(*alloc_xrcd)(struct ib_device *device,
|
||||||
|
|
Loading…
Reference in New Issue