Provided by: libfabric-dev_1.17.0-3ubuntu1_amd64 bug

NAME

       fi_rma - Remote memory access operations

       fi_read / fi_readv / fi_readmsg
              Initiates a read from remote memory

       fi_write  /  fi_writev  / fi_writemsg fi_inject_write / fi_writedata : Initiate a write to
       remote memory

SYNOPSIS

              #include <rdma/fi_rma.h>

              ssize_t fi_read(struct fid_ep *ep, void *buf, size_t len, void *desc,
                  fi_addr_t src_addr, uint64_t addr, uint64_t key, void *context);

              ssize_t fi_readv(struct fid_ep *ep, const struct iovec *iov, void **desc,
                  size_t count, fi_addr_t src_addr, uint64_t addr, uint64_t key,
                  void *context);

              ssize_t fi_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
                  uint64_t flags);

              ssize_t fi_write(struct fid_ep *ep, const void *buf, size_t len,
                  void *desc, fi_addr_t dest_addr, uint64_t addr, uint64_t key,
                  void *context);

              ssize_t fi_writev(struct fid_ep *ep, const struct iovec *iov, void **desc,
                  size_t count, fi_addr_t dest_addr, uint64_t addr, uint64_t key,
                  void *context);

              ssize_t fi_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
                  uint64_t flags);

              ssize_t fi_inject_write(struct fid_ep *ep, const void *buf, size_t len,
                  fi_addr_t dest_addr, uint64_t addr, uint64_t key);

              ssize_t fi_writedata(struct fid_ep *ep, const void *buf, size_t len,
                  void *desc, uint64_t data, fi_addr_t dest_addr, uint64_t addr,
                  uint64_t key, void *context);

              ssize_t fi_inject_writedata(struct fid_ep *ep, const void *buf, size_t len,
                  uint64_t data, fi_addr_t dest_addr, uint64_t addr, uint64_t key);

ARGUMENTS

       ep     Fabric endpoint on which to initiate read or write operation.

       buf    Local data buffer to read into (read target) or write from (write source)

       len    Length of data to read or write, specified in bytes.  Valid transfers  are  from  0
              bytes up to the endpoint’s max_msg_size.

       iov    Vectored data buffer.

       count  Count of vectored data entries.

       addr   Address of remote memory to access.  This will be the virtual address of the remote
              region in the case of FI_MR_BASIC, or the offset from the starting address  in  the
              case of FI_MR_SCALABLE.

       key    Protection key associated with the remote memory.

       desc   Descriptor associated with the local data buffer See fi_mr(3).

       data   Remote CQ data to transfer with the operation.

       dest_addr
              Destination  address  for  connectionless  write  transfers.  Ignored for connected
              endpoints.

       src_addr
              Source address to read from for connectionless transfers.   Ignored  for  connected
              endpoints.

       msg    Message descriptor for read and write operations.

       flags  Additional flags to apply for the read or write operation.

       context
              User  specified pointer to associate with the operation.  This parameter is ignored
              if the operation will not generate a  successful  completion,  unless  an  op  flag
              specifies the context parameter be used for required input.

DESCRIPTION

       RMA  (remote  memory access) operations are used to transfer data directly between a local
       data buffer and a remote data buffer.  RMA transfers occur on a  byte  level  granularity,
       and no message boundaries are maintained.

       The  write functions – fi_write, fi_writev, fi_writemsg, fi_inject_write, and fi_writedata
       – are used to transmit data into a remote memory  buffer.   The  main  difference  between
       write  functions  are  the  number  and  type  of  parameters  that  they accept as input.
       Otherwise, they perform the same general function.

       The read functions – fi_read, fi_readv, and fi_readmsg – are used to transfer data from  a
       remote  memory  region  into  local data buffer(s).  Similar to the write operations, read
       operations operate asynchronously.  Users should not touch the posted data buffer(s) until
       the read operation has completed.

       Completed  RMA  operations  are reported to the user through one or more completion queues
       associated with the endpoint.  Users  provide  context  which  are  associated  with  each
       operation,  and  is  returned  to  the  user  as  part  of  the completion.  See fi_cq for
       completion event details.

       By default, the remote endpoint does not generate an event  or  notify  the  user  when  a
       memory  region  has  been  accessed by an RMA read or write operation.  However, immediate
       data may be associated with an RMA write operation.  RMA writes with immediate  data  will
       generate  a  completion  entry  at  the remote endpoint, so that the immediate data may be
       delivered.

   fi_write
       The call fi_write transfers the data contained in the  user-specified  data  buffer  to  a
       remote memory region.

   fi_writev
       The  fi_writev  call  adds  support  for a scatter-gather list to fi_write.  The fi_writev
       transfers the set of data buffers referenced by the iov parameter  to  the  remote  memory
       region.

   fi_writemsg
       The  fi_writemsg  call  supports  data  transfers  over  both connected and connectionless
       endpoints, with the ability to control the write operation per call  through  the  use  of
       flags.  The fi_writemsg function takes a struct fi_msg_rma as input.

              struct fi_msg_rma {
                  const struct iovec *msg_iov;     /* local scatter-gather array */
                  void               **desc;       /* operation descriptor */
                  size_t             iov_count;    /* # elements in msg_iov */
                  fi_addr_t          addr;        /* optional endpoint address */
                  const struct fi_rma_iov *rma_iov;/* remote SGL */
                  size_t             rma_iov_count;/* # elements in rma_iov */
                  void               *context;     /* user-defined context */
                  uint64_t           data;         /* optional immediate data */
              };

              struct fi_rma_iov {
                  uint64_t           addr;         /* target RMA address */
                  size_t             len;          /* size of target buffer */
                  uint64_t           key;          /* access key */
              };

   fi_inject_write
       The write inject call is an optimized version of fi_write.  It provides similar completion
       semantics as fi_inject fi_msg(3).

   fi_writedata
       The write data call is similar to fi_write, but allows for the sending of remote  CQ  data
       (see FI_REMOTE_CQ_DATA flag) as part of the transfer.

   fi_inject_writedata
       The  inject  write  data call is similar to fi_inject_write, but allows for the sending of
       remote CQ data (see FI_REMOTE_CQ_DATA flag) as part of the transfer.

   fi_read
       The fi_read call requests that the remote endpoint transfer data from  the  remote  memory
       region into the local data buffer.

   fi_readv
       The  fi_readv  call  adds  support  for  a  scatter-gather  list to fi_read.  The fi_readv
       transfers data from the remote memory region into the set of data  buffers  referenced  by
       the iov parameter.

   fi_readmsg
       The  fi_readmsg  call  supports  data  transfers  over  both  connected and connectionless
       endpoints, with the ability to control the read operation per  call  through  the  use  of
       flags.  The fi_readmsg function takes a struct fi_msg_rma as input.

FLAGS

       The  fi_readmsg and fi_writemsg calls allow the user to specify flags which can change the
       default data transfer operation.  Flags specified with fi_readmsg /  fi_writemsg  override
       most   flags   previously   configured   with   the  endpoint,  except  where  noted  (see
       fi_endpoint.3).   The  following  list  of  flags  are  usable  with   fi_readmsg   and/or
       fi_writemsg.

       FI_REMOTE_CQ_DATA
              Applies  to  fi_writemsg  and  fi_writedata.   Indicates  that  remote  CQ  data is
              available and should be sent as part of the request.  See fi_getinfo for additional
              details on FI_REMOTE_CQ_DATA.

       FI_COMPLETION
              Indicates  that a completion entry should be generated for the specified operation.
              The endpoint must be bound to a completion queue with FI_SELECTIVE_COMPLETION  that
              corresponds to the specified operation, or this flag is ignored.

       FI_MORE
              Indicates  that  the  user  has additional requests that will immediately be posted
              after the current call returns.  Use  of  this  flag  may  improve  performance  by
              enabling the provider to optimize its access to the fabric hardware.

       FI_INJECT
              Applies to fi_writemsg.  Indicates that the outbound data buffer should be returned
              to user immediately after the write call returns, even if the operation is  handled
              asynchronously.   This may require that the underlying provider implementation copy
              the data into a local buffer and transfer out of that buffer.  This flag  can  only
              be used with messages smaller than inject_size.

       FI_INJECT_COMPLETE
              Applies  to  fi_writemsg.  Indicates that a completion should be generated when the
              source buffer(s) may be reused.

       FI_TRANSMIT_COMPLETE
              Applies to fi_writemsg.  Indicates that a completion should not be generated  until
              the  operation  has been successfully transmitted and is no longer being tracked by
              the provider.

       FI_DELIVERY_COMPLETE
              Applies to fi_writemsg.  Indicates that a completion should be generated  when  the
              operation has been processed by the destination.

       FI_COMMIT_COMPLETE
              Applies  to fi_writemsg when targeting persistent memory regions.  Indicates that a
              completion should be generated only after the result of the operation has been made
              durable.

       FI_FENCE
              Applies  to  transmits.   Indicates that the requested operation, also known as the
              fenced operation, and any operation posted  after  the  fenced  operation  will  be
              deferred  until  all  previous  operations  targeting  the  same peer endpoint have
              completed.  Operations posted after the fencing will see and/or replace the results
              of any operations initiated prior to the fenced operation.

       The  ordering of operations starting at the posting of the fenced operation (inclusive) to
       the posting of a subsequent fenced operation (exclusive) is controlled by  the  endpoint’s
       ordering semantics.

RETURN VALUE

       Returns  0  on  success.   On  error,  a  negative  value corresponding to fabric errno is
       returned.  Fabric errno values are defined in rdma/fi_errno.h.

ERRORS

       -FI_EAGAIN
              See fi_msg(3) for a detailed description of handling FI_EAGAIN.

SEE ALSO

       fi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_cq(3)

AUTHORS

       OpenFabrics.