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

NAME

       fi_domain - Open a fabric access domain

SYNOPSIS

              #include <rdma/fabric.h>

              #include <rdma/fi_domain.h>

              int fi_domain(struct fid_fabric *fabric, struct fi_info *info,
                  struct fid_domain **domain, void *context);

              int fi_domain2(struct fid_fabric *fabric, struct fi_info *info,
                  struct fid_domain **domain, uint64_t flags, void *context);

              int fi_close(struct fid *domain);

              int fi_domain_bind(struct fid_domain *domain, struct fid *eq,
                  uint64_t flags);

              int fi_open_ops(struct fid *domain, const char *name, uint64_t flags,
                  void **ops, void *context);

              int fi_set_ops(struct fid *domain, const char *name, uint64_t flags,
                  void *ops, void *context);

ARGUMENTS

       fabric Fabric domain

       info   Fabric information, including domain capabilities and attributes.

       domain An opened access domain.

       context
              User  specified  context  associated  with  the  domain.   This context is returned as part of any
              asynchronous event associated with the domain.

       eq     Event queue for asynchronous operations initiated on the domain.

       name   Name associated with an interface.

       ops    Fabric interface operations.

DESCRIPTION

       An access domain typically refers to a physical or virtual NIC or hardware port; however,  a  domain  may
       span  across  multiple hardware components for fail-over or data striping purposes.  A domain defines the
       boundary for associating different resources together.  Fabric resources belonging to the same domain may
       share resources.

   fi_domain
       Opens  a fabric access domain, also referred to as a resource domain.  Fabric domains are identified by a
       name.  The properties of the opened domain are specified using the info parameter.

   fi_domain2
       Similar to fi_domain, but accepts an extra parameter flags.  Mainly used for opening  peer  domain.   See
       fi_peer(3).

   fi_open_ops
       fi_open_ops is used to open provider specific interfaces.  Provider interfaces may be used to access low-
       level resources and operations that are specific to the opened resource domain.  The  details  of  domain
       interfaces are outside the scope of this documentation.

   fi_set_ops
       fi_set_ops  assigns  callbacks that a provider should invoke in place of performing selected tasks.  This
       allows users to modify or control a provider’s default behavior.  Conceptually, it  allows  the  user  to
       hook specific functions used by a provider and replace it with their own.

       The  operations  being  modified  are  identified using a well-known character string, passed as the name
       parameter.  The format of the ops parameter is dependent upon the name value.   The  ops  parameter  will
       reference  a  structure  containing  the  callbacks and other fields needed by the provider to invoke the
       user’s functions.

       If a provider accepts the override, it will return  FI_SUCCESS.   If  the  override  is  unknown  or  not
       supported, the provider will return -FI_ENOSYS.  Overrides should be set prior to allocating resources on
       the domain.

       The following fi_set_ops operations and corresponding callback structures are defined.

       FI_SET_OPS_HMEM_OVERRIDE  Heterogeneous Memory Overrides

       HMEM override allows users to override HMEM related operations a provider may  perform.   Currently,  the
       scope  of  the HMEM override is to allow a user to define the memory movement functions a provider should
       use when accessing a user buffer.  The user-defined memory movement functions need to account for all the
       different HMEM iface types a provider may encounter.

       All objects allocated against a domain will inherit this override.

       The following is the HMEM override operation name and structure.

              #define FI_SET_OPS_HMEM_OVERRIDE "hmem_override_ops"

              struct fi_hmem_override_ops {
                  size_t  size;

                  ssize_t (*copy_from_hmem_iov)(void *dest, size_t size,
                      enum fi_hmem_iface iface, uint64_t device, const struct iovec *hmem_iov,
                      size_t hmem_iov_count, uint64_t hmem_iov_offset);

                  ssize_t (*copy_to_hmem_iov)(enum fi_hmem_iface iface, uint64_t device,
                  const struct iovec *hmem_iov, size_t hmem_iov_count,
                      uint64_t hmem_iov_offset, const void *src, size_t size);
              };

       All fields in struct fi_hmem_override_ops must be set (non-null) to a valid value.

       size   This should be set to the sizeof(struct fi_hmem_override_ops).  The size field is used for forward
              and backward compatibility purposes.

       copy_from_hmem_iov
              Copy data from the device/hmem to host memory.  This function should return a negative fi_errno on
              error, or the number of bytes copied on success.

       copy_to_hmem_iov
              Copy data from host memory to the device/hmem.  This function should return a negative fi_errno on
              error, or the number of bytes copied on success.

   fi_domain_bind
       Associates an event queue with the domain.  An event queue bound to a  domain  will  be  the  default  EQ
       associated  with  asynchronous control events that occur on the domain or active endpoints allocated on a
       domain.  This includes CM events.  Endpoints may direct their control events to alternate EQs by  binding
       directly with the EQ.

       Binding an event queue to a domain with the FI_REG_MR flag indicates that the provider should perform all
       memory registration operations asynchronously, with the completion reported through the event queue.   If
       an  event  queue  is  not  bound to the domain with the FI_REG_MR flag, then memory registration requests
       complete synchronously.

       See fi_av_bind(3), fi_ep_bind(3), fi_mr_bind(3),  fi_pep_bind(3),  and  fi_scalable_ep_bind(3)  for  more
       information.

   fi_close
       The  fi_close  call  is used to release all resources associated with a domain or interface.  All objects
       associated with the opened domain must be released prior to calling fi_close,  otherwise  the  call  will
       return -FI_EBUSY.

DOMAIN ATTRIBUTES

       The fi_domain_attr structure defines the set of attributes associated with a domain.

              struct fi_domain_attr {
                  struct fid_domain     *domain;
                  char                  *name;
                  enum fi_threading     threading;
                  enum fi_progress      control_progress;
                  enum fi_progress      data_progress;
                  enum fi_resource_mgmt resource_mgmt;
                  enum fi_av_type       av_type;
                  int                   mr_mode;
                  size_t                mr_key_size;
                  size_t                cq_data_size;
                  size_t                cq_cnt;
                  size_t                ep_cnt;
                  size_t                tx_ctx_cnt;
                  size_t                rx_ctx_cnt;
                  size_t                max_ep_tx_ctx;
                  size_t                max_ep_rx_ctx;
                  size_t                max_ep_stx_ctx;
                  size_t                max_ep_srx_ctx;
                  size_t                cntr_cnt;
                  size_t                mr_iov_limit;
                  uint64_t              caps;
                  uint64_t              mode;
                  uint8_t               *auth_key;
                  size_t                auth_key_size;
                  size_t                max_err_data;
                  size_t                mr_cnt;
                  uint32_t              tclass;
              };

   domain
       On  input to fi_getinfo, a user may set this to an opened domain instance to restrict output to the given
       domain.  On output from fi_getinfo, if no domain was specified, but the user has an  opened  instance  of
       the  named  domain,  this will reference the first opened instance.  If no instance has been opened, this
       field will be NULL.

       The domain instance returned by fi_getinfo should only be considered valid if the  application  does  not
       close any domain instances from another thread while fi_getinfo is being processed.

   Name
       The name of the access domain.

   Multi-threading Support (threading)
       The  threading  model  specifies  the  level  of  serialization required of an application when using the
       libfabric data transfer interfaces.  Control interfaces are always considered thread  safe,  and  may  be
       accessed by multiple threads.  Applications which can guarantee serialization in their access of provider
       allocated resources and interfaces enables a provider to eliminate lower-level locks.

       FI_THREAD_COMPLETION
              The completion threading model is intended  for  providers  that  make  use  of  manual  progress.
              Applications  must serialize access to all objects that are associated through the use of having a
              shared  completion  structure.   This  includes  endpoint,  transmit  context,  receive   context,
              completion queue, counter, wait set, and poll set objects.

       For  example,  threads  must  serialize  access  to  an endpoint and its bound completion queue(s) and/or
       counters.  Access to endpoints that share the same completion queue must also be serialized.

       The use of FI_THREAD_COMPLETION can increase parallelism over FI_THREAD_SAFE, but  requires  the  use  of
       isolated resources.

       FI_THREAD_DOMAIN
              A domain serialization model requires applications to serialize access to all objects belonging to
              a domain.

       FI_THREAD_ENDPOINT
              The endpoint threading model is similar to FI_THREAD_FID, but  with  the  added  restriction  that
              serialization  is required when accessing the same endpoint, even if multiple transmit and receive
              contexts are used.  Conceptually, FI_THREAD_ENDPOINT maps well to providers that implement  fabric
              services in hardware but use a single command queue to access different data flows.

       FI_THREAD_FID
              A  fabric  descriptor  (FID)  serialization  model  requires  applications  to serialize access to
              individual fabric resources associated with data transfer operations  and  completions.   Multiple
              threads  must  be  serialized when accessing the same endpoint, transmit context, receive context,
              completion queue, counter, wait set, or poll set.   Serialization  is  required  only  by  threads
              accessing the same object.

       For example, one thread may be initiating a data transfer on an endpoint, while another thread reads from
       a completion queue associated with the endpoint.

       Serialization to endpoint access is only required when accessing the same endpoint data  flow.   Multiple
       threads  may  initiate transfers on different transmit contexts of the same endpoint without serializing,
       and no serialization is required between the submission  of  data  transmit  requests  and  data  receive
       operations.

       In  general,  FI_THREAD_FID  allows  the provider to be implemented without needing internal locking when
       handling data transfers.  Conceptually, FI_THREAD_FID  maps  well  to  providers  that  implement  fabric
       services in hardware and provide separate command queues to different data flows.

       FI_THREAD_SAFE
              A  thread  safe  serialization  model  allows a multi-threaded application to access any allocated
              resources through any interface without  restriction.   All  providers  are  required  to  support
              FI_THREAD_SAFE.

       FI_THREAD_UNSPEC
              This  value  indicates that no threading model has been defined.  It may be used on input hints to
              the fi_getinfo call.  When specified, providers will return a threading model that allows for  the
              greatest level of parallelism.

   Progress Models (control_progress / data_progress)
       Progress  is  the  ability  of  the  underlying  implementation to complete processing of an asynchronous
       request.  In many cases, the processing  of  an  asynchronous  request  requires  the  use  of  the  host
       processor.   For  example,  a received message may need to be matched with the correct buffer, or a timed
       out request may need to be retransmitted.  For  performance  reasons,  it  may  be  undesirable  for  the
       provider to allocate a thread for this purpose, which will compete with the application threads.

       Control  progress  indicates  the  method that the provider uses to make progress on asynchronous control
       operations.  Control operations are functions which do not directly involve the transfer  of  application
       data  between  endpoints.   They  include  address vector, memory registration, and connection management
       routines.

       Data progress indicates the method that the provider uses to make progress on data  transfer  operations.
       This  includes  message  queue, RMA, tagged messaging, and atomic operations, along with their completion
       processing.

       Progress frequently requires action being taken at both  the  transmitting  and  receiving  sides  of  an
       operation.   This is often a requirement for reliable transfers, as a result of retry and acknowledgement
       processing.

       To balance between performance and ease of use, two progress models are defined.

       FI_PROGRESS_AUTO
              This progress model indicates that the provider will make  forward  progress  on  an  asynchronous
              operation  without  further intervention by the application.  When FI_PROGRESS_AUTO is provided as
              output to fi_getinfo in the absence of any progress hints, it often  indicates  that  the  desired
              functionality  is  implemented  by the provider hardware or is a standard service of the operating
              system.

       It is recommended that providers support FI_PROGRESS_AUTO.  However, if  a  provider  does  not  natively
       support  automatic  progress,  forcing  the use of FI_PROGRESS_AUTO may result in threads being allocated
       below the fabric interfaces.

       Note that prior versions of the library required providers to support FI_PROGRESS_AUTO.  However, in some
       cases progress threads cannot be blocked when communication is idle, which results in threads spinning in
       progress functions.  As a result, those providers only supported FI_PROGRESS_MANUAL.

       FI_PROGRESS_MANUAL
              This progress model indicates that the provider requires the  use  of  an  application  thread  to
              complete  an  asynchronous  request.   When  manual  progress is set, the provider will attempt to
              advance an asynchronous operation forward when the application attempts to  wait  on  or  read  an
              event  queue,  completion  queue,  or  counter  where  the  completed  operation will be reported.
              Progress also occurs when the application processes a poll or wait set that  has  been  associated
              with the event or completion queue.

       Only  wait operations defined by the fabric interface will result in an operation progressing.  Operating
       system or external wait functions, such as select, poll, or pthread routines, cannot.

       Manual progress requirements not only apply to endpoints that initiate transmit operations, but  also  to
       endpoints  that  may  be the target of such operations.  This holds true even if the target endpoint will
       not generate completion events for the operations.  For example, an endpoint  that  acts  purely  as  the
       target  of  RMA  or  atomic operations that uses manual progress may still need application assistance to
       process received operations.

       FI_PROGRESS_UNSPEC
              This value indicates that no progress model has been defined.  It may be used on  input  hints  to
              the fi_getinfo call.

   Resource Management (resource_mgmt)
       Resource management (RM) is provider and protocol support to protect against overrunning local and remote
       resources.  This includes local and remote transmit contexts, receive contexts,  completion  queues,  and
       source and target data buffers.

       When  enabled,  applications  are  given some level of protection against overrunning provider queues and
       local and remote data buffers.  Such support may be built  directly  into  the  hardware  and/or  network
       protocol,  but  may  also require that checks be enabled in the provider software.  By disabling resource
       management, an application assumes all responsibility for preventing queue and buffer overruns, but doing
       so may allow a provider to eliminate internal synchronization calls, such as atomic variables or locks.

       It should be noted that even if resource management is disabled, the provider implementation and protocol
       may still provide some level of protection against overruns.  However, such protection is not guaranteed.
       The following values for resource management are defined.

       FI_RM_DISABLED
              The  provider  is  free  to  select  an  implementation and protocol that does not protect against
              resource overruns.  The application is responsible for resource protection.

       FI_RM_ENABLED
              Resource management is enabled for this provider domain.

       FI_RM_UNSPEC
              This value indicates that no resource management model has been defined.  It may be used on  input
              hints to the fi_getinfo call.

       The  behavior  of  the various resource management options depends on whether the endpoint is reliable or
       unreliable, as well as provider and protocol specific implementation details, as shown in  the  following
       table.  The table assumes that all peers enable or disable RM the same.

       Resource     DGRAM EP-no RM    DGRAM EP-with RM   RDM/MSG   EP-no    RDM/MSG EP-with
                                                         RM                 RM
       ─────────────────────────────────────────────────────────────────────────────────────
        Tx Ctx      undefined error        EAGAIN        undefined error        EAGAIN
        Rx Ctx      undefined error        EAGAIN        undefined error        EAGAIN
         Tx CQ      undefined error        EAGAIN        undefined error        EAGAIN
         Rx CQ      undefined error        EAGAIN        undefined error        EAGAIN
        Target          dropped            dropped        transmit error        retried
        EP
       No    Rx         dropped            dropped        transmit error        retried
       Buffer

       Rx   Buf    truncate or drop   truncate or drop   truncate     or    truncate     or
       Overrun                                           error              error
       Unmatched    not applicable     not applicable     transmit error    transmit error
       RMA
        RMA         not applicable     not applicable     transmit error    transmit error
        Overrun

       The resource column indicates the resource being accessed by a data transfer operation.

       Tx Ctx / Rx Ctx
              Refers to the transmit/receive contexts when a data transfer operation is submitted.  When  RM  is
              enabled,  attempting  to submit a request will fail if the context is full.  If RM is disabled, an
              undefined error (provider specific) will occur.  Such errors should be  considered  fatal  to  the
              context, and applications must take steps to avoid queue overruns.

       Tx CQ / Rx CQ
              Refers  to  the  completion  queue  associated  with  the  Tx or Rx context when a local operation
              completes.  When RM is disabled, applications must take care to ensure that completion  queues  do
              not  get overrun.  When an overrun occurs, an undefined, but fatal, error will occur affecting all
              endpoints associated with the CQ.  Overruns can be avoided by sizing the CQs appropriately  or  by
              deferring  the  posting  of  a  data  transfer operation unless CQ space is available to store its
              completion.  When RM is enabled, providers may use different mechanisms to  prevent  CQ  overruns.
              This  includes  failing  (returning  -FI_EAGAIN) the posting of operations that could result in CQ
              overruns, or internally retrying requests (which will be hidden from the application).  See  notes
              at the end of this section regarding CQ resource management restrictions.

       Target EP / No Rx Buffer
              Target  EP  refers  to  resources  associated  with  the endpoint that is the target of a transmit
              operation.  This includes the target endpoint’s receive  queue,  posted  receive  buffers  (no  Rx
              buffers),  the  receive  side  completion  queue, and other related packet processing queues.  The
              defined behavior is that seen by the initiator of a request.  For FI_EP_DGRAM  endpoints,  if  the
              target  EP  queues are unable to accept incoming messages, received messages will be dropped.  For
              reliable endpoints, if RM is disabled, the transmit operation will complete in error.  A  provider
              may  choose to return an error completion with the error code FI_ENORX for that transmit operation
              so that it can be retried.  If RM is enabled, the provider will internally retry the operation.

       Rx Buffer Overrun
              This refers to buffers posted to receive incoming tagged or untagged messages, with  the  behavior
              defined  from  the  viewpoint of the sender.  The behavior for handling received messages that are
              larger than the buffers provided by the application is provider specific.   Providers  may  either
              truncate  the  message  and  report  a successful completion, or fail the operation.  For datagram
              endpoints, failed sends will result in the message being dropped.  For  reliable  endpoints,  send
              operations  may  complete successfully, yet be truncated at the receive side.  This can occur when
              the target side buffers received  data  until  an  application  buffer  is  made  available.   The
              completion  status  may  also  be dependent upon the completion model selected byt the application
              (e.g. FI_DELIVERY_COMPLETE versus FI_TRANSMIT_COMPLETE).

       Unmatched RMA / RMA Overrun
              Unmatched RMA and RMA overruns deal with the processing of RMA and atomic operations.  Unlike send
              operations,  RMA  operations that attempt to access a memory address that is either not registered
              for such operations, or attempt to access outside of the target memory region will fail, resulting
              in a transmit error.

       When  a  resource  management  error  occurs on an endpoint, the endpoint is transitioned into a disabled
       state.  Any operations which have not already completed will fail and be discarded.   For  connectionless
       endpoints,  the  endpoint  must  be  re-enabled  before it will accept new data transfer operations.  For
       connected endpoints, the connection is torn down and must be re-established.

       There is one notable restriction on the protections offered by resource  management.   This  occurs  when
       resource  management  is  enabled  on  an  endpoint  that has been bound to completion queue(s) using the
       FI_SELECTIVE_COMPLETION flag.  Operations posted to such  an  endpoint  may  specify  that  a  successful
       completion  should  not  generate  a  entry  on the corresponding completion queue.  (I.e.  the operation
       leaves the FI_COMPLETION flag unset).  In such situations, the provider is not  required  to  reserve  an
       entry  in the completion queue to handle the case where the operation fails and does generate a CQ entry,
       which would effectively require tracking  the  operation  to  completion.   Applications  concerned  with
       avoiding  CQ overruns in the occurrence of errors must ensure that there is sufficient space in the CQ to
       report failed operations.  This can typically be achieved by sizing the CQ to at least the same  size  as
       the endpoint queue(s) that are bound to it.

   AV Type (av_type)
       Specifies  the  type  of  address vectors that are usable with this domain.  For additional details on AV
       type, see fi_av(3).  The following values may be specified.

       FI_AV_MAP
              Only address vectors of type AV map are requested or supported.

       FI_AV_TABLE
              Only address vectors of type AV index are requested or supported.

       FI_AV_UNSPEC
              Any address vector format is requested and supported.

       Address vectors are only used by connectionless endpoints.   Applications  that  require  the  use  of  a
       specific  type  of  address  vector  should  set the domain attribute av_type to the necessary value when
       calling fi_getinfo.  The value FI_AV_UNSPEC may be used to indicate that the provider can support  either
       address  vector  format.  In this case, a provider may return FI_AV_UNSPEC to indicate that either format
       is supportable, or may return another AV type to indicate the optimal AV type supported by this domain.

   Memory Registration Mode (mr_mode)
       Defines memory registration specific mode bits used with this domain.  Full details on  MR  mode  options
       are available in fi_mr(3).  The following values may be specified.

       FI_MR_ALLOCATED
              Indicates  that memory registration occurs on allocated data buffers, and physical pages must back
              all virtual addresses being registered.

       FI_MR_COLLECTIVE
              Requires data buffers passed to collective operations  be  explicitly  registered  for  collective
              operations using the FI_COLLECTIVE flag.

       FI_MR_ENDPOINT
              Memory registration occurs at the endpoint level, rather than domain.

       FI_MR_LOCAL
              The  provider  is  optimized  around having applications register memory for locally accessed data
              buffers.  Data buffers used in send and receive operations and as the source buffer  for  RMA  and
              atomic  operations  must  be  registered  by  the  application for access domains opened with this
              capability.

       FI_MR_MMU_NOTIFY
              Indicates that the application is responsible for notifying the  provider  when  the  page  tables
              referencing a registered memory region may have been updated.

       FI_MR_PROV_KEY
              Memory registration keys are selected and returned by the provider.

       FI_MR_RAW
              The provider requires additional setup as part of their memory registration process.  This mode is
              required by providers that use a memory key that is larger than 64-bits.

       FI_MR_RMA_EVENT
              Indicates that the memory regions associated with completion counters must be  explicitly  enabled
              after being bound to any counter.

       FI_MR_UNSPEC
              Defined for compatibility – library versions 1.4 and earlier.  Setting mr_mode to 0 indicates that
              FI_MR_BASIC or FI_MR_SCALABLE are requested and supported.

       FI_MR_VIRT_ADDR
              Registered memory regions are referenced by peers using the  virtual  address  of  the  registered
              memory region, rather than a 0-based offset.

       FI_MR_BASIC
              Defined  for  compatibility  –  library  versions 1.4 and earlier.  Only basic memory registration
              operations  are  requested  or  supported.   This  mode  is  equivalent  to  the  FI_MR_VIRT_ADDR,
              FI_MR_ALLOCATED,  and FI_MR_PROV_KEY flags being set in later library versions.  This flag may not
              be used in conjunction with other mr_mode bits.

       FI_MR_SCALABLE
              Defined for compatibility – library versions 1.4 and earlier.  Only scalable  memory  registration
              operations  are  requested or supported.  Scalable registration uses offset based addressing, with
              application selectable memory keys.  For library versions 1.5 and later, this is the default if no
              mr_mode bits are set.  This flag may not be used in conjunction with other mr_mode bits.

       Buffers  used  in  data transfer operations may require notifying the provider of their use before a data
       transfer can occur.  The mr_mode field indicates the type of memory registration that  is  required,  and
       when registration is necessary.  Applications that require the use of a specific registration mode should
       set the domain attribute mr_mode to the necessary value when calling fi_getinfo.  The value  FI_MR_UNSPEC
       may be used to indicate support for any registration mode.

   MR Key Size (mr_key_size)
       Size  of  the memory region remote access key, in bytes.  Applications that request their own MR key must
       select a value within the range specified by this value.  Key sizes larger than 8 bytes require using the
       FI_RAW_KEY mode bit.

   CQ Data Size (cq_data_size)
       Applications  may  include  a  small  message  with a data transfer that is placed directly into a remote
       completion queue as part of a completion event.  This  is  referred  to  as  remote  CQ  data  (sometimes
       referred  to as immediate data).  This field indicates the number of bytes that the provider supports for
       remote CQ data.  If supported (non-zero value is returned), the minimum size of remote CQ data must be at
       least 4-bytes.

   Completion Queue Count (cq_cnt)
       The  optimal number of completion queues supported by the domain, relative to any specified or default CQ
       attributes.  The cq_cnt value may be a fixed value  of  the  maximum  number  of  CQs  supported  by  the
       underlying  hardware, or may be a dynamic value, based on the default attributes of an allocated CQ, such
       as the CQ size and data format.

   Endpoint Count (ep_cnt)
       The total number of endpoints supported by the domain, relative to  any  specified  or  default  endpoint
       attributes.   The  ep_cnt  value may be a fixed value of the maximum number of endpoints supported by the
       underlying hardware, or may be a dynamic value, based on the default attributes of an allocated endpoint,
       such  as  the  endpoint capabilities and size.  The endpoint count is the number of addressable endpoints
       supported by the provider.  Providers return capability  limits  based  on  configured  hardware  maximum
       capabilities.   Providers  cannot  predict  all  possible system limitations without posteriori knowledge
       acquired during runtime  that  will  further  limit  these  hardware  maximums  (e.g. application  memory
       consumption, FD usage, etc.).

   Transmit Context Count (tx_ctx_cnt)
       The  number  of  outbound  command queues optimally supported by the provider.  For a low-level provider,
       this represents the number of command queues to the hardware  and/or  the  number  of  parallel  transmit
       engines  effectively  supported  by  the  hardware and caches.  Applications which allocate more transmit
       contexts than this value will end up sharing  underlying  resources.   By  default,  there  is  a  single
       transmit  context  associated  with  each  endpoint,  but  in an advanced usage model, an endpoint may be
       configured with multiple transmit contexts.

   Receive Context Count (rx_ctx_cnt)
       The number of inbound processing queues optimally supported by the provider.  For a  low-level  provider,
       this  represents  the  number  hardware  queues  that can be effectively utilized for processing incoming
       packets.  Applications which allocate  more  receive  contexts  than  this  value  will  end  up  sharing
       underlying  resources.   By default, a single receive context is associated with each endpoint, but in an
       advanced usage model, an endpoint may be configured with multiple receive contexts.

   Maximum Endpoint Transmit Context (max_ep_tx_ctx)
       The maximum number of transmit contexts that may be associated with an endpoint.

   Maximum Endpoint Receive Context (max_ep_rx_ctx)
       The maximum number of receive contexts that may be associated with an endpoint.

   Maximum Sharing of Transmit Context (max_ep_stx_ctx)
       The maximum number of endpoints that may be associated with a shared transmit context.

   Maximum Sharing of Receive Context (max_ep_srx_ctx)
       The maximum number of endpoints that may be associated with a shared receive context.

   Counter Count (cntr_cnt)
       The optimal number of completion counters supported by the domain.  The cq_cnt value may be a fixed value
       of  the maximum number of counters supported by the underlying hardware, or may be a dynamic value, based
       on the default attributes of the domain.

   MR IOV Limit (mr_iov_limit)
       This is the maximum number of IO vectors (scatter-gather elements)  that  a  single  memory  registration
       operation may reference.

   Capabilities (caps)
       Domain  level capabilities.  Domain capabilities indicate domain level features that are supported by the
       provider.

       FI_LOCAL_COMM
              At a conceptual  level,  this  field  indicates  that  the  underlying  device  supports  loopback
              communication.   More  specifically,  this  field  indicates that an endpoint may communicate with
              other endpoints that are allocated from the same underlying named domain.  If this  field  is  not
              set,  an  application  may  need  to  use an alternate domain or mechanism (e.g. shared memory) to
              communicate with peers that execute on the same node.

       FI_REMOTE_COMM
              This field indicates that the underlying provider  supports  communication  with  nodes  that  are
              reachable  over  the  network.   If  this  field  is  not  set,  then  the  provider only supports
              communication between processes that execute on the same node –  a  shared  memory  provider,  for
              example.

       FI_SHARED_AV
              Indicates  that  the domain supports the ability to share address vectors among multiple processes
              using the named address vector feature.

       See fi_getinfo(3) for a discussion on primary versus secondary capabilities.  All domain capabilities are
       considered secondary capabilities.

   mode
       The operational mode bit related to using the domain.

       FI_RESTRICTED_COMP
              This  bit  indicates  that  the  domain limits completion queues and counters to only be used with
              endpoints, transmit contexts, and receive contexts that have the same set of capability flags.

   Default authorization key (auth_key)
       The default authorization key to associate with endpoint and  memory  registrations  created  within  the
       domain.  This field is ignored unless the fabric is opened with API version 1.5 or greater.

   Default authorization key length (auth_key_size)
       The  length in bytes of the default authorization key for the domain.  If set to 0, then no authorization
       key will be associated with endpoints and memory registrations created within the domain unless specified
       in  the  endpoint  or  memory registration attributes.  This field is ignored unless the fabric is opened
       with API version 1.5 or greater.

   Max Error Data Size (max_err_data)
       : The maximum amount of error data, in bytes, that may be returned as part of a completion or event queue
       error.   This  value  corresponds  to  the  err_data_size  field  in  struct  fi_cq_err_entry  and struct
       fi_eq_err_entry.

   Memory Regions Count (mr_cnt)
       The optimal number of memory regions supported by the domain, or endpoint if the  mr_mode  FI_MR_ENDPOINT
       bit  has  been  set.  The mr_cnt value may be a fixed value of the maximum number of MRs supported by the
       underlying hardware, or may be a dynamic value, based on the default attributes of the  domain,  such  as
       the  supported  memory  registration  modes.   Applications can set the mr_cnt on input to fi_getinfo, in
       order to indicate their memory registration requirements.  Doing so may allow the  provider  to  optimize
       any memory registration cache or lookup tables.

   Traffic Class (tclass)
       This specifies the default traffic class that will be associated any endpoints created within the domain.
       See fi_endpoint(3) for additional information.

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.

NOTES

       Users should call fi_close to release all resources allocated to the fabric domain.

       The  following fabric resources are associated with domains: active endpoints, memory regions, completion
       event queues, and address vectors.

       Domain attributes reflect the limitations and capabilities of the  underlying  hardware  and/or  software
       provider.   They  do  not  reflect  system  limitations,  such  as  the  number of physical pages that an
       application may pin or number of file descriptors that the  application  may  open.   As  a  result,  the
       reported  maximums  may  not  be  achievable,  even on a lightly loaded systems, without an administrator
       configuring system resources appropriately for the installed provider(s).

SEE ALSO

       fi_getinfo(3), fi_endpoint(3), fi_av(3), fi_eq(3), fi_mr(3) fi_peer(3)

AUTHORS

       OpenFabrics.