.\" Automatically generated by Pandoc 2.2.1 .\" .TH "MLX5DV_WR" "3" "2019\-02\-24" "mlx5" "mlx5 Programmer's Manual" .hy .SH NAME .PP mlx5dv_wr_set_dc_addr \- Attach a DC info to the last work request .SH SYNOPSIS .IP .nf \f[C] #include\ 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); 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); \f[] .fi .SH DESCRIPTION .PP 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. .SH USAGE .PP To use these APIs a QP must be created using mlx5dv_create_qp() with \f[I]send_ops_flags\f[] of struct ibv_qp_init_attr_ex set. .PP If the QP does not support all the requested work request types then QP creation will fail. .PP 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. .PP 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. .SS QP Specific builders .TP .B \f[I]RC\f[] QPs \f[I]mlx5dv_wr_mr_interleaved()\f[] .RS .PP 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 the \f[I]data\f[] representation for the \f[I]num_interleaved\f[] entries. This single layout representation is repeated by \f[I]repeat_count\f[]. .PP The \f[I]data\f[] as described by struct mlx5dv_mr_interleaved will hold real data defined by \f[I]bytes_count\f[] and then a padding of \f[I]bytes_skip\f[]. Post a successful registration, RDMA operations can use this \f[I]mkey\f[]. The hardware will scatter the data according to the pattern. The \f[I]mkey\f[] should be used in a zero\-based mode. The \f[I]addr\f[] field in its \f[I]ibv_sge\f[] is an offset in the total data. .PP Current implementation requires the IBV_SEND_INLINE option to be on in \f[I]ibv_qp_ex\->wr_flags\f[] field. To be able to have more than 3 \f[I]num_interleaved\f[] entries, the QP should be created with a larger WQE size that may fit it. This should be done using the \f[I]max_inline_data\f[] attribute of \f[I]struct ibv_qp_cap\f[] upon its creation. .PP As one entry will be consumed for strided header, the \f[I]mkey\f[] should be created with one more entry than the required \f[I]num_interleaved\f[]. .PP In case \f[I]ibv_qp_ex\->wr_flags\f[] turns on IBV_SEND_SIGNALED, the reported WC opcode will be MLX5DV_WC_UMR. Unregister the \f[I]mkey\f[] to enable another pattern registration should be done via ibv_post_send with IBV_WR_LOCAL_INV opcode. .RE \f[I]mlx5dv_wr_mr_list()\f[] .RS .PP registers a memory layout based on list of ibv_sge. The layout of the memory pointed by the \f[I]mkey\f[] after its registration will be based on the list of \f[I]sge\f[] counted by \f[I]num_sges\f[]. Post a successful registration RDMA operations can use this \f[I]mkey\f[], the hardware will scatter the data according to the pattern. The \f[I]mkey\f[] should be used in a zero\-based mode, the \f[I]addr\f[] field in its \f[I]ibv_sge\f[] is an offset in the total data. .PP Current implementation requires the IBV_SEND_INLINE option to be on in \f[I]ibv_qp_ex\->wr_flags\f[] field. To be able to have more than 4 \f[I]num_sge\f[] entries, the QP should be created with a larger WQE size that may fit it. This should be done using the \f[I]max_inline_data\f[] attribute of \f[I]struct ibv_qp_cap\f[] upon its creation. .PP In case \f[I]ibv_qp_ex\->wr_flags\f[] turns on IBV_SEND_SIGNALED, the reported WC opcode will be MLX5DV_WC_UMR. Unregister the \f[I]mkey\f[] to enable other pattern registration should be done via ibv_post_send with IBV_WR_LOCAL_INV opcode. .RE .SS QP Specific setters .TP .B \f[I]DCI\f[] QPs \f[I]mlx5dv_wr_set_dc_addr()\f[] must be called to set the DCI WR properties. The destination address of the work is specified by \f[I]ah\f[], the remote DCT number is specified by \f[I]remote_dctn\f[] and the DC key is specified by \f[I]remote_dc_key\f[]. 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. .RS .RE .SH EXAMPLE .IP .nf \f[C] /*\ 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); \f[] .fi .SH SEE ALSO .PP \f[B]ibv_post_send\f[](3), \f[B]ibv_create_qp_ex(3)\f[], \f[B]ibv_wr_post(3)\f[]. .SH AUTHOR .PP Guy Levi