IB/mlx5: Set uid as part of TD commands
Set uid as part of TD commands so that the firmware can manage the TD object in a secured way. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
d00614c057
commit
d2d19121ae
@ -231,6 +231,36 @@ void mlx5_cmd_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn, u16 uid)
|
|||||||
mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mlx5_cmd_alloc_transport_domain(struct mlx5_core_dev *dev, u32 *tdn,
|
||||||
|
u16 uid)
|
||||||
|
{
|
||||||
|
u32 in[MLX5_ST_SZ_DW(alloc_transport_domain_in)] = {0};
|
||||||
|
u32 out[MLX5_ST_SZ_DW(alloc_transport_domain_out)] = {0};
|
||||||
|
int err;
|
||||||
|
|
||||||
|
MLX5_SET(alloc_transport_domain_in, in, opcode,
|
||||||
|
MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN);
|
||||||
|
|
||||||
|
err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||||
|
if (!err)
|
||||||
|
*tdn = MLX5_GET(alloc_transport_domain_out, out,
|
||||||
|
transport_domain);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mlx5_cmd_dealloc_transport_domain(struct mlx5_core_dev *dev, u32 tdn,
|
||||||
|
u16 uid)
|
||||||
|
{
|
||||||
|
u32 in[MLX5_ST_SZ_DW(dealloc_transport_domain_in)] = {0};
|
||||||
|
u32 out[MLX5_ST_SZ_DW(dealloc_transport_domain_out)] = {0};
|
||||||
|
|
||||||
|
MLX5_SET(dealloc_transport_domain_in, in, opcode,
|
||||||
|
MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
|
||||||
|
MLX5_SET(dealloc_transport_domain_in, in, transport_domain, tdn);
|
||||||
|
mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||||
|
}
|
||||||
|
|
||||||
void mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid)
|
void mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid)
|
||||||
{
|
{
|
||||||
u32 out[MLX5_ST_SZ_DW(dealloc_pd_out)] = {};
|
u32 out[MLX5_ST_SZ_DW(dealloc_pd_out)] = {};
|
||||||
|
@ -51,6 +51,10 @@ void mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid);
|
|||||||
void mlx5_cmd_destroy_tir(struct mlx5_core_dev *dev, u32 tirn, u16 uid);
|
void mlx5_cmd_destroy_tir(struct mlx5_core_dev *dev, u32 tirn, u16 uid);
|
||||||
void mlx5_cmd_destroy_tis(struct mlx5_core_dev *dev, u32 tisn, u16 uid);
|
void mlx5_cmd_destroy_tis(struct mlx5_core_dev *dev, u32 tisn, u16 uid);
|
||||||
void mlx5_cmd_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn, u16 uid);
|
void mlx5_cmd_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn, u16 uid);
|
||||||
|
int mlx5_cmd_alloc_transport_domain(struct mlx5_core_dev *dev, u32 *tdn,
|
||||||
|
u16 uid);
|
||||||
|
void mlx5_cmd_dealloc_transport_domain(struct mlx5_core_dev *dev, u32 tdn,
|
||||||
|
u16 uid);
|
||||||
int mlx5_cmd_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid,
|
int mlx5_cmd_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid,
|
||||||
u32 qpn, u16 uid);
|
u32 qpn, u16 uid);
|
||||||
int mlx5_cmd_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid,
|
int mlx5_cmd_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid,
|
||||||
|
@ -1613,14 +1613,15 @@ void mlx5_ib_disable_lb(struct mlx5_ib_dev *dev, bool td, bool qp)
|
|||||||
mutex_unlock(&dev->lb.mutex);
|
mutex_unlock(&dev->lb.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn)
|
static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn,
|
||||||
|
u16 uid)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
if (!MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = mlx5_core_alloc_transport_domain(dev->mdev, tdn);
|
err = mlx5_cmd_alloc_transport_domain(dev->mdev, tdn, uid);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@ -1632,12 +1633,13 @@ static int mlx5_ib_alloc_transport_domain(struct mlx5_ib_dev *dev, u32 *tdn)
|
|||||||
return mlx5_ib_enable_lb(dev, true, false);
|
return mlx5_ib_enable_lb(dev, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn)
|
static void mlx5_ib_dealloc_transport_domain(struct mlx5_ib_dev *dev, u32 tdn,
|
||||||
|
u16 uid)
|
||||||
{
|
{
|
||||||
if (!MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
if (!MLX5_CAP_GEN(dev->mdev, log_max_transport_domain))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mlx5_core_dealloc_transport_domain(dev->mdev, tdn);
|
mlx5_cmd_dealloc_transport_domain(dev->mdev, tdn, uid);
|
||||||
|
|
||||||
if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) ||
|
if ((MLX5_CAP_GEN(dev->mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH) ||
|
||||||
(!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) &&
|
(!MLX5_CAP_GEN(dev->mdev, disable_local_lb_uc) &&
|
||||||
@ -1756,22 +1758,23 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|||||||
context->ibucontext.invalidate_range = &mlx5_ib_invalidate_range;
|
context->ibucontext.invalidate_range = &mlx5_ib_invalidate_range;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
err = mlx5_ib_alloc_transport_domain(dev, &context->tdn);
|
|
||||||
if (err)
|
|
||||||
goto out_uars;
|
|
||||||
|
|
||||||
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
|
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
|
||||||
/* Block DEVX on Infiniband as of SELinux */
|
/* Block DEVX on Infiniband as of SELinux */
|
||||||
if (mlx5_ib_port_link_layer(ibdev, 1) != IB_LINK_LAYER_ETHERNET) {
|
if (mlx5_ib_port_link_layer(ibdev, 1) != IB_LINK_LAYER_ETHERNET) {
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
goto out_td;
|
goto out_uars;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mlx5_ib_devx_create(dev, context);
|
err = mlx5_ib_devx_create(dev, context);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_td;
|
goto out_uars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = mlx5_ib_alloc_transport_domain(dev, &context->tdn,
|
||||||
|
context->devx_uid);
|
||||||
|
if (err)
|
||||||
|
goto out_devx;
|
||||||
|
|
||||||
if (MLX5_CAP_GEN(dev->mdev, dump_fill_mkey)) {
|
if (MLX5_CAP_GEN(dev->mdev, dump_fill_mkey)) {
|
||||||
err = mlx5_cmd_dump_fill_mkey(dev->mdev, &dump_fill_mkey);
|
err = mlx5_cmd_dump_fill_mkey(dev->mdev, &dump_fill_mkey);
|
||||||
if (err)
|
if (err)
|
||||||
@ -1864,10 +1867,10 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
|
|||||||
return &context->ibucontext;
|
return &context->ibucontext;
|
||||||
|
|
||||||
out_mdev:
|
out_mdev:
|
||||||
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid);
|
||||||
|
out_devx:
|
||||||
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX)
|
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX)
|
||||||
mlx5_ib_devx_destroy(dev, context);
|
mlx5_ib_devx_destroy(dev, context);
|
||||||
out_td:
|
|
||||||
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|
|
||||||
|
|
||||||
out_uars:
|
out_uars:
|
||||||
deallocate_uars(dev, context);
|
deallocate_uars(dev, context);
|
||||||
@ -1897,12 +1900,12 @@ static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
|
|||||||
mutex_unlock(&ibcontext->per_mm_list_lock);
|
mutex_unlock(&ibcontext->per_mm_list_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bfregi = &context->bfregi;
|
||||||
|
mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid);
|
||||||
|
|
||||||
if (context->devx_uid)
|
if (context->devx_uid)
|
||||||
mlx5_ib_devx_destroy(dev, context);
|
mlx5_ib_devx_destroy(dev, context);
|
||||||
|
|
||||||
bfregi = &context->bfregi;
|
|
||||||
mlx5_ib_dealloc_transport_domain(dev, context->tdn);
|
|
||||||
|
|
||||||
deallocate_uars(dev, context);
|
deallocate_uars(dev, context);
|
||||||
kfree(bfregi->sys_pages);
|
kfree(bfregi->sys_pages);
|
||||||
kfree(bfregi->count);
|
kfree(bfregi->count);
|
||||||
|
Loading…
Reference in New Issue
Block a user