NAME |SYNOPSIS |DESCRIPTION |USAGE |EXAMPLE |SEE ALSO |AUTHOR |COLOPHON | |
MLX5DV_WR(3) mlx5 Programmer’s ManualMLX5DV_WR(3)mlx5dv_wr_set_dc_addr - Attach a DC info to the last work request mlx5dv_wr_raw_wqe - Build a raw work request mlx5dv_wr_memcpy - Build a DMA memcpy work request
#include <infiniband/mlx5dv.h> static inline void mlx5dv_wr_set_dc_addr(struct mlx5dv_qp_ex *mqp, struct ibv_ah *ah, uint32_t remote_dctn, uint64_t remote_dc_key); static inline void mlx5dv_wr_set_dc_addr_stream(struct mlx5dv_qp_ex *mqp, struct ibv_ah *ah, uint32_t remote_dctn, uint64_t remote_dc_key, uint16_t stream_id); struct mlx5dv_mr_interleaved { uint64_t addr; uint32_t bytes_count; uint32_t bytes_skip; uint32_t lkey; }; static inline void mlx5dv_wr_mr_interleaved(struct mlx5dv_qp_ex *mqp, struct mlx5dv_mkey *mkey, uint32_t access_flags, /* use enum ibv_access_flags */ uint32_t repeat_count, uint16_t num_interleaved, struct mlx5dv_mr_interleaved *data); static inline void mlx5dv_wr_mr_list(struct mlx5dv_qp_ex *mqp, struct mlx5dv_mkey *mkey, uint32_t access_flags, /* use enum ibv_access_flags */ uint16_t num_sges, struct ibv_sge *sge); static inline int mlx5dv_wr_raw_wqe(struct mlx5dv_qp_ex *mqp, const void *wqe); static inline void mlx5dv_wr_memcpy(struct mlx5dv_qp_ex *mqp_ex, uint32_t dest_lkey, uint64_t dest_addr, uint32_t src_lkey, uint64_t src_addr, size_t length)The MLX5DV work request APIs (mlx5dv_wr_*) is an extension for IBV work request API (ibv_wr_*) with mlx5 specific features for send work request. This may be used together with or without ibv_wr_* calls.
To use these APIs a QP must be created using mlx5dv_create_qp() withsend_ops_flags of struct ibv_qp_init_attr_ex set. If the QP does not support all the requested work request types then QP creation will fail. The mlx5dv_qp_ex is extracted from the IBV_QP by ibv_qp_to_qp_ex() and mlx5dv_qp_ex_from_ibv_qp_ex(). This should be used to apply the mlx5 specific features on the posted WR. A work request creation requires to use the ibv_qp_ex as described in the man for ibv_wr_post and mlx5dv_qp with its available builders and setters.QP Specific buildersRC QPsmlx5dv_wr_mr_interleaved() registers an interleaved memory layout by using an indirect mkey and some interleaved data. The layout of the memory pointed by the mkey after its registration will be thedata representation for thenum_interleaved entries. This single layout representation is repeated byrepeat_count. Thedata as described by struct mlx5dv_mr_interleaved will hold real data defined bybytes_count and then a padding ofbytes_skip. Post a successful registration, RDMA operations can use thismkey. The hardware will scatter the data according to the pattern. Themkey should be used in a zero-based mode. Theaddr field in itsibv_sge is an offset in the total data. To create thismkey mlx5dv_create_mkey() should be used. Current implementation requires the IBV_SEND_INLINE option to be on inibv_qp_ex->wr_flags field. To be able to have more than 3num_interleaved entries, the QP should be created with a larger WQE size that may fit it. This should be done using themax_inline_data attribute ofstruct ibv_qp_cap upon its creation. As one entry will be consumed for strided header, themkey should be created with one more entry than the requirednum_interleaved. In caseibv_qp_ex->wr_flags turns on IBV_SEND_SIGNALED, the reported WC opcode will be MLX5DV_WC_UMR. Unregister themkey to enable another pattern registration should be done via ibv_post_send with IBV_WR_LOCAL_INV opcode.mlx5dv_wr_mr_list() registers a memory layout based on list of ibv_sge. The layout of the memory pointed by themkey after its registration will be based on the list ofsge counted bynum_sges. Post a successful registration RDMA operations can use thismkey, the hardware will scatter the data according to the pattern. Themkey should be used in a zero-based mode, theaddr field in itsibv_sge is an offset in the total data. Current implementation requires the IBV_SEND_INLINE option to be on inibv_qp_ex->wr_flags field. To be able to have more than 4num_sge entries, the QP should be created with a larger WQE size that may fit it. This should be done using themax_inline_data attribute ofstruct ibv_qp_cap upon its creation. In caseibv_qp_ex->wr_flags turns on IBV_SEND_SIGNALED, the reported WC opcode will be MLX5DV_WC_UMR. Unregister themkey to enable other pattern registration should be done via ibv_post_send with IBV_WR_LOCAL_INV opcode.RC orDCI QPsmlx5dv_wr_memcpy() Builds a DMA memcpy work request to copy data of lengthlength fromsrc_addr todest_addr. The copy operation will be done using the DMA MMO functionality of the device to copy data on PCI bus. The MLX5DV_QP_EX_WITH_MEMCPY flag inmlx5dv_qp_init_attr.send_ops_flags needs to be set during QP creation. If the device or QP doesn’t support it then QP creation will fail. The maximum memcpy length that is supported by the device is reported inmlx5dv_context->max_wr_memcpy_length. A zero value inmlx5dv_context->max_wr_memcpy_length means the device doesn’t support memcpy operations. IBV_SEND_FENCE indicator should be used on a following send request which is dependent ondest_addr of the memcpy operation. In caseibv_qp_ex->wr_flags turns on IBV_SEND_SIGNALED, the reported WC opcode will be MLX5DV_WC_MEMCPY.Raw WQE buildersmlx5dv_wr_raw_wqe() It is used to build a custom work request (WQE) and post it on a normal QP. The caller needs to set all details of the WQE (except the “ctrl.wqe_index” and “ctrl.signature” fields, which is the driver’s responsibility to set). The MLX5DV_QP_EX_WITH_RAW_WQE flag in mlx5_qp_attr.send_ops_flags needs to be set. The wr_flags are ignored as it’s the caller’s responsibility to set flags in WQE. No matter what the send opcode is, the work completion opcode for a raw WQE is IBV_WC_DRIVER2.QP Specific settersDCI QPsmlx5dv_wr_set_dc_addr() must be called to set the DCI WR properties. The destination address of the work is specified byah, the remote DCT number is specified byremote_dctn and the DC key is specified byremote_dc_key. This setter is available when the QP transport is DCI and send_ops_flags in struct ibv_qp_init_attr_ex is set. The available builders and setters for DCI QP are the same as RC QP. DCI QP created with MLX5DV_QP_INIT_ATTR_MASK_DCI_STREAMS can callmlx5dv_wr_set_dc_addr_stream() to define thestream_id of the operation to allow HW to choose one of the multiple concurrent DCI resources. Calls tomlx5dv_wr_set_dc_addr() are equivalent to usingstream_id=0
/* create DC QP type and specify the required send opcodes */ attr_ex.qp_type = IBV_QPT_DRIVER; attr_ex.comp_mask |= IBV_QP_INIT_ATTR_SEND_OPS_FLAGS; attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE; attr_dv.comp_mask |= MLX5DV_QP_INIT_ATTR_MASK_DC; attr_dv.dc_init_attr.dc_type = MLX5DV_DCTYPE_DCI; ibv_qp *qp = mlx5dv_create_qp(ctx, attr_ex, attr_dv); ibv_qp_ex *qpx = ibv_qp_to_qp_ex(qp); mlx5dv_qp_ex *mqpx = mlx5dv_qp_ex_from_ibv_qp_ex(qpx); ibv_wr_start(qpx); /* Use ibv_qp_ex object to set WR generic attributes */ qpx->wr_id = my_wr_id_1; qpx->wr_flags = IBV_SEND_SIGNALED; ibv_wr_rdma_write(qpx, rkey, remote_addr_1); ibv_wr_set_sge(qpx, lkey, local_addr_1, length_1); /* Use mlx5 DC setter using mlx5dv_qp_ex object */ mlx5dv_wr_set_wr_dc_addr(mqpx, ah, remote_dctn, remote_dc_key); ret = ibv_wr_complete(qpx);
ibv_post_send(3),ibv_create_qp_ex(3),ibv_wr_post(3),mlx5dv_create_mkey(3).
Guy Levi ⟨guyle@mellanox.com⟩ Mark Zhang ⟨markzhang@nvidia.com⟩
This page is part of therdma-core (RDMA Core Userspace Libraries and Daemons) project. Information about the project can be found at ⟨https://github.com/linux-rdma/rdma-core⟩. If you have a bug report for this manual page, send it to linux-rdma@vger.kernel.org. This page was obtained from the project's upstream Git repository ⟨https://github.com/linux-rdma/rdma-core.git⟩ on 2025-08-11. (At that time, the date of the most recent commit that was found in the repository was 2025-08-04.) If you discover any rendering problems in this HTML version of the page, or you believe there is a better or more up-to-date source for the page, or you have corrections or improvements to the information in this COLOPHON (which isnot part of the original manual page), send a mail to man-pages@man7.orgmlx5 2019-02-24MLX5DV_WR(3)HTML rendering created 2025-09-06 byMichael Kerrisk, author ofThe Linux Programming Interface. For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere. Hosting byjambit GmbH. | ![]() |