Provided by: libibverbs-dev_42.0-1_amd64 bug

NAME

       mlx5dv_wr_mkey_configure - Create a work request to configure an MKEY

       mlx5dv_wr_set_mkey_access_flags - Set the memory protection attributes for an MKEY

       mlx5dv_wr_set_mkey_layout_list - Set a memory layout for an MKEY based on SGE list

       mlx5dv_wr_set_mkey_layout_interleaved - Set an interleaved memory layout for an MKEY

SYNOPSIS

              #include <infiniband/mlx5dv.h>

              static inline void mlx5dv_wr_mkey_configure(struct mlx5dv_qp_ex *mqp,
                                                          struct mlx5dv_mkey *mkey,
                                                          uint8_t num_setters,
                                                          struct mlx5dv_mkey_conf_attr *attr);

              static inline void mlx5dv_wr_set_mkey_access_flags(struct mlx5dv_qp_ex *mqp,
                                                                 uint32_t access_flags);

              static inline void mlx5dv_wr_set_mkey_layout_list(struct mlx5dv_qp_ex *mqp,
                                                                uint16_t num_sges,
                                                                const struct ibv_sge *sge);

              static inline void mlx5dv_wr_set_mkey_layout_interleaved(struct mlx5dv_qp_ex *mqp,
                                                                       uint32_t repeat_count,
                                                                       uint16_t num_interleaved,
                                                                       const struct mlx5dv_mr_interleaved *data);

DESCRIPTION

       The  MLX5DV  MKEY  configure  API  and  the  related  setters (mlx5dv_wr_set_mkey*) are an
       extension of IBV work request API (ibv_wr*) with specific features for MLX5DV MKEY.

       MKEYs allow creation of virtually-contiguous address spaces out of  non-contiguous  chunks
       of  memory  regions already registered with the hardware.  Additionally it provides access
       to some advanced hardware offload features, e.g.  signature offload.

       These APIs are intended to be used to  access  additional  functionality  beyond  what  is
       provided  by mlx5dv_wr_mr_list() and mlx5dv_wr_mr_interleaved().  The MKEY features can be
       optionally enabled using the mkey configure setters.  It allows using  different  features
       in the same MKEY.

USAGE

       To  use these APIs a QP must be created using mlx5dv_create_qp(3) which allows setting the
       MLX5DV_QP_EX_WITH_MKEY_CONFIGURE in send_ops_flags.

       The MKEY configuration work request is created by calling mlx5dv_wr_mkey_configure(), a WR
       builder  function,  followed  by  required  setter  functions.  num_setters is a number of
       required setters for the WR.  All setters are optional.  num_setters can be zero to  apply
       attr only.  Each setter can be called only once per the WR builder.

       The  WR  configures  mkey  and  applies attr of the builder function and setter functions’
       arguments for it.  If mkey is already configured the WR  overrides  some  mkey  properties
       depends  on builder and setter functions’ arguments (see details in setters’ description).
       To clear configuration of  mkey,  use  ibv_post_send()  with  IBV_WR_LOCAL_INV  opcode  or
       ibv_wr_local_inv().

       Current  implementation requires the IBV_SEND_INLINE option to be set in wr_flags field of
       ibv_qp_ex structure prior to builder function call.  Non-inline payload is  currently  not
       supported  by  this  API.   Please  note that inlining here is done for MKEY configuration
       data, not for user data referenced by data layouts.

       Once MKEY is configured, it may be used in  subsequent  work  requests  (SEND,  RDMA_READ,
       RDMA_WRITE,  etc).   If these work requests are posted on the same QP, there is no need to
       wait for completion of MKEY configuration work request.  They can  be  posted  immediately
       after  the  last  setter  (or  builder  if  no setters).  Usually there is no need to even
       request a completion for MKEY configuration work request.

       If completion is requested for MKEY configuration work request it will be  delivered  with
       the IBV_WC_DRIVER1 opcode.

   Builder function
       mlx5dv_wr_mkey_configure()
              Post  a  work  request  to  configure an existing MKEY.  With this call alone it is
              possible to configure the MKEY and keep or reset signature attributes.   This  call
              may be followed by zero or more optional setters.

              mqp    The QP to post the work request on.

              mkey   The MKEY to configure.

              num_setters
                     The number of setters that must be called after this function.

              attr   The MKEY configuration attributes

   MKEY configuration attributes
       MKEY configuration attributes are provided in mlx5dv_mkey_conf_attr structure.

              struct mlx5dv_mkey_conf_attr {
                      uint32_t conf_flags;
                      uint64_t comp_mask;
              };

       conf_flags
              Bitwise OR of the following flags:

              MLX5DV_MKEY_CONF_FLAG_RESET_SIG_ATTR
                     Reset  the  signature  attributes  of  the  MKEY.   If  not  set, previously
                     configured signature attributes will be kept.

       comp_mask
              Reserved for future extension, must be 0 now.

   Generic setters
       mlx5dv_wr_set_mkey_access_flags()
              Set the memory protection attributes for the MKEY.  If the MKEY is configured,  the
              setter  overrides  the previous value.  For example, two MKEY configuration WRs are
              posted.   The  first  one  sets  IBV_ACCESS_REMOTE_READ.   The  second   one   sets
              IBV_ACCESS_REMOTE_WRITE.   In  this  case,  the  second  WR  overrides  the  memory
              protection attributes, and only IBV_ACCESS_REMOTE_WRITE is  allowed  for  the  MKEY
              when the WR is completed.

              mqp    The   QP   where   an   MKEY  configuration  work  request  was  created  by
                     mlx5dv_wr_mkey_configure().

              access_flags
                     The desired memory protection attributes; it is either 0 or the  bitwise  OR
                     of one or more of flags in enum ibv_access_flags.

   Data layout setters
       Data  layout  setters define how data referenced by the MKEY will be scattered/gathered in
       the memory.  In order to use MKEY with RDMA  operations  it  must  be  configured  with  a
       layout.

       Not  more  than one data layout setter may follow builder function.  Layout can be updated
       in the next calls to builder function.

       When MKEY is used in RDMA operations, it should be used in  a  zero-based  mode,  i.e. the
       addr field in ibv_sge structure is an offset in the total data.

       mlx5dv_wr_set_mkey_layout_list()
              Set  a  memory layout for an MKEY based on SGE list.  If the MKEY is configured and
              the data layout was defined by some data layout setter (not  necessary  this  one),
              the setter overrides the previous value.

              Default  WQE  size  can  fit  only  4  SGE entries.  To allow more the QP should be
              created with a larger WQE size that may fit it.  This  should  be  done  using  the
              max_inline_data attribute of struct ibv_qp_cap upon QP creation.

              mqp    The   QP   where   an   MKEY  configuration  work  request  was  created  by
                     mlx5dv_wr_mkey_configure().

              num_sges
                     Number of SGEs in the list.

              sge    Pointer to the list of ibv_sge structures.

       mlx5dv_wr_set_mkey_layout_interleaved()
              Set an interleaved memory layout for an MKEY.  If the MKEY is  configured  and  the
              data  layout  was  defined by some data layout setter (not necessary this one), the
              setter overrides the previous value.

              Default WQE size can fit only 3 interleaved entries.  To allow more the  QP  should
              be  created  with a larger WQE size that may fit it.  This should be done using the
              max_inline_data attribute of struct ibv_qp_cap upon QP creation.

              As one entry will be consumed for strided header, the MKEY should be  created  with
              one more entry than the required num_interleaved.

              mqp    The   QP   where   an   MKEY  configuration  work  request  was  created  by
                     mlx5dv_wr_mkey_configure().

              repeat_count
                     The data layout representation is repeated repeat_count times.

              num_interleaved
                     Number of entries in the data representation.

              data   Pointer to the list of interleaved data layout descriptions.

              Interleaved data layout is described by mlx5dv_mr_interleaved structure.

                     struct mlx5dv_mr_interleaved {
                         uint64_t addr;
                         uint32_t bytes_count;
                         uint32_t bytes_skip;
                         uint32_t lkey;
                     };

              addr   Start address of the local memory buffer.

              bytes_count
                     Number of data bytes to put into the buffer.

              bytes_skip
                     Number of bytes to skip in the buffer before the next data block.

              lkey   Key of the local Memory Region

   Signature setters
       The signature attributes of the MKEY allow adding/modifying/stripping/validating integrity
       fields  when transmitting data from memory to network and when receiving data from network
       to memory.

       Use the signature setters to set/update the signature attributes of the  MKEY.   To  reset
       the     signature     attributes     without    invalidating    the    MKEY,    use    the
       MLX5DV_MKEY_CONF_FLAG_RESET_SIG_ATTR flag.

       mlx5dv_wr_set_mkey_sig_block()
              Set MKEY block signature attributes.  If the MKEY is already  configured  with  the
              signature  attributes,  the setter overrides the previous value.  See dedicated man
              page for mlx5dv_wr_set_mkey_sig_block(3).

   Crypto setter
       The crypto attributes of the MKey allow encryption and decryption of transmitted data from
       memory to network and when receiving data from network to memory.

       Use  the  crypto setter to set/update the crypto attributes of the MKey.  When the MKey is
       created  with  MLX5DV_MKEY_INIT_ATTR_FLAGS_CRYPTO  it  must  be  configured  with   crypto
       attributes before the MKey can be used.

       mlx5dv_wr_set_mkey_crypto()
              Set  MKey  crypto  attributes.   If  the  MKey  is  already  configured with crypto
              attributes, the setter overrides the previous value.  see dedicated  man  page  for
              mlx5dv_wr_set_mkey_crypto(3).

EXAMPLES

   Create QP and MKEY
       Code below creates a QP with MKEY configure operation support and an indirect mkey.

              /* Create QP with MKEY configure support */
              struct ibv_qp_init_attr_ex attr_ex = {};
              attr_ex.comp_mask |= IBV_QP_INIT_ATTR_SEND_OPS_FLAGS;
              attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE;

              struct mlx5dv_qp_init_attr attr_dv = {};
              attr_dv.comp_mask |= MLX5DV_QP_INIT_ATTR_MASK_SEND_OPS_FLAGS;
              attr_dv.send_ops_flags = MLX5DV_QP_EX_WITH_MKEY_CONFIGURE;

              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);

              mkey_attr.create_flags = MLX5DV_MKEY_INIT_ATTR_FLAGS_INDIRECT;
              struct mlx5dv_mkey *mkey = mlx5dv_create_mkey(&mkey_attr);

   List data layout configuration
       Code  below  configures an MKEY which allows remote access for read and write and is based
       on SGE list layout with two entries.  When this MKEY is used in RDMA write operation, data
       will  be  scattered  between  two  memory  regions.   The first 64 bytes will go to memory
       referenced by mr1.  The next 4096 bytes will go to memory referenced by mr2.

              ibv_wr_start(qpx);
              qpx->wr_id = my_wr_id_1;
              qpx->wr_flags = IBV_SEND_INLINE;

              struct mlx5dv_mkey_conf_attr mkey_attr = {};
              mlx5dv_wr_mkey_configure(mqpx, mkey, 2, &mkey_attr);
              mlx5dv_wr_set_mkey_access_flags(mqpx, IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
              struct ibv_sge sgl[2];
              sgl[0].addr = mr1->addr;
              sgl[0].length = 64;
              sgl[0].lkey = mr1->lkey;
              sgl[1].addr = mr2->addr;
              sgl[1].length = 4096;
              sgl[1].lkey = mr2->lkey;
              mlx5dv_wr_set_mkey_layout_list(mqpx, 2, sgl);
              ret = ibv_wr_complete(qpx);

   Interleaved data layout configuration
       Code below configures an MKEY which allows remote access for read and write and  is  based
       on  interleaved  data  layout with two entries and repeat count of two.  When this MKEY is
       used in RDMA write operation, data will be scattered  between  two  memory  regions.   The
       first 512 bytes will go to memory referenced by mr1 at offset 0.  The next 8 bytes will go
       to memory referenced by mr2 at offset 0.  The next 512 bytes will go to memory  referenced
       by mr1 at offset 516.  The next 8 bytes will go to memory referenced by mr2 at offset 8.

              ibv_wr_start(qpx);
              qpx->wr_id = my_wr_id_1;
              qpx->wr_flags = IBV_SEND_INLINE;

              struct mlx5dv_mkey_conf_attr mkey_attr = {};
              mlx5dv_wr_mkey_configure(mqpx, mkey, 2, &mkey_attr);
              mlx5dv_wr_set_mkey_access_flags(mqpx, IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);
              struct mlx5dv_mr_interleaved data[2];
              data[0].addr = mr1->addr;
              data[0].bytes_count = 512;
              data[0].bytes_skip = 4;
              data[0].lkey = mr1->lkey;
              data[1].addr = mr2->addr;
              data[1].bytes_count = 8;
              data[1].bytes_skip = 0;
              data[1].lkey = mr2->lkey;
              mlx5dv_wr_set_mkey_layout_interleaved(mqpx, 2, 2, &data);
              ret = ibv_wr_complete(qpx);

NOTES

       A DEVX context should be opened by using mlx5dv_open_device(3).

SEE ALSO

       mlx5dv_create_mkey(3),        mlx5dv_create_qp(3),        mlx5dv_wr_set_mkey_sig_block(3),
       mlx5dv_wr_set_mkey_crypto(3)

AUTHORS

       Oren Duer <oren@nvidia.com>

       Sergey Gorenko <sergeygo@nvidia.com>

       Evgenii Kochetov <evgeniik@nvidia.com>

                                                                      mlx5dv_wr_mkey_configure(3)