mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
RDMA/mlx5: Use UMEM attribute for SRQ doorbell record
Add an optional mlx5 driver-namespace UMEM attribute on SRQ create so userspace can supply the doorbell record umem explicitly, symmetric to the CQ and QP sides. Resolve it inside mlx5_ib_db_map_user() and use it as a private DBR page when present; otherwise take the existing UHW share-or-pin path that preserves per-page DBR sharing across CQ/QP/SRQ in the same process. Add mlx5's first UVERBS_OBJECT_SRQ UAPI definition chain to attach the new attr. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Link: https://patch.msgid.link/20260701124015.64350-4-jiri@resnulli.us Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
023349192e
commit
aac287f4f1
|
|
@ -4476,6 +4476,7 @@ static const struct uapi_definition mlx5_ib_defs[] = {
|
|||
UAPI_DEF_CHAIN(mlx5_ib_dm_defs),
|
||||
UAPI_DEF_CHAIN(mlx5_ib_create_cq_defs),
|
||||
UAPI_DEF_CHAIN(mlx5_ib_create_qp_defs),
|
||||
UAPI_DEF_CHAIN(mlx5_ib_create_srq_defs),
|
||||
|
||||
UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DEVICE, &mlx5_ib_query_context),
|
||||
UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_MR, &mlx5_ib_reg_dmabuf_mr),
|
||||
|
|
|
|||
|
|
@ -1517,6 +1517,7 @@ extern const struct uapi_definition mlx5_ib_qos_defs[];
|
|||
extern const struct uapi_definition mlx5_ib_std_types_defs[];
|
||||
extern const struct uapi_definition mlx5_ib_create_cq_defs[];
|
||||
extern const struct uapi_definition mlx5_ib_create_qp_defs[];
|
||||
extern const struct uapi_definition mlx5_ib_create_srq_defs[];
|
||||
|
||||
static inline int is_qp1(enum ib_qp_type qp_type)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -10,6 +10,9 @@
|
|||
#include "mlx5_ib.h"
|
||||
#include "srq.h"
|
||||
|
||||
#define UVERBS_MODULE_NAME mlx5_ib
|
||||
#include <rdma/uverbs_named_ioctl.h>
|
||||
|
||||
static void *get_wqe(struct mlx5_ib_srq *srq, int n)
|
||||
{
|
||||
return mlx5_frag_buf_get_wqe(&srq->fbc, n);
|
||||
|
|
@ -78,7 +81,9 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
|||
}
|
||||
in->umem = srq->umem;
|
||||
|
||||
err = mlx5_ib_db_map_user(ucontext, NULL, 0, ucmd.db_addr, &srq->db);
|
||||
err = mlx5_ib_db_map_user(ucontext, attrs,
|
||||
MLX5_IB_ATTR_CREATE_SRQ_DBR_BUF_UMEM,
|
||||
ucmd.db_addr, &srq->db);
|
||||
if (err) {
|
||||
mlx5_ib_dbg(dev, "map doorbell failed\n");
|
||||
goto err_umem;
|
||||
|
|
@ -466,3 +471,15 @@ int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
|
|||
|
||||
return err;
|
||||
}
|
||||
|
||||
ADD_UVERBS_ATTRIBUTES_SIMPLE(
|
||||
mlx5_ib_srq_create,
|
||||
UVERBS_OBJECT_SRQ,
|
||||
UVERBS_METHOD_SRQ_CREATE,
|
||||
UVERBS_ATTR_UMEM(MLX5_IB_ATTR_CREATE_SRQ_DBR_BUF_UMEM,
|
||||
UA_OPTIONAL));
|
||||
|
||||
const struct uapi_definition mlx5_ib_create_srq_defs[] = {
|
||||
UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_SRQ, &mlx5_ib_srq_create),
|
||||
{},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -281,6 +281,10 @@ enum mlx5_ib_create_qp_attrs {
|
|||
MLX5_IB_ATTR_CREATE_QP_DBR_BUF_UMEM = UVERBS_ID_DRIVER_NS_WITH_UHW,
|
||||
};
|
||||
|
||||
enum mlx5_ib_create_srq_attrs {
|
||||
MLX5_IB_ATTR_CREATE_SRQ_DBR_BUF_UMEM = UVERBS_ID_DRIVER_NS_WITH_UHW,
|
||||
};
|
||||
|
||||
enum mlx5_ib_reg_dmabuf_mr_attrs {
|
||||
MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS = (1U << UVERBS_ID_NS_SHIFT),
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user