|
@@ -1650,8 +1650,8 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|
|
if (err)
|
|
if (err)
|
|
|
return ERR_PTR(err);
|
|
return ERR_PTR(err);
|
|
|
|
|
|
|
|
- if (req.flags)
|
|
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
|
|
|
|
+ if (req.flags & ~MLX5_IB_ALLOC_UCTX_DEVX)
|
|
|
|
|
+ return ERR_PTR(-EOPNOTSUPP);
|
|
|
|
|
|
|
|
if (req.comp_mask || req.reserved0 || req.reserved1 || req.reserved2)
|
|
if (req.comp_mask || req.reserved0 || req.reserved1 || req.reserved2)
|
|
|
return ERR_PTR(-EOPNOTSUPP);
|
|
return ERR_PTR(-EOPNOTSUPP);
|
|
@@ -1735,6 +1735,18 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|
|
goto out_uars;
|
|
goto out_uars;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
|
|
|
|
|
+ /* Block DEVX on Infiniband as of SELinux */
|
|
|
|
|
+ if (mlx5_ib_port_link_layer(ibdev, 1) != IB_LINK_LAYER_ETHERNET) {
|
|
|
|
|
+ err = -EPERM;
|
|
|
|
|
+ goto out_td;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ err = mlx5_ib_devx_create(dev, context);
|
|
|
|
|
+ if (err)
|
|
|
|
|
+ goto out_td;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
INIT_LIST_HEAD(&context->vma_private_list);
|
|
INIT_LIST_HEAD(&context->vma_private_list);
|
|
|
mutex_init(&context->vma_private_list_mutex);
|
|
mutex_init(&context->vma_private_list_mutex);
|
|
|
INIT_LIST_HEAD(&context->db_page_list);
|
|
INIT_LIST_HEAD(&context->db_page_list);
|
|
@@ -1795,7 +1807,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|
|
|
|
|
|
|
err = ib_copy_to_udata(udata, &resp, resp.response_length);
|
|
err = ib_copy_to_udata(udata, &resp, resp.response_length);
|
|
|
if (err)
|
|
if (err)
|
|
|
- goto out_td;
|
|
|
|
|
|
|
+ goto out_mdev;
|
|
|
|
|
|
|
|
bfregi->ver = ver;
|
|
bfregi->ver = ver;
|
|
|
bfregi->num_low_latency_bfregs = req.num_low_latency_bfregs;
|
|
bfregi->num_low_latency_bfregs = req.num_low_latency_bfregs;
|
|
@@ -1805,6 +1817,9 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|
|
|
|
|
|
|
return &context->ibucontext;
|
|
return &context->ibucontext;
|
|
|
|
|
|
|
|
|
|
+out_mdev:
|
|
|
|
|
+ if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX)
|
|
|
|
|
+ mlx5_ib_devx_destroy(dev, context);
|
|
|
out_td:
|
|
out_td:
|
|
|
if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
|
if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
|
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|
|
@@ -1830,6 +1845,9 @@ static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
|
|
|
struct mlx5_ib_dev *dev = to_mdev(ibcontext->device);
|
|
struct mlx5_ib_dev *dev = to_mdev(ibcontext->device);
|
|
|
struct mlx5_bfreg_info *bfregi;
|
|
struct mlx5_bfreg_info *bfregi;
|
|
|
|
|
|
|
|
|
|
+ if (context->devx_uid)
|
|
|
|
|
+ mlx5_ib_devx_destroy(dev, context);
|
|
|
|
|
+
|
|
|
bfregi = &context->bfregi;
|
|
bfregi = &context->bfregi;
|
|
|
if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
|
if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
|
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|