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

NAME

       fi_av - Address vector operations

       fi_av_open / fi_close
              Open or close an address vector

       fi_av_bind
              Associate an address vector with an event queue.

       fi_av_insert / fi_av_insertsvc / fi_av_remove
              Insert/remove an address into/from the address vector.

       fi_av_lookup
              Retrieve an address stored in the address vector.

       fi_av_straddr
              Convert an address into a printable string.

SYNOPSIS

              #include <rdma/fi_domain.h>

              int fi_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
                  struct fid_av **av, void *context);

              int fi_close(struct fid *av);

              int fi_av_bind(struct fid_av *av, struct fid *eq, uint64_t flags);

              int fi_av_insert(struct fid_av *av, void *addr, size_t count,
                  fi_addr_t *fi_addr, uint64_t flags, void *context);

              int fi_av_insertsvc(struct fid_av *av, const char *node,
                  const char *service, fi_addr_t *fi_addr, uint64_t flags,
                  void *context);

              int fi_av_insertsym(struct fid_av *av, const char *node,
                  size_t nodecnt, const char *service, size_t svccnt,
                  fi_addr_t *fi_addr, uint64_t flags, void *context);

              int fi_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
                  uint64_t flags);

              int fi_av_lookup(struct fid_av *av, fi_addr_t fi_addr,
                  void *addr, size_t *addrlen);

              fi_addr_t fi_rx_addr(fi_addr_t fi_addr, int rx_index,
                    int rx_ctx_bits);

              const char * fi_av_straddr(struct fid_av *av, const void *addr,
                    char *buf, size_t *len);

ARGUMENTS

       domain Resource domain

       av     Address vector

       eq     Event queue

       attr   Address vector attributes

       context
              User specified context associated with the address vector or insert operation.

       addr   Buffer containing one or more addresses to insert into address vector.

       addrlen
              On input, specifies size of addr buffer.  On output, stores number of bytes written
              to addr buffer.

       fi_addr
              For insert, a reference to  an  array  where  returned  fabric  addresses  will  be
              written.   For remove, one or more fabric addresses to remove.  If FI_AV_USER_ID is
              requested, also used as input into insert calls to assign  the  user  ID  with  the
              added address.

       count  Number of addresses to insert/remove from an AV.

       flags  Additional flags to apply to the operation.

DESCRIPTION

       Address  vectors  are used to map higher-level addresses, which may be more natural for an
       application to use, into fabric specific addresses.   For  example,  an  endpoint  may  be
       associated with a struct sockaddr_in address, indicating the endpoint is reachable using a
       TCP port number over an IPv4 address.  This may hold even  if  the  endpoint  communicates
       using  a  proprietary  network  protocol.  The purpose of the AV is to associate a higher-
       level address with a simpler, more efficient value that can be used by the  libfabric  API
       in a fabric agnostic way.  The mapped address is of type fi_addr_t and is returned through
       an AV insertion call.  The fi_addr_t is designed such that it may be a simple  index  into
       an  array,  a  pointer  to  a  structure,  or a compact network address that may be placed
       directly into protocol headers.

       The process of mapping an address is fabric and provider specific, but may involve lengthy
       address  resolution  and  fabric  management  protocols.  AV operations are synchronous by
       default, but may be set to operate asynchronously  by  specifying  the  FI_EVENT  flag  to
       fi_av_open.   When  requesting  asynchronous operation, the application must first bind an
       event queue to  the  AV  before  inserting  addresses.   See  the  NOTES  section  for  AV
       restrictions on duplicate addresses.

   fi_av_open
       fi_av_open  allocates  or  opens  an  address  vector.  The properties and behavior of the
       address vector are defined by struct fi_av_attr.

              struct fi_av_attr {
                  enum fi_av_type  type;        /* type of AV */
                  int              rx_ctx_bits; /* address bits to identify rx ctx */
                  size_t           count;       /* # entries for AV */
                  size_t           ep_per_node; /* # endpoints per fabric address */
                  const char       *name;       /* system name of AV */
                  void             *map_addr;   /* base mmap address */
                  uint64_t         flags;       /* operation flags */
              };

       type   An AV type corresponds to a conceptual implementation of an  address  vector.   The
              type specifies how an application views data stored in the AV, including how it may
              be accessed.  Valid values are:

       - FI_AV_MAP
              Addresses which are inserted into an AV are mapped to a native fabric  address  for
              use  by  the  application.  The use of FI_AV_MAP requires that an application store
              the returned fi_addr_t value that is associated with each  inserted  address.   The
              advantage  of  using  FI_AV_MAP  is  that  the returned fi_addr_t value may contain
              encoded address data, which is immediately available when processing data  transfer
              requests.   This  can  eliminate or reduce the number of memory lookups needed when
              initiating a transfer.  The disadvantage of FI_AV_MAP is  the  increase  in  memory
              usage needed to store the returned addresses.  Addresses are stored in the AV using
              a provider specific mechanism, including, but not limited to a tree, hash table, or
              maintained on the heap.

       - FI_AV_TABLE
              Addresses  which are inserted into an AV of type FI_AV_TABLE are accessible using a
              simple index.  Conceptually, the AV may be treated as an array of addresses, though
              the  provider may implement the AV using a variety of mechanisms.  When FI_AV_TABLE
              is used, the returned fi_addr_t is an index, with the index for an inserted address
              the  same  as  its  insertion order into the table.  The index of the first address
              inserted into an FI_AV_TABLE will be 0, and successive  insertions  will  be  given
              sequential  indices.  Sequential indices will be assigned across insertion calls on
              the same AV.

       - FI_AV_UNSPEC
              Provider will choose its preferred AV type.  The AV  type  used  will  be  returned
              through the type field in fi_av_attr.

       Receive Context Bits (rx_ctx_bits)
              The  receive  context  bits  field  is  only  for  use with scalable endpoints.  It
              indicates the number of bits reserved in a returned fi_addr_t, which will  be  used
              to identify a specific target receive context.  See fi_rx_addr() and fi_endpoint(3)
              for additional details on receive contexts.  The requested number of bits should be
              selected such that 2 ^ rx_ctx_bits >= rx_ctx_cnt for the endpoint.

       count  Indicates  the expected number of addresses that will be inserted into the AV.  The
              provider uses this to optimize resource allocations.

       ep_per_node
              This field indicates the number  of  endpoints  that  will  be  associated  with  a
              specific  fabric,  or  network,  address.   If  the number of endpoints per node is
              unknown, this value should be set to 0.  The provider uses this value  to  optimize
              resource allocations.  For example, distributed, parallel applications may set this
              to the number of processes allocated per node, times the number of  endpoints  each
              process will open.

       name   An  optional  system  name  associated  with  the address vector to create or open.
              Address vectors may be shared across multiple processes which access the same named
              domain on the same node.  The name field allows the underlying provider to identify
              a shared AV.

       If the name field is non-NULL and the AV is not opened for read-only access,  a  named  AV
       will be created, if it does not already exist.

       map_addr
              The  map_addr determines the base fi_addr_t address that a provider should use when
              sharing an AV of type FI_AV_MAP between processes.  Processes that provide the same
              value  for  map_addr to a shared AV may use the same fi_addr_t values returned from
              an fi_av_insert call.

       The map_addr may be used by the provider to mmap memory allocated for a shared AV  between
       processes; however, the provider is not required to use the map_addr in this fashion.  The
       only requirement is that an fi_addr_t returned as part of  an  fi_av_insert  call  on  one
       process  is  usable  on  another  process  which  opens an AV of the same name at the same
       map_addr value.  The relationship between the map_addr and any returned fi_addr_t  is  not
       defined.

       If  name  is  non-NULL  and  map_addr is 0, then the map_addr used by the provider will be
       returned through the attribute structure.  The map_addr field is ignored if name is NULL.

       flags  The following flags may be used when opening an AV.

       - FI_EVENT
              When the flag FI_EVENT is specified, all insert operations on this  AV  will  occur
              asynchronously.  There will be one EQ error entry generated for each failed address
              insertion, followed by one non-error event indicating that the insertion  operation
              has completed.  There will always be one non-error completion event for each insert
              operation, even if all addresses fail.  The context field in all  completions  will
              be  the  context  specified  to  the  insert  call, and the data field in the final
              completion entry will report the number of addresses successfully inserted.  If  an
              error  occurs  during  the  asynchronous  insertion,  an  error completion entry is
              returned (see fi_eq(3) for a discussion of  the  fi_eq_err_entry  error  completion
              struct).   The  context  field of the error completion will be the context that was
              specified in the insert call; the data field will contain the index of  the  failed
              address.   There  will be one error completion returned for each address that fails
              to insert into the AV.

       If an AV is opened with FI_EVENT, any insertions attempted before an EQ is bound to the AV
       will fail with -FI_ENOEQ.

       Error  completions  for  failed insertions will contain the index of the failed address in
       the index field of the error completion entry.

       Note that the order of delivery of insert completions may not match the order in which the
       calls  to  fi_av_insert were made.  The only guarantee is that all error completions for a
       given call to fi_av_insert will precede the single associated non-error completion.  • .RS
       2

       FI_READ
              Opens  an AV for read-only access.  An AV opened for read-only access must be named
              (name attribute specified), and the AV must exist.
       • .RS 2

       FI_SYMMETRIC
              Indicates that each node will be associated with the same number of endpoints,  the
              same  transport  addresses  will  be  allocated  on  each  node,  and the transport
              addresses will be sequential.  This feature  targets  distributed  applications  on
              large   fabrics   and  allows  for  highly-optimized  storage  of  remote  endpoint
              addressing.

   fi_close
       The fi_close call is used to release all resources  associated  with  an  address  vector.
       Note  that  any events queued on an event queue referencing the AV are left untouched.  It
       is recommended that callers retrieve all events associated with the AV before closing it.

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

   fi_av_bind
       Associates an event queue with the AV.  If an AV has been opened with  FI_EVENT,  then  an
       event  queue  must be bound to the AV before any insertion calls are attempted.  Any calls
       to insert addresses before an event queue has been bound will fail with -FI_ENOEQ.   Flags
       are reserved for future use and must be 0.

   fi_av_insert
       The  fi_av_insert call inserts zero or more addresses into an AV.  The number of addresses
       is specified through the count parameter.  The  addr  parameter  references  an  array  of
       addresses to insert into the AV.  Addresses inserted into an address vector must be in the
       same format as specified in the addr_format field of  the  fi_info  struct  provided  when
       opening  the  corresponding domain.  When using the FI_ADDR_STR format, the addr parameter
       should reference an array of strings (char **).

       For AV’s of type FI_AV_MAP, once inserted addresses have been mapped,  the  mapped  values
       are  written  into the buffer referenced by fi_addr.  The fi_addr buffer must remain valid
       until the AV insertion has completed and an event has  been  generated  to  an  associated
       event  queue.   The  value  of  the  returned  fi_addr  should be considered opaque by the
       application for AVs of type FI_AV_MAP.  The  returned  value  may  point  to  an  internal
       structure  or  a provider specific encoding of low-level addressing data, for example.  In
       the latter case, use of FI_AV_MAP may be able  to  avoid  memory  references  during  data
       transfer operations.

       For AV’s of type FI_AV_TABLE, addresses are placed into the table in order.  An address is
       inserted at the lowest index that corresponds to an unused table  location,  with  indices
       starting  at  0.   That  is,  the first address inserted may be referenced at index 0, the
       second at index 1, and so forth.  When addresses  are  inserted  into  an  AV  table,  the
       assigned  fi_addr  values will be simple indices corresponding to the entry into the table
       where the address was inserted.  Index values accumulate across successive insert calls in
       the order the calls are made, not necessarily in the order the insertions complete.

       Because insertions occur at a pre-determined index, the fi_addr parameter may be NULL.  If
       fi_addr is non-NULL, it must reference an array of fi_addr_t, and the buffer  must  remain
       valid  until  the  insertion  operation  completes.   Note  that  if  fi_addr  is NULL and
       synchronous operation is requested without using FI_SYNC_ERR  flag,  individual  insertion
       failures cannot be reported and the application must use other calls, such as fi_av_lookup
       to learn which specific addresses failed  to  insert.   Since  fi_av_remove  is  provider-
       specific,  it  is  recommended that calls to fi_av_insert following a call to fi_av_remove
       always reference a valid buffer in the fi_addr parameter.  Otherwise it may  be  difficult
       to determine what the next assigned index will be.

       flags  The   following   flag   may   be  passed  to  AV  insertion  calls:  fi_av_insert,
              fi_av_insertsvc, or fi_av_insertsym.

       - FI_MORE
              In order to allow optimized address insertion,  the  application  may  specify  the
              FI_MORE  flag to the insert call to give a hint to the provider that more insertion
              requests will follow, allowing the provider  to  aggregate  insertion  requests  if
              desired.   An  application may make any number of insertion calls with FI_MORE set,
              provided that they are  followed  by  an  insertion  call  without  FI_MORE.   This
              signifies  to the provider that the insertion list is complete.  Providers are free
              to ignore FI_MORE.

       - FI_SYNC_ERR
              This flag applies to synchronous insertions only, and is  used  to  retrieve  error
              details  of  failed  insertions.   If set, the context parameter of insertion calls
              references an array of integers, with context set to address of the  first  element
              of  the  array.   The resulting status of attempting to insert each address will be
              written to the corresponding array location.  Successful insertions will be updated
              to 0.  Failures will contain a fabric errno code.

       - FI_AV_USER_ID
              This flag associates a user-assigned identifier with each AV entry that is returned
              with any completion entry in place of the AV’s address.  See the  user  ID  section
              below.

   fi_av_insertsvc
       The  fi_av_insertsvc  call  behaves similar to fi_av_insert, but allows the application to
       specify the node and service names, similar to  the  fi_getinfo  inputs,  rather  than  an
       encoded  address.   The node and service parameters are defined the same as fi_getinfo(3).
       Node should be a string that corresponds to a hostname or network  address.   The  service
       string  corresponds  to a textual representation of a transport address.  Applications may
       also pass in an FI_ADDR_STR formatted address as the node parameter.  In such  cases,  the
       service  parameter  must  be  NULL.   See  fi_getinfo.3  for details on using FI_ADDR_STR.
       Supported flags are the same as for fi_av_insert.

   fi_av_insertsym
       fi_av_insertsym performs a symmetric insert that  inserts  a  sequential  range  of  nodes
       and/or  service  addresses  into  an  AV.   The  svccnt  parameter indicates the number of
       transport (endpoint) addresses to insert into the AV  for  each  node  address,  with  the
       service parameter specifying the starting transport address.  Inserted transport addresses
       will be of the range {service, service + svccnt - 1}, inclusive.   All  service  addresses
       for a node will be inserted before the next node is inserted.

       The  nodecnt parameter indicates the number of node (network) addresses to insert into the
       AV, with the node parameter specifying the starting node address.  Inserted node addresses
       will  be  of  the  range  {node, node + nodecnt - 1}, inclusive.  If node is a non-numeric
       string, such as a hostname, it must contain a numeric suffix if nodecnt > 1.

       As an example, if node = “10.1.1.1”, nodecnt = 2, service = “5000”, and svccnt  =  2,  the
       following  addresses  will  be  inserted  into  the  AV in the order shown: 10.1.1.1:5000,
       10.1.1.1:5001, 10.1.1.2:5000, 10.1.1.2:5001.   If  node  were  replaced  by  the  hostname
       “host10”, the addresses would be: host10:5000, host10:5001, host11:5000, host11:5001.

       The total number of inserted addresses will be nodecnt x svccnt.

       Supported flags are the same as for fi_av_insert.

   fi_av_remove
       fi_av_remove  removes a set of addresses from an address vector.  All resources associated
       with the indicated addresses are released.   The  removed  address  -  either  the  mapped
       address  (in  the  case  of  FI_AV_MAP)  or  index  (FI_AV_TABLE) - is invalid until it is
       returned again by a new fi_av_insert.

       The behavior of operations in progress that reference the removed addresses is undefined.

       The use of fi_av_remove is an optimization  that  applications  may  use  to  free  memory
       allocated  with  addresses  that  will  no longer be accessed.  Inserted addresses are not
       required to be removed.  fi_av_close will automatically cleanup any  resources  associated
       with addresses remaining in the AV when it is invoked.

       Flags are reserved for future use and must be 0.

   fi_av_lookup
       This  call  returns the address stored in the address vector that corresponds to the given
       fi_addr.  The returned address is the same format as those stored by the  AV.   On  input,
       the  addrlen parameter should indicate the size of the addr buffer.  If the actual address
       is larger than what can fit into the buffer, it will be truncated.  On output, addrlen  is
       set  to  the  size of the buffer needed to store the address, which may be larger than the
       input value.

   fi_rx_addr
       This function is used to convert an endpoint address, returned by  fi_av_insert,  into  an
       address  that  specifies  a  target receive context.  The specified fi_addr parameter must
       either be a value returned from fi_av_insert, in the case of FI_AV_MAP, or  an  index,  in
       the  case  of  FI_AV_TABLE.  The value for rx_ctx_bits must match that specified in the AV
       attributes for the given address.

       Connected endpoints that support multiple receive contexts, but are  not  associated  with
       address vectors should specify FI_ADDR_NOTAVAIL for the fi_addr parameter.

   fi_av_straddr
       The  fi_av_straddr  function  converts  the provided address into a printable string.  The
       specified address must be of the same format as those stored by the AV, though the address
       itself  is not required to have been inserted.  On input, the len parameter should specify
       the size of the buffer referenced by buf.  On output, addrlen is set to the  size  of  the
       buffer  needed  to store the address.  This size may be larger than the input len.  If the
       provided buffer is too small, the results will  be  truncated.   fi_av_straddr  returns  a
       pointer to buf.

NOTES

       An AV should only store a single instance of an address.  Attempting to insert a duplicate
       copy of the same address into an AV may result in undefined  behavior,  depending  on  the
       provider  implementation.  Providers are not required to check for duplicates, as doing so
       could incur significant overhead to the insertion process.  For portability,  applications
       may  need  to  track  which  peer addresses have been inserted into a given AV in order to
       avoid duplicate entries.  However, providers are required to support the removal, followed
       by the re-insertion of an address.  Only duplicate insertions are restricted.

       Providers  may implement AV’s using a variety of mechanisms.  Specifically, a provider may
       begin resolving inserted addresses as soon as they have been  added  to  an  AV,  even  if
       asynchronous  operation  has  been  specified.   Similarly,  a provider may lazily release
       resources from removed entries.

USER IDENTIFIERS FOR ADDRESSES

       As described above, endpoint addresses that are inserted into  an  AV  are  mapped  to  an
       fi_addr_t  value.   The fi_addr_t is used in data transfer APIs to specify the destination
       of an outbound transfer, in receive APIs to indicate the source for an  inbound  transfer,
       and  also  in  completion  events  to report the source address of inbound transfers.  The
       FI_AV_USER_ID capability bit and flag provide a mechanism by  which  the  fi_addr_t  value
       reported  by  a completion event is replaced with a user-specified value instead.  This is
       useful for applications that need to map the source address to their own data structure.

       Support for FI_AV_USER_ID is provider specific, as it may not be feasible for  a  provider
       to  implement  this support without significant overhead.  For example, some providers may
       need to add a reverse lookup mechanism.  This feature may be unavailable if shared AVs are
       requested,  or  negatively  impact  the  per process memory footprint if implemented.  For
       providers that do not support FI_AV_USER_ID,  users  may  be  able  to  trade  off  lookup
       processing  with  protocol  overhead,  by  carrying source identification within a message
       header.

       User-specified  fi_addr_t   values   are   provided   as   part   of   address   insertion
       (e.g. fi_av_insert)  through  the  fi_addr  parameter.   The  fi_addr  parameter  acts  as
       input/output in this case.  When the FI_AV_USER_ID flag is passed to  any  of  the  insert
       calls,  the  caller  must  specify  an  fi_addr_t  identifier value to associate with each
       address.  The provider will record that identifier and use it where required  as  part  of
       any  completion event.  Note that the output from the AV insertion call is unchanged.  The
       provider will return an fi_addr_t value that maps to each address, and that value must  be
       used for all data transfer operations.

RETURN VALUES

       Insertion  calls  for  an  AV  opened  for synchronous operation will return the number of
       addresses that were successfully inserted.  In the case of failure, the return value  will
       be less than the number of addresses that was specified.

       Insertion calls for an AV opened for asynchronous operation (with FI_EVENT flag specified)
       will return 0 if the operation was successfully initiated.  In  the  case  of  failure,  a
       negative  fabric  errno  will  be  returned.   Providers  are  allowed  to abort insertion
       operations in the case of an error.  Addresses that are not  inserted  because  they  were
       aborted will fail with an error code of FI_ECANCELED.

       In both the synchronous and asynchronous modes of operation, the fi_addr buffer associated
       with a failed or aborted insertion will be set to FI_ADDR_NOTAVAIL.

       All other calls return 0 on success, or a negative value corresponding to fabric errno  on
       error.  Fabric errno values are defined in rdma/fi_errno.h.

SEE ALSO

       fi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_eq(3)

AUTHORS

       OpenFabrics.