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

NAME

       fi_mr - Memory region operations

       fi_mr_reg / fi_mr_regv / fi_mr_regattr
              Register local memory buffers for direct fabric access

       fi_close
              Deregister registered memory buffers.

       fi_mr_desc
              Return a local descriptor associated with a registered memory region

       fi_mr_key
              Return the remote key needed to access a registered memory region

       fi_mr_raw_attr
              Return raw memory region attributes.

       fi_mr_map_raw
              Converts a raw memory region key into a key that is usable for data transfer operations.

       fi_mr_unmap_key
              Releases a previously mapped raw memory region key.

       fi_mr_bind
              Associate a registered memory region with a completion counter or an endpoint.

       fi_mr_refresh
              Updates the memory pages associated with a memory region.

       fi_mr_enable
              Enables a memory region for use.

SYNOPSIS

              #include <rdma/fi_domain.h>

              int fi_mr_reg(struct fid_domain *domain, const void *buf, size_t len,
                  uint64_t access, uint64_t offset, uint64_t requested_key,
                  uint64_t flags, struct fid_mr **mr, void *context);

              int fi_mr_regv(struct fid_domain *domain, const struct iovec * iov,
                  size_t count, uint64_t access, uint64_t offset, uint64_t requested_key,
                  uint64_t flags, struct fid_mr **mr, void *context);

              int fi_mr_regattr(struct fid_domain *domain, const struct fi_mr_attr *attr,
                  uint64_t flags, struct fid_mr **mr);

              int fi_close(struct fid *mr);

              void * fi_mr_desc(struct fid_mr *mr);

              uint64_t fi_mr_key(struct fid_mr *mr);

              int fi_mr_raw_attr(struct fid_mr *mr, uint64_t *base_addr,
                  uint8_t *raw_key, size_t *key_size, uint64_t flags);

              int fi_mr_map_raw(struct fid_domain *domain, uint64_t base_addr,
                  uint8_t *raw_key, size_t key_size, uint64_t *key, uint64_t flags);

              int fi_mr_unmap_key(struct fid_domain *domain, uint64_t key);

              int fi_mr_bind(struct fid_mr *mr, struct fid *bfid, uint64_t flags);

              int fi_mr_refresh(struct fid_mr *mr, const struct iovec *iov,
                  size_t count, uint64_t flags);

              int fi_mr_enable(struct fid_mr *mr);

ARGUMENTS

       domain Resource domain

       mr     Memory region

       bfid   Fabric identifier of an associated resource.

       context
              User specified context associated with the memory region.

       buf    Memory buffer to register with the fabric hardware.

       len    Length of memory buffer to register.  Must be > 0.

       iov    Vectored memory buffer.

       count  Count of vectored buffer entries.

       access Memory access permissions associated with registration

       offset Optional  specified offset for accessing specified registered buffers.  This parameter is reserved
              for future use and must be 0.

       requested_key
              Requested remote key associated with registered buffers.  Parameter is ignored  if  FI_MR_PROV_KEY
              flag is set in the domain mr_mode bits.

       attr   Memory region attributes

       flags  Additional flags to apply to the operation.

DESCRIPTION

       Registered  memory  regions  associate  memory  buffers  with  permissions  granted  for access by fabric
       resources.  A memory buffer must be registered with a resource domain before it can be used as the target
       of  a  remote RMA or atomic data transfer.  Additionally, a fabric provider may require that data buffers
       be registered before being used in local transfers.   Memory  registration  restrictions  are  controlled
       using a separate set of mode bits, specified through the domain attributes (mr_mode field).  Each mr_mode
       bit requires that an application take specific steps in  order  to  use  memory  buffers  with  libfabric
       interfaces.

       The following apply to memory registration.

       Default Memory Registration
              If  no  mr_mode  bits  are  set, the default behaviors describe below are followed.  Historically,
              these defaults were collectively  referred  to  as  scalable  memory  registration.   The  default
              requirements  are  outlined  below,  followed  by  definitions  of how each mr_mode bit alters the
              definition.

       Compatibility: For  library  versions  1.4  and  earlier,  this  was  indicated  by  setting  mr_mode  to
       FI_MR_SCALABLE and the fi_info mode bit FI_LOCAL_MR to 0.  FI_MR_SCALABLE and FI_LOCAL_MR were deprecated
       in libfabric version 1.5, though they are supported for backwards compatibility purposes.

       For security, memory registration is required for data buffers that  are  accessed  directly  by  a  peer
       process.   For  example,  registration is required for RMA target buffers (read or written to), and those
       accessed by atomic or collective operations.

       By default, registration occurs on virtual  address  ranges.   Because  registration  refers  to  address
       ranges,  rather  than  allocated  data  buffers,  the  address  ranges do not need to map to data buffers
       allocated by the application at the time the registration call is made.   That  is,  an  application  can
       register any range of addresses in their virtual address space, whether or not those addresses are backed
       by physical pages or have been allocated.

       Note that physical pages must back addresses prior to the addresses being accessed  as  part  of  a  data
       transfer  operation,  or  the  data  transfers will fail.  Additionally, depending on the operation, this
       could result in the local process receiving a segmentation fault for accessing invalid memory.

       Once registered, the resulting memory regions are accessible by peers starting at a base  address  of  0.
       That is, the target address that is specified is a byte offset into the registered region.

       The  application  also  selects  the  access key associated with the MR.  The key size is restricted to a
       maximum of 8 bytes.

       With scalable registration, locally accessed data buffers  are  not  registered.   This  includes  source
       buffers  for  all transmit operations – sends, tagged sends, RMA, and atomics – as well as buffers posted
       for receive and tagged receive operations.

       Although the default memory registration  behavior  is  convenient  for  application  developers,  it  is
       difficult  to  implement  in  hardware.   Attempts to hide the hardware requirements from the application
       often results in significant and unacceptable impacts to performance.  The  following  mr_mode  bits  are
       provided  as  input  into fi_getinfo.  If a provider requires the behavior defined for an mr_mode bit, it
       will leave the bit set on output to fi_getinfo.  Otherwise, the provider can clear the  bit  to  indicate
       that the behavior is not needed.

       By  setting an mr_mode bit, the application has agreed to adjust its behavior as indicated.  Importantly,
       applications that choose to support an mr_mode must be prepared to handle the case where the  mr_mode  is
       not required.  A provider will clear an mr_mode bit if it is not needed.

       FI_MR_LOCAL
              When  the  FI_MR_LOCAL  mode  bit is set, applications must register all data buffers that will be
              accessed by the local hardware and provide a valid desc parameter into  applicable  data  transfer
              operations.   When  FI_MR_LOCAL  is  zero,  applications are not required to register data buffers
              before using them for local operations (e.g. send and receive data buffers).  The  desc  parameter
              into  data  transfer  operations  will be ignored in this case, unless otherwise required (e.g. se
              FI_MR_HMEM).  It is recommended that applications pass in NULL for desc when not required.

       A provider may hide local registration requirements from  applications  by  making  use  of  an  internal
       registration  cache  or  similar mechanisms.  Such mechanisms, however, may negatively impact performance
       for some applications, notably those which manage their own network buffers.   In  order  to  support  as
       broad  range  of  applications as possible, without unduly affecting their performance, applications that
       wish to manage their own local memory registrations may do so by using the memory registration calls.

       Note: the FI_MR_LOCAL mr_mode bit replaces the FI_LOCAL_MR fi_info mode bit.  When  FI_MR_LOCAL  is  set,
       FI_LOCAL_MR is ignored.

       FI_MR_RAW
              Raw memory regions are used to support providers with keys larger than 64-bits or require setup at
              the peer.  When the FI_MR_RAW bit is set,  applications  must  use  fi_mr_raw_attr()  locally  and
              fi_mr_map_raw() at the peer before targeting a memory region as part of any data transfer request.

       FI_MR_VIRT_ADDR
              The  FI_MR_VIRT_ADDR bit indicates that the provider references memory regions by virtual address,
              rather than a 0-based offset.  Peers that target memory regions  registered  with  FI_MR_VIRT_ADDR
              specify the destination memory buffer using the target’s virtual address, with any offset into the
              region specified as virtual address + offset.  Support of this bit typically  implies  that  peers
              must exchange addressing data prior to initiating any RMA or atomic operation.

       FI_MR_ALLOCATED
              When  set,  all  registered memory regions must be backed by physical memory pages at the time the
              registration call is made.

       FI_MR_PROV_KEY
              This memory region mode indicates that the provider does  not  support  application  requested  MR
              keys.   MR keys are returned by the provider.  Applications that support FI_MR_PROV_KEY can obtain
              the provider key using fi_mr_key(), unless FI_MR_RAW is also set.  The returned key should then be
              exchanged with peers prior to initiating an RMA or atomic operation.

       FI_MR_MMU_NOTIFY
              FI_MR_MMU_NOTIFY  is  typically  set  by providers that support memory registration against memory
              regions that are not necessarily backed by  allocated  physical  pages  at  the  time  the  memory
              registration  occurs.  (That is, FI_MR_ALLOCATED is typically 0).  However, such providers require
              that applications notify the provider prior to the MR being accessed as part of  a  data  transfer
              operation.   This notification informs the provider that all necessary physical pages now back the
              region.  The notification is necessary for providers that cannot hook directly into the  operating
              system page tables or memory management unit.  See fi_mr_refresh() for notification details.

       FI_MR_RMA_EVENT
              This  mode  bit indicates that the provider must configure memory regions that are associated with
              RMA events prior to their use.   This  includes  all  memory  regions  that  are  associated  with
              completion  counters.   When set, applications must indicate if a memory region will be associated
              with a completion counter as part of the region’s creation.   This  is  done  by  passing  in  the
              FI_RMA_EVENT flag to the memory registration call.

       Such  memory  regions  will  be  created  in  a disabled state and must be associated with all completion
       counters prior to being enabled.  To enable a memory region, the application  must  call  fi_mr_enable().
       After calling fi_mr_enable(), no further resource bindings may be made to the memory region.

       FI_MR_ENDPOINT
              This  mode  bit  indicates  that the provider associates memory regions with endpoints rather than
              domains.  Memory regions that are registered with the provider are created in a disabled state and
              must  be  bound  to  an  endpoint  prior  to  being enabled.  To bind the MR with an endpoint, the
              application must use fi_mr_bind().  To  enable  the  memory  region,  the  application  must  call
              fi_mr_enable().

       FI_MR_HMEM
              This  mode  bit  is associated with the FI_HMEM capability.  If FI_MR_HMEM is set, the application
              must register buffers that were allocated using a device call and provide a valid  desc  parameter
              into  applicable  data  transfer  operations  even  if  they  are  only  used for local operations
              (e.g. send and receive data buffers).  Device memory must be registered  using  the  fi_mr_regattr
              call, with the iface and device fields filled out.

       If FI_MR_HMEM is set, but FI_MR_LOCAL is unset, only device buffers must be registered when used locally.
       In this case, the desc parameter passed into data transfer operations  must  either  be  valid  or  NULL.
       Similarly, if FI_MR_LOCAL is set, but FI_MR_HMEM is not, the desc parameter must either be valid or NULL.

       FI_MR_COLLECTIVE
              This  bit  is  associated with the FI_COLLECTIVE capability.  When set, the provider requires that
              memory regions used in collection operations must explicitly be registered for use with collective
              calls.  This requires registering regions passed to collective calls using the FI_COLLECTIVE flag.

       Basic Memory Registration
              Basic  memory registration was deprecated in libfabric version 1.5, but is supported for backwards
              compatibility.  Basic memory registration is indicated by setting mr_mode  equal  to  FI_MR_BASIC.
              FI_MR_BASIC  must  be  set  alone and not paired with mr_mode bits.  Unlike other mr_mode bits, if
              FI_MR_BASIC is set on input to fi_getinfo(), it will not be cleared by  the  provider.   That  is,
              setting mr_mode equal to FI_MR_BASIC forces basic registration if the provider supports it.

       The   behavior   of   basic   registration  is  equivalent  to  requiring  the  following  mr_mode  bits:
       FI_MR_VIRT_ADDR,  FI_MR_ALLOCATED,  and  FI_MR_PROV_KEY.   Additionally,  providers  that  support  basic
       registration  usually  require the (deprecated) fi_info mode bit FI_LOCAL_MR, which was incorporated into
       the FI_MR_LOCAL mr_mode bit.

       The registrations functions – fi_mr_reg, fi_mr_regv, and fi_mr_regattr – are used to register one or more
       memory  regions with fabric resources.  The main difference between registration functions are the number
       and type of parameters that they accept as input.  Otherwise, they perform the same general function.

       By default, memory registration completes synchronously.  I.e.  the registration  call  will  not  return
       until  the  registration  has  completed.   Memory  registration can complete asynchronous by binding the
       resource domain  to  an  event  queue  using  the  FI_REG_MR  flag.   See  fi_domain_bind.   When  memory
       registration  is asynchronous, in order to avoid a race condition between the registration call returning
       and the corresponding reading of the event from the EQ, the mr output parameter will  be  written  before
       any  event  associated with the operation may be read by the application.  An asynchronous event will not
       be generated unless the registration call returns success (0).

   fi_mr_reg
       The fi_mr_reg call registers the user-specified memory buffer with the resource domain.   The  buffer  is
       enabled for access by the fabric hardware based on the provided access permissions.  See the access field
       description for memory region attributes below.

       Registered memory is associated with a local memory descriptor and, optionally, a remote memory  key.   A
       memory  descriptor  is  a  provider  specific  identifier  associated  with  registered  memory.   Memory
       descriptors often map to hardware specific indices or keys associated with  the  memory  region.   Remote
       memory  keys  provide  limited protection against unwanted access by a remote node.  Remote accesses to a
       memory region must provide the key associated with the registration.

       Because MR keys must be provided by a remote process, an application can use the requested_key  parameter
       to  indicate that a specific key value be returned.  Support for user requested keys is provider specific
       and is determined by the FI_MR_PROV_KEY flag value in the mr_mode domain attribute.

       Remote RMA and atomic operations indicate the location within a registered memory region by specifying an
       address.   The  location  is  referenced  by  adding the offset to either the base virtual address of the
       buffer or to 0, depending on the mr_mode.

       The offset parameter is reserved for future use and must be 0.

       For asynchronous memory registration requests, the result will be reported to the user through  an  event
       queue  associated with the resource domain.  If successful, the allocated memory region structure will be
       returned to the user through the mr parameter.  The mr address must remain valid until  the  registration
       operation completes.  The context specified with the registration request is returned with the completion
       event.

   fi_mr_regv
       The fi_mr_regv call adds support for a scatter-gather list to fi_mr_reg.   Multiple  memory  buffers  are
       registered as a single memory region.  Otherwise, the operation is the same.

   fi_mr_regattr
       The  fi_mr_regattr  call  is a more generic, extensible registration call that allows the user to specify
       the registration request using a struct fi_mr_attr (defined below).

   fi_close
       Fi_close is used to  release  all  resources  associated  with  a  registering  a  memory  region.   Once
       unregistered,  further  access  to  the registered memory is not guaranteed.  Active or queued operations
       that reference a memory  region  being  closed  may  fail  or  result  in  accesses  to  invalid  memory.
       Applications  are  responsible for ensuring that a MR is no longer needed prior to closing it.  Note that
       accesses to a closed MR from a remote peer will result in an error at the peer.  The state of  the  local
       endpoint will be unaffected.

       When  closing the MR, there must be no opened endpoints or counters associated with the MR.  If resources
       are still associated with the MR when attempting to close, the call will return -FI_EBUSY.

   fi_mr_desc
       Obtains the local memory descriptor associated with a MR.  The memory registration  must  have  completed
       successfully before invoking this call.

   fi_mr_key
       Returns  the  remote  protection  key  associated with a MR.  The memory registration must have completed
       successfully before invoking this.  The returned key may be used in data transfer operations at  a  peer.
       If  the  FI_RAW_MR  mode  bit has been set for the domain, then the memory key must be obtained using the
       fi_mr_raw_key function instead.  A return value of FI_KEY_NOTAVAIL will be returned if  the  registration
       has not completed or a raw memory key is required.

   fi_mr_raw_attr
       Returns  the  raw,  remote protection key and base address associated with a MR.  The memory registration
       must have completed successfully before invoking this routine.  Use of  this  call  is  required  if  the
       FI_RAW_MR  mode  bit  has  been set by the provider; however, it is safe to use this call with any memory
       region.

       On input, the key_size parameter should indicate the size of the raw_key buffer.  If the  actual  key  is
       larger  than  what  can fit into the buffer, it will return -FI_ETOOSMALL.  On output, key_size is set to
       the size of the buffer needed to store the key, which may be larger than the  input  value.   The  needed
       key_size can also be obtained through the mr_key_size domain attribute (fi_domain_attr) field.

       A  raw key must be mapped by a peer before it can be used in data transfer operations.  See fi_mr_map_raw
       below.

   fi_mr_map_raw
       Raw protection keys must be mapped to a usable key value before  they  can  be  used  for  data  transfer
       operations.   The  mapping  is  done by the peer that initiates the RMA or atomic operation.  The mapping
       function takes as input the raw key and its size, and returns the mapped key.  Use of  the  fi_mr_map_raw
       function  is  required  if the peer has the FI_RAW_MR mode bit set, but this routine may be called on any
       valid key.  All mapped keys must be freed by calling fi_mr_unmap_key  when  access  to  the  peer  memory
       region is no longer necessary.

   fi_mr_unmap_key
       This  call  releases any resources that may have been allocated as part of mapping a raw memory key.  All
       mapped keys must be freed before the corresponding domain is closed.

   fi_mr_bind
       The fi_mr_bind function associates a memory region with a counter  or  endpoint.   Counter  bindings  are
       needed  by  providers  that  support  the generation of completions based on fabric operations.  Endpoint
       bindings are needed if the provider associates memory regions with endpoints (see FI_MR_ENDPOINT).

       When binding with a counter, the type of events tracked against the memory region is based on the bitwise
       OR of the following flags.

       FI_REMOTE_WRITE
              Generates  an  event  whenever  a remote RMA write or atomic operation modifies the memory region.
              Use of this flag requires that the endpoint through which the MR is accessed be created  with  the
              FI_RMA_EVENT capability.

       When binding the memory region to an endpoint, flags should be 0.

   fi_mr_refresh
       The  use  of  this  call is required to notify the provider of any change to the physical pages backing a
       registered memory region if the FI_MR_MMU_NOTIFY mode bit has been set.  This call informs  the  provider
       that  the  page  table entries associated with the region may have been modified, and the provider should
       verify and update the registered region accordingly.  The iov parameter is optional and may  be  used  to
       specify  which  portions  of  the  registered region requires updating.  Providers are only guaranteed to
       update the specified address ranges.

       The refresh operation has the effect of disabling and re-enabling access to the registered  region.   Any
       operations  from  peers  that  attempt  to  access  the  region will fail while the refresh is occurring.
       Additionally, attempts to access the region by the local process through libfabric APIs may result  in  a
       page fault or other fatal operation.

       The  fi_mr_refresh  call  is  only  needed if the physical pages might have been updated after the memory
       region was created.

   fi_mr_enable
       The enable call is used with memory registration associated with the FI_MR_RMA_EVENT  mode  bit.   Memory
       regions  created  in  the  disabled  state must be explicitly enabled after being fully configured by the
       application.  Any resource bindings to the MR must be done prior to enabling the MR.

MEMORY REGION ATTRIBUTES

       Memory regions are created using  the  following  attributes.   The  struct  fi_mr_attr  is  passed  into
       fi_mr_regattr,  but  individual  fields  also  apply  to other memory registration calls, with the fields
       passed directly into calls as function parameters.

              struct fi_mr_attr {
                  const struct iovec *mr_iov;
                  size_t             iov_count;
                  uint64_t           access;
                  uint64_t           offset;
                  uint64_t           requested_key;
                  void               *context;
                  size_t             auth_key_size;
                  uint8_t            *auth_key;
                  enum fi_hmem_iface iface;
                  union {
                      uint64_t         reserved;
                      int              cuda;
                      int      ze
                  } device;
              };

   mr_iov
       This is an IO vector of addresses that will represent a single memory region.  The number of  entries  in
       the iovec is specified by iov_count.

   iov_count
       The  number  of entries in the mr_iov array.  The maximum number of memory buffers that may be associated
       with a single memory region is specified as the mr_iov_limit domain attribute.  See fi_domain(3).

   access
       Indicates the type of operations that the local or a peer  endpoint  may  perform  on  registered  memory
       region.  Supported access permissions are the bitwise OR of the following flags:

       FI_SEND
              The  memory  buffer  may  be  used  in  outgoing message data transfers.  This includes fi_msg and
              fi_tagged send operations, as well as fi_collective operations.

       FI_RECV
              The memory buffer may be used to receive inbound message  transfers.   This  includes  fi_msg  and
              fi_tagged receive operations, as well as fi_collective operations.

       FI_READ
              The  memory  buffer  may  be  used  as the result buffer for RMA read and atomic operations on the
              initiator side.  Note that from the viewpoint of the  application,  the  memory  buffer  is  being
              written into by the network.

       FI_WRITE
              The  memory  buffer  may  be  used as the source buffer for RMA write and atomic operations on the
              initiator side.  Note that from the viewpoint of the application, the endpoint is reading from the
              memory buffer and copying the data onto the network.

       FI_REMOTE_READ
              The  memory  buffer  may be used as the source buffer of an RMA read operation on the target side.
              The contents of the memory buffer are not modified by such operations.

       FI_REMOTE_WRITE
              The memory buffer may be used as the target buffer of an  RMA  write  or  atomic  operation.   The
              contents of the memory buffer may be modified as a result of such operations.

       FI_COLLECTIVE
              This  flag  provides  an  explicit  indication  that the memory buffer may be used with collective
              operations.  Use of this flag is required if the FI_MR_COLLECTIVE mr_mode bit has been set on  the
              domain.  This flag should be paired with FI_SEND and/or FI_RECV

       Note  that  some providers may not enforce fine grained access permissions.  For example, a memory region
       registered for FI_WRITE access may also behave as if FI_SEND were specified as well.  Relaxed enforcement
       of such access is permitted, though not guaranteed, provided security is maintained.

   offset
       The offset field is reserved for future use and must be 0.

   requested_key
       An  application specified access key associated with the memory region.  The MR key must be provided by a
       remote process when performing RMA or atomic operations to a memory region.   Applications  can  use  the
       requested_key field to indicate that a specific key be used by the provider.  This allows applications to
       use well known key values, which can avoid applications needing to exchange and store keys.  Support  for
       user  requested keys is provider specific and is determined by the the FI_MR_PROV_KEY flag in the mr_mode
       domain attribute field.

   context
       Application context associated with asynchronous memory registration operations.  This value is  returned
       as  part  of  any  asynchronous  event  associated  with  the  registration.   This  field is ignored for
       synchronous registration calls.

   auth_key_size
       The size of key referenced by the auth_key field in bytes, or 0 if no authorization key is  given.   This
       field is ignored unless the fabric is opened with API version 1.5 or greater.

   auth_key
       Indicates  the  key  to  associate  with  this memory registration.  Authorization keys are used to limit
       communication between endpoints.  Only peer endpoints that are programmed to use the  same  authorization
       key  may  access  the  memory  region.   The  domain  authorization key will be used if the auth_key_size
       provided is 0.  This field is ignored unless the fabric is opened with API version 1.5 or greater.

   iface
       Indicates the software interfaces used by the application to allocate and manage the memory region.  This
       field is ignored unless the application has requested the FI_HMEM capability.

       FI_HMEM_SYSTEM
              Uses  standard  operating  system  calls and libraries, such as malloc, calloc, realloc, mmap, and
              free.

       FI_HMEM_CUDA
              Uses Nvidia CUDA interfaces such  as  cuMemAlloc,  cuMemAllocHost,  cuMemAllocManaged,  cuMemFree,
              cudaMalloc, cudaFree.

       FI_HMEM_ROCR
              Uses AMD ROCR interfaces such as hsa_memory_allocate and hsa_memory_free.

       FI_HMEM_ZE
              Uses oneAPI Level Zero interfaces such as zeDriverAllocSharedMem, zeDriverFreeMem.

       FI_HMEM_NEURON
              Uses the AWS Neuron SDK to support AWS Trainium devices.

       FI_HMEM_SYNAPSEAI
              Uses the SynapseAI API to support Habana Gaudi devices.

   device
       Reserved 64 bits for device identifier if using non-standard HMEM interface.  This field is ignore unless
       the iface field is valid.

       cuda   For FI_HMEM_CUDA, this is equivalent to CUdevice (int).

       ze     For FI_HMEM_ZE, this is equivalent to the ze_device_handle_t index (int).

       neuron For FI_HMEM_NEURON, the device identifier for AWS Trainium devices.

       synapseai
              For FI_HMEM_SYNAPSEAI, the device identifier for Habana Gaudi hardware.

NOTES

       Direct access to an application’s memory by a remote peer requires  that  the  application  register  the
       targeted  memory  buffer(s).   This  is  typically  done  by calling one of the fi_mr_reg* routines.  For
       FI_MR_PROV_KEY, the provider will return a key that must be used by the peer when  accessing  the  memory
       region.   The  application  is  responsible for transferring this key to the peer.  If FI_MR_RAW mode has
       been set, the key must be retrieved using the fi_mr_raw_attr function.

       FI_RAW_MR allows support for providers that require more than 8-bytes for their protection keys  or  need
       additional  setup before a key can be used for transfers.  After a raw key has been retrieved, it must be
       exchanged with the remote peer.  The peer must use fi_mr_map_raw to convert the raw  key  into  a  usable
       64-bit key.  The mapping must be done even if the raw key is 64-bits or smaller.

       The  raw  key  support functions are usable with all registered memory regions, even if FI_MR_RAW has not
       been set.  It is recommended that portable applications target using those interfaces; however, their use
       does  carry  extra  message  and  memory footprint overhead, making it less desirable for highly scalable
       apps.

       There may be cases where device peer to peer support should not be used or cannot be used, such  as  when
       the  PCIe  ACS  configuration does not permit the transfer.  The FI_HMEM_DISABLE_P2P environment variable
       can be set to notify Libfabric that peer to peer transactions should  not  be  used.   The  provider  may
       choose to perform a copy instead, or will fail support for FI_HMEM if the provider is unable to do that.

FLAGS

       The follow flag may be specified to any memory registration call.

       FI_RMA_EVENT
              This  flag indicates that the specified memory region will be associated with a completion counter
              used to count RMA operations that access the MR.

       FI_RMA_PMEM
              This flag indicates that the underlying memory region is backed by persistent memory and  will  be
              used  in  RMA  operations.   It must be specified if persistent completion semantics or persistent
              data transfers are required when accessing the registered region.

       FI_HMEM_DEVICE_ONLY
              This flag indicates that the memory is only accessible by a device.  Which device is specified  by
              the fi_mr_attr fields iface and device.  This refers to memory regions that were allocated using a
              device API AllocDevice call (as opposed to using the  host  allocation  or  unified/shared  memory
              allocation).

       FI_HMEM_HOST_ALLOC
              This  flag indicates that the memory is owned by the host only.  Whether it can be accessed by the
              device is implementation dependent.  The fi_mr_attr field iface is  still  used  to  identify  the
              device  API,  but  the field device is ignored.  This refers to memory regions that were allocated
              using a device API AllocHost call (as opposed to using malloc-like host allocation, unified/shared
              memory allocation, or AllocDevice).

MEMORY DOMAINS

       Memory  domains identify the physical separation of memory which may or may not be accessible through the
       same virtual address space.  Traditionally, applications only dealt with a single memory domain, that  of
       host memory tightly coupled with the system CPUs.  With the introduction of device and non-uniform memory
       subsystems, applications often need to be aware of which memory domain a particular virtual address  maps
       to.

       As  a  general  rule,  separate physical devices can be considered to have their own memory domains.  For
       example, a NIC may have user accessible memory, and would be considered a  separate  memory  domain  from
       memory  on  a GPU.  Both the NIC and GPU memory domains are separate from host system memory.  Individual
       GPUs or computation accelerators may have distinct memory domains, or may be  connected  in  such  a  way
       (e.g. a  GPU  specific  fabric)  that  all  GPUs  would belong to the same memory domain.  Unfortunately,
       identifying memory domains is specific to each system and its physical and/or virtual configuration.

       Understanding memory domains in heterogenous memory environments is  important  as  it  can  impact  data
       ordering  and  visibility  as  viewed by an application.  It is also important to understand which memory
       domain an application is most tightly coupled to.  In most cases, applications  are  tightly  coupled  to
       host  memory.   However,  an  application running directly on a GPU or NIC may be more tightly coupled to
       memory associated with those devices.

       Memory regions are often associated with a single memory domain.  The domain is often  indicated  by  the
       fi_mr_attr  iface  and  device fields.  Though it is possible for physical pages backing a virtual memory
       region to migrate between memory domains based on access  patterns.   For  example,  the  physical  pages
       referenced  by  a  virtual  address  range could migrate between host memory and GPU memory, depending on
       which computational unit is actively using it.

       See the fi_endpoint(3) and fi_cq(3) man pages for addition discussion on message,  data,  and  completion
       ordering semantics, including the impact of memory domains.

RETURN VALUES

       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_ENOKEY
              The requested_key is already in use.

       -FI_EKEYREJECTED
              The  requested_key  is not available.  They key may be out of the range supported by the provider,
              or the provider may not support user-requested memory registration keys.

       -FI_ENOSYS
              Returned by fi_mr_bind if the provider does not  support  reporting  events  based  on  access  to
              registered memory regions.

       -FI_EBADFLAGS
              Returned if the specified flags are not supported by the provider.

MEMORY REGISTRATION CACHE

       Many  hardware NICs accessed by libfabric require that data buffers be registered with the hardware while
       the hardware accesses it.  This ensures that the virtual to physical address mappings for  those  buffers
       do  not change while the transfer is occurring.  The performance impact of registering memory regions can
       be significant.  As a result, some providers make use of a registration cache, particularly when  working
       with  applications  that are unable to manage their own network buffers.  A registration cache avoids the
       overhead of registering and unregistering a data buffer with each transfer.

       If a registration cache is going to be used for host and device memory, the device must  support  unified
       virtual  addressing.   If  the  device  does not support unified virtual addressing, either an additional
       registration cache is required to track this device memory, or device memory cannot be cached.

       As a general rule, if hardware requires the FI_MR_LOCAL  mode  bit  described  above,  but  this  is  not
       supported  by  the  application,  a  memory  registration cache may be in use.  The following environment
       variables may be used to configure registration caches.

       FI_MR_CACHE_MAX_SIZE
              This defines the total number of bytes for all memory regions that may be tracked  by  the  cache.
              If  not  set, the cache has no limit on how many bytes may be registered and cached.  Setting this
              will reduce the amount of memory that is not actively being used as part of a data  transfer  that
              is registered with a provider.  By default, the cache size is unlimited.

       FI_MR_CACHE_MAX_COUNT
              This  defines  the  total  number of memory regions that may be registered with the cache.  If not
              set, a default limit is chosen.   Setting  this  will  reduce  the  number  of  regions  that  are
              registered,  regardless  of  their  size,  which  are  not  actively  being used as part of a data
              transfer.  Setting this to zero will disable registration caching.

       FI_MR_CACHE_MONITOR
              The cache monitor is responsible for detecting system memory (FI_HMEM_SYSTEM) changes made between
              the  virtual  addresses  used  by an application and the underlying physical pages.  Valid monitor
              options  are:  userfaultfd,  memhooks,  and  disabled.   Selecting  disabled  will  turn  off  the
              registration  cache.   Userfaultfd  is  a  Linux kernel feature used to report virtual to physical
              address mapping changes  to  user  space.   Memhooks  operates  by  intercepting  relevant  memory
              allocation and deallocation calls which may result in the mappings changing, such as malloc, mmap,
              free, etc.  Note that memhooks operates at the elf linker layer, and does  not  use  glibc  memory
              hooks.

       FI_MR_CUDA_CACHE_MONITOR_ENABLED
              The CUDA cache monitor is responsible for detecting CUDA device memory (FI_HMEM_CUDA) changes made
              between the device virtual addresses used by an application and  the  underlying  device  physical
              pages.   Valid  monitor  options  are:  0 or 1.  Note that the CUDA memory monitor requires a CUDA
              toolkit version with unified virtual addressing enabled.

       FI_MR_ROCR_CACHE_MONITOR_ENABLED
              The ROCR cache monitor is responsible for detecting ROCR device memory (FI_HMEM_ROCR) changes made
              between  the  device  virtual  addresses used by an application and the underlying device physical
              pages.  Valid monitor options are: 0 or 1.  Note that the ROCR  memory  monitor  requires  a  ROCR
              version with unified virtual addressing enabled.

       FI_MR_ZE_CACHE_MONITOR_ENABLED
              The  ZE  cache  monitor  is responsible for detecting oneAPI Level Zero device memory (FI_HMEM_ZE)
              changes made between the device virtual addresses used by an application and the underlying device
              physical pages.  Valid monitor options are: 0 or 1.

       More  direct  access to the internal registration cache is possible through the fi_open() call, using the
       “mr_cache” service name.  Once opened, custom memory monitors may be installed.  A memory  monitor  is  a
       component  of  the cache responsible for detecting changes in virtual to physical address mappings.  Some
       level of control over the cache is possible through the above mentioned environment variables.

SEE ALSO

       fi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_rma(3), fi_msg(3), fi_atomic(3)

AUTHORS

       OpenFabrics.