Skip to content

Commit 592ebb3

Browse files
author
Benjamin Poirier
committed
RDMA/mlx5: Check enabled UCAPs when creating ucontext
JIRA: https://issues.redhat.com/browse/RHEL-72227 JIRA: https://issues.redhat.com/browse/RHEL-73520 Upstream-status: v6.15-rc1 commit 17ade53 Author: Chiara Meiohas <cmeiohas@nvidia.com> Date: Thu Mar 6 13:51:29 2025 +0200 RDMA/mlx5: Check enabled UCAPs when creating ucontext Verify that the enabled UCAPs are supported by the device before creating the ucontext. If supported, create the ucontext with the associated capabilities. Store the privileged ucontext UID on creation and remove it when destroying the privileged ucontext. This allows the command interface to recognize privileged commands through its UID. Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com> Link: https://patch.msgid.link/8b180583a207cb30deb7a2967934079749cdcc44.1741261611.git.leon@kernel.org Reviewed-by: Yishai Hadas <yishaih@nvidia.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Benjamin Poirier <bpoirier@redhat.com>
1 parent af347eb commit 592ebb3

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

drivers/infiniband/hw/mlx5/devx.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <rdma/uverbs_std_types.h>
1414
#include <linux/mlx5/driver.h>
1515
#include <linux/mlx5/fs.h>
16+
#include <rdma/ib_ucaps.h>
1617
#include "mlx5_ib.h"
1718
#include "devx.h"
1819
#include "qp.h"
@@ -122,7 +123,27 @@ devx_ufile2uctx(const struct uverbs_attr_bundle *attrs)
122123
return to_mucontext(ib_uverbs_get_ucontext(attrs));
123124
}
124125

125-
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user)
126+
static int set_uctx_ucaps(struct mlx5_ib_dev *dev, u64 req_ucaps, u32 *cap)
127+
{
128+
if (UCAP_ENABLED(req_ucaps, RDMA_UCAP_MLX5_CTRL_LOCAL)) {
129+
if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL)
130+
*cap |= MLX5_UCTX_CAP_RDMA_CTRL;
131+
else
132+
return -EOPNOTSUPP;
133+
}
134+
135+
if (UCAP_ENABLED(req_ucaps, RDMA_UCAP_MLX5_CTRL_OTHER_VHCA)) {
136+
if (MLX5_CAP_GEN(dev->mdev, uctx_cap) &
137+
MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA)
138+
*cap |= MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA;
139+
else
140+
return -EOPNOTSUPP;
141+
}
142+
143+
return 0;
144+
}
145+
146+
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user, u64 req_ucaps)
126147
{
127148
u32 in[MLX5_ST_SZ_DW(create_uctx_in)] = {};
128149
u32 out[MLX5_ST_SZ_DW(create_uctx_out)] = {};
@@ -146,6 +167,12 @@ int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user)
146167
capable(CAP_SYS_RAWIO))
147168
cap |= MLX5_UCTX_CAP_INTERNAL_DEV_RES;
148169

170+
if (req_ucaps) {
171+
err = set_uctx_ucaps(dev, req_ucaps, &cap);
172+
if (err)
173+
return err;
174+
}
175+
149176
MLX5_SET(create_uctx_in, in, opcode, MLX5_CMD_OP_CREATE_UCTX);
150177
MLX5_SET(uctx, uctx, cap, cap);
151178

@@ -2575,7 +2602,7 @@ int mlx5_ib_devx_init(struct mlx5_ib_dev *dev)
25752602
struct mlx5_devx_event_table *table = &dev->devx_event_table;
25762603
int uid;
25772604

2578-
uid = mlx5_ib_devx_create(dev, false);
2605+
uid = mlx5_ib_devx_create(dev, false, 0);
25792606
if (uid > 0) {
25802607
dev->devx_whitelist_uid = uid;
25812608
xa_init(&table->event_xa);

drivers/infiniband/hw/mlx5/devx.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ struct devx_obj {
2424
struct list_head event_sub; /* holds devx_event_subscription entries */
2525
};
2626
#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
27-
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
27+
int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user, u64 req_ucaps);
2828
void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid);
2929
int mlx5_ib_devx_init(struct mlx5_ib_dev *dev);
3030
void mlx5_ib_devx_cleanup(struct mlx5_ib_dev *dev);
3131
void mlx5_ib_ufile_hw_cleanup(struct ib_uverbs_file *ufile);
3232
#else
33-
static inline int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user)
33+
static inline int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user,
34+
u64 req_ucaps)
3435
{
3536
return -EOPNOTSUPP;
3637
}

drivers/infiniband/hw/mlx5/main.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,6 +1935,12 @@ static int set_ucontext_resp(struct ib_ucontext *uctx,
19351935
return 0;
19361936
}
19371937

1938+
static bool uctx_rdma_ctrl_is_enabled(u64 enabled_caps)
1939+
{
1940+
return UCAP_ENABLED(enabled_caps, RDMA_UCAP_MLX5_CTRL_LOCAL) ||
1941+
UCAP_ENABLED(enabled_caps, RDMA_UCAP_MLX5_CTRL_OTHER_VHCA);
1942+
}
1943+
19381944
static int mlx5_ib_alloc_ucontext(struct ib_ucontext *uctx,
19391945
struct ib_udata *udata)
19401946
{
@@ -1977,10 +1983,17 @@ static int mlx5_ib_alloc_ucontext(struct ib_ucontext *uctx,
19771983
return -EINVAL;
19781984

19791985
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) {
1980-
err = mlx5_ib_devx_create(dev, true);
1986+
err = mlx5_ib_devx_create(dev, true, uctx->enabled_caps);
19811987
if (err < 0)
19821988
goto out_ctx;
19831989
context->devx_uid = err;
1990+
1991+
if (uctx_rdma_ctrl_is_enabled(uctx->enabled_caps)) {
1992+
err = mlx5_cmd_add_privileged_uid(dev->mdev,
1993+
context->devx_uid);
1994+
if (err)
1995+
goto out_devx;
1996+
}
19841997
}
19851998

19861999
lib_uar_4k = req.lib_caps & MLX5_LIB_CAP_4K_UAR;
@@ -1995,15 +2008,15 @@ static int mlx5_ib_alloc_ucontext(struct ib_ucontext *uctx,
19952008
/* updates req->total_num_bfregs */
19962009
err = calc_total_bfregs(dev, lib_uar_4k, &req, bfregi);
19972010
if (err)
1998-
goto out_devx;
2011+
goto out_ucap;
19992012

20002013
mutex_init(&bfregi->lock);
20012014
bfregi->lib_uar_4k = lib_uar_4k;
20022015
bfregi->count = kcalloc(bfregi->total_num_bfregs, sizeof(*bfregi->count),
20032016
GFP_KERNEL);
20042017
if (!bfregi->count) {
20052018
err = -ENOMEM;
2006-
goto out_devx;
2019+
goto out_ucap;
20072020
}
20082021

20092022
bfregi->sys_pages = kcalloc(bfregi->num_sys_pages,
@@ -2067,6 +2080,11 @@ static int mlx5_ib_alloc_ucontext(struct ib_ucontext *uctx,
20672080
out_count:
20682081
kfree(bfregi->count);
20692082

2083+
out_ucap:
2084+
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX &&
2085+
uctx_rdma_ctrl_is_enabled(uctx->enabled_caps))
2086+
mlx5_cmd_remove_privileged_uid(dev->mdev, context->devx_uid);
2087+
20702088
out_devx:
20712089
if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX)
20722090
mlx5_ib_devx_destroy(dev, context->devx_uid);
@@ -2111,8 +2129,12 @@ static void mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext)
21112129
kfree(bfregi->sys_pages);
21122130
kfree(bfregi->count);
21132131

2114-
if (context->devx_uid)
2132+
if (context->devx_uid) {
2133+
if (uctx_rdma_ctrl_is_enabled(ibcontext->enabled_caps))
2134+
mlx5_cmd_remove_privileged_uid(dev->mdev,
2135+
context->devx_uid);
21152136
mlx5_ib_devx_destroy(dev, context->devx_uid);
2137+
}
21162138
}
21172139

21182140
static phys_addr_t uar_index2pfn(struct mlx5_ib_dev *dev,

0 commit comments

Comments
 (0)