@@ -33,3 +33,5 @@ libmlx5.so.1 ibverbs-providers #MINVER#
mlx5dv_devx_obj_destroy@MLX5_1.7 21
mlx5dv_devx_obj_query@MLX5_1.7 21
mlx5dv_devx_obj_modify@MLX5_1.7 21
+ mlx5dv_devx_umem_dereg@MLX5_1.7 21
+ mlx5dv_devx_umem_reg@MLX5_1.7 21
@@ -51,4 +51,6 @@ MLX5_1.7 {
mlx5dv_devx_obj_destroy;
mlx5dv_devx_obj_query;
mlx5dv_devx_obj_modify;
+ mlx5dv_devx_umem_dereg;
+ mlx5dv_devx_umem_reg;
} MLX5_1.6;
@@ -5,6 +5,7 @@ rdma_man_pages(
mlx5dv_create_flow_matcher.3.md
mlx5dv_create_qp.3.md
mlx5dv_devx_obj_create.3.md
+ mlx5dv_devx_umem_reg.3.md
mlx5dv_flow_action_esp.3.md
mlx5dv_get_clock_info.3
mlx5dv_init_obj.3
@@ -18,4 +19,5 @@ rdma_alias_man_pages(
mlx5dv_devx_obj_create.3 mlx5dv_devx_obj_destroy.3
mlx5dv_devx_obj_create.3 mlx5dv_devx_obj_query.3
mlx5dv_devx_obj_create.3 mlx5dv_devx_obj_modify.3
+ mlx5dv_devx_umem_reg.3 mlx5dv_devx_umem_dereg.3
)
new file mode 100644
@@ -0,0 +1,58 @@
+
+---
+layout: page
+title: mlx5dv_devx_umem_reg, mlx5dv_devx_umem_dereg
+section: 3
+tagline: Verbs
+---
+
+# NAME
+
+mlx5dv_devx_umem_reg - Register a user memory to be used by the devx interface
+
+mlx5dv_devx_umem_dereg - Deregister a devx umem object
+
+# SYNOPSIS
+
+```c
+#include <infiniband/mlx5dv.h>
+
+struct mlx5dv_devx_umem *
+mlx5dv_devx_umem_reg(struct ibv_context *context, void *addr, size_t size,
+ uint32_t access)
+
+int mlx5dv_devx_umem_dereg(struct mlx5dv_devx_umem *dv_devx_umem)
+```
+
+# DESCRIPTION
+
+Register or deregister a user memory to be used by the devx interface.
+
+# ARGUMENTS
+*context*
+: RDMA device context to create the action on.
+
+*addr*
+: The memory start address to register.
+
+*size*
+: The size of *addr* buffer.
+
+*access*
+: The desired memory protection attributes; it is either 0 or the bitwise OR of one or more of *enum ibv_access_flags*.
+
+
+# RETURN VALUE
+
+Upon success *mlx5dv_devx_umem_reg* will return a new *struct
+mlx5dv_devx_umem* object, on error NULL will be returned and errno will be set.
+
+*mlx5dv_devx_umem_dereg* returns 0 on success, or the value of errno on failure (which indicates the failure reason).
+
+# SEE ALSO
+
+*mlx5dv_open_device(3)*, *ibv_reg_mr(3)*
+
+#AUTHOR
+
+Yishai Hadas <yishaih@mellanox.com>
@@ -572,6 +572,12 @@ struct mlx5dv_devx_obj {
uint32_t handle;
};
+struct mlx5_devx_umem {
+ struct mlx5dv_devx_umem dv_devx_umem;
+ struct ibv_context *context;
+ uint32_t handle;
+};
+
static inline int mlx5_ilog2(int n)
{
int t;
@@ -1027,6 +1027,15 @@ int mlx5dv_devx_obj_modify(struct mlx5dv_devx_obj *obj, const void *in, size_t i
int mlx5dv_devx_obj_destroy(struct mlx5dv_devx_obj *obj);
int mlx5dv_devx_general_cmd(struct ibv_context *context, const void *in, size_t inlen,
void *out, size_t outlen);
+
+struct mlx5dv_devx_umem {
+ uint32_t umem_id;
+};
+
+struct mlx5dv_devx_umem *
+mlx5dv_devx_umem_reg(struct ibv_context *ctx, void *addr, size_t size, uint32_t access);
+int mlx5dv_devx_umem_dereg(struct mlx5dv_devx_umem *umem);
+
#ifdef __cplusplus
}
#endif
@@ -3843,6 +3843,63 @@ err:
return NULL;
}
+struct mlx5dv_devx_umem *
+mlx5dv_devx_umem_reg(struct ibv_context *context, void *addr, size_t size, uint32_t access)
+{
+ DECLARE_COMMAND_BUFFER(cmd,
+ MLX5_IB_OBJECT_DEVX_UMEM,
+ MLX5_IB_METHOD_DEVX_UMEM_REG,
+ 5);
+ struct ib_uverbs_attr *handle;
+ struct mlx5_devx_umem *umem;
+ int ret;
+
+ umem = calloc(1, sizeof(*umem));
+ if (!umem) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ fill_attr_in_uint64(cmd, MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR, (intptr_t)addr);
+ fill_attr_in_uint64(cmd, MLX5_IB_ATTR_DEVX_UMEM_REG_LEN, size);
+ fill_attr_in_uint32(cmd, MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, access);
+ fill_attr_out(cmd, MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID,
+ &umem->dv_devx_umem.umem_id,
+ sizeof(umem->dv_devx_umem.umem_id));
+ handle = fill_attr_out_obj(cmd, MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE);
+
+ ret = execute_ioctl(context, cmd);
+ if (ret)
+ goto err;
+
+ umem->handle = read_attr_obj(MLX5_IB_ATTR_DEVX_UMEM_REG_HANDLE, handle);
+ umem->context = context;
+
+ return &umem->dv_devx_umem;
+err:
+ free(umem);
+ return NULL;
+}
+
+int mlx5dv_devx_umem_dereg(struct mlx5dv_devx_umem *dv_devx_umem)
+{
+ DECLARE_COMMAND_BUFFER(cmd,
+ MLX5_IB_OBJECT_DEVX_UMEM,
+ MLX5_IB_METHOD_DEVX_UMEM_DEREG,
+ 1);
+ int ret;
+ struct mlx5_devx_umem *umem = container_of(dv_devx_umem, struct mlx5_devx_umem,
+ dv_devx_umem);
+
+ fill_attr_in_obj(cmd, MLX5_IB_ATTR_DEVX_UMEM_DEREG_HANDLE, umem->handle);
+ ret = execute_ioctl(umem->context, cmd);
+ if (ret)
+ return ret;
+
+ free(umem);
+ return 0;
+}
+
struct mlx5dv_devx_obj *
mlx5dv_devx_obj_create(struct ibv_context *context, const void *in, size_t inlen,
void *out, size_t outlen)
Add DV DEVX APIs to reg/dereg user memory: mlx5dv_devx_umem_reg, mlx5dv_devx_umem_dereg. The returned umem_id should be used later on as part of other device commands that require registered user memory. (e.g. create_qp, etc.). Signed-off-by: Yishai Hadas <yishaih@mellanox.com> --- debian/ibverbs-providers.symbols | 2 + providers/mlx5/libmlx5.map | 2 + providers/mlx5/man/CMakeLists.txt | 2 + providers/mlx5/man/mlx5dv_devx_umem_reg.3.md | 58 ++++++++++++++++++++++++++++ providers/mlx5/mlx5.h | 6 +++ providers/mlx5/mlx5dv.h | 9 +++++ providers/mlx5/verbs.c | 57 +++++++++++++++++++++++++++ 7 files changed, 136 insertions(+) create mode 100644 providers/mlx5/man/mlx5dv_devx_umem_reg.3.md