dwww Home | Manual pages | Find package

mlx5dv_wr_mkey_configure(3)                        mlx5dv_wr_mkey_configure(3)

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 lay-
       out 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 hard-
       ware.  Additionally it provides access to some advanced  hardware  off-
       load 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_inter-
       leaved().   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  func-
       tions’  arguments (see details in setters’ description).  To clear con-
       figuration 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 config-
       uration 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  re-
              set  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 ex-
              ample,  two  MKEY  configuration  WRs are posted.  The first one
              sets IBV_ACCESS_REMOTE_READ.  The second one sets IBV_ACCESS_RE-
              MOTE_WRITE.   In  this  case, the second WR overrides the memory
              protection attributes, and only IBV_ACCESS_REMOTE_WRITE  is  al-
              lowed for the MKEY when the WR is completed.

              mqp    The  QP where an MKEY configuration work request was cre-
                     ated 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_ac-
                     cess_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 oper-
       ations it must be configured with a layout.

       Not more than one data layout setter may follow builder function.  Lay-
       out 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  to-
       tal 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  lay-
              out  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 cre-
                     ated 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 previ-
              ous 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_in-
              terleaved.

              mqp    The QP where an MKEY configuration work request was  cre-
                     ated 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  descrip-
                     tions.

              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 da-
                     ta block.

              lkey   Key of the local Memory Region

   Signature setters
       The  signature  attributes  of  the  MKEY allow adding/modifying/strip-
       ping/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  re-
       peat count of two.  When this MKEY is used in RDMA write operation, da-
       ta 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)

Generated by dwww version 1.15 on Wed Jun 26 18:10:30 CEST 2024.