Skip to content

Commit fb98153

Browse files
yishaihdledford
authored andcommitted
IB/mlx5: Enforce DEVX privilege by firmware
Enforce DEVX privilege by firmware, this enables future device functionality without the need to make driver changes unless a new privilege type will be introduced. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Reviewed-by: Artemy Kovalyov <artemyko@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
1 parent 34613eb commit fb98153

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

drivers/infiniband/hw/mlx5/devx.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,31 @@ devx_ufile2uctx(const struct uverbs_attr_bundle *attrs)
4747
return to_mucontext(ib_uverbs_get_ucontext(attrs));
4848
}
4949

50-
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev)
50+
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user)
5151
{
5252
u32 in[MLX5_ST_SZ_DW(create_uctx_in)] = {0};
5353
u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {0};
5454
u64 general_obj_types;
55-
void *hdr;
55+
void *hdr, *uctx;
5656
int err;
5757
u16 uid;
58+
u32 cap = 0;
5859

5960
hdr = MLX5_ADDR_OF(create_uctx_in, in, hdr);
61+
uctx = MLX5_ADDR_OF(create_uctx_in, in, uctx);
6062

6163
general_obj_types = MLX5_CAP_GEN_64(dev->mdev, general_obj_types);
6264
if (!(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UCTX) ||
6365
!(general_obj_types & MLX5_GENERAL_OBJ_TYPES_CAP_UMEM))
6466
return -EINVAL;
6567

68+
if (is_user && capable(CAP_NET_RAW) &&
69+
(MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RAW_TX))
70+
cap |= MLX5_UCTX_CAP_RAW_TX;
71+
6672
MLX5_SET(general_obj_in_cmd_hdr, hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
6773
MLX5_SET(general_obj_in_cmd_hdr, hdr, obj_type, MLX5_OBJ_TYPE_UCTX);
74+
MLX5_SET(uctx, uctx, cap, cap);
6875

6976
err = mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, sizeof(out));
7077
if (err)
@@ -672,9 +679,6 @@ static int devx_get_uid(struct mlx5_ib_ucontext *c, void *cmd_in)
672679
if (!c->devx_uid)
673680
return -EINVAL;
674681

675-
if (!capable(CAP_NET_RAW))
676-
return -EPERM;
677-
678682
return c->devx_uid;
679683
}
680684
static bool devx_is_general_cmd(void *in)
@@ -1239,9 +1243,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
12391243
if (!c->devx_uid)
12401244
return -EINVAL;
12411245

1242-
if (!capable(CAP_NET_RAW))
1243-
return -EPERM;
1244-
12451246
obj = kzalloc(sizeof(struct devx_umem), GFP_KERNEL);
12461247
if (!obj)
12471248
return -ENOMEM;

drivers/infiniband/hw/mlx5/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,7 +1763,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
17631763
#endif
17641764

17651765
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
1766-
err = mlx5_ib_devx_create(dev);
1766+
err = mlx5_ib_devx_create(dev, true);
17671767
if (err < 0)
17681768
goto out_uars;
17691769
context->devx_uid = err;
@@ -6234,7 +6234,7 @@ static int mlx5_ib_stage_devx_init(struct mlx5_ib_dev *dev)
62346234
{
62356235
int uid;
62366236

6237-
uid = mlx5_ib_devx_create(dev);
6237+
uid = mlx5_ib_devx_create(dev, false);
62386238
if (uid > 0)
62396239
dev->devx_whitelist_uid = uid;
62406240

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,7 @@ void mlx5_ib_put_native_port_mdev(struct mlx5_ib_dev *dev,
12681268
u8 port_num);
12691269

12701270
#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
1271-
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev);
1271+
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
12721272
void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid);
12731273
const struct uverbs_object_tree_def *mlx5_ib_get_devx_tree(void);
12741274
extern const struct uapi_definition mlx5_ib_devx_defs[];
@@ -1283,7 +1283,8 @@ int mlx5_ib_get_flow_trees(const struct uverbs_object_tree_def **root);
12831283
void mlx5_ib_destroy_flow_action_raw(struct mlx5_ib_flow_action *maction);
12841284
#else
12851285
static inline int
1286-
mlx5_ib_devx_create(struct mlx5_ib_dev *dev) { return -EOPNOTSUPP; };
1286+
mlx5_ib_devx_create(struct mlx5_ib_dev *dev,
1287+
bool is_user) { return -EOPNOTSUPP; }
12871288
static inline void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid) {}
12881289
static inline bool mlx5_ib_devx_is_flow_dest(void *obj, int *dest_id,
12891290
int *dest_type)

0 commit comments

Comments
 (0)