1fi_av(3)                       Libfabric v1.15.1                      fi_av(3)
2
3
4

NAME

6       fi_av - Address vector operations
7
8       fi_av_open / fi_close
9              Open or close an address vector
10
11       fi_av_bind
12              Associate an address vector with an event queue.
13
14       fi_av_insert / fi_av_insertsvc / fi_av_remove
15              Insert/remove an address into/from the address vector.
16
17       fi_av_lookup
18              Retrieve an address stored in the address vector.
19
20       fi_av_straddr
21              Convert an address into a printable string.
22

SYNOPSIS

24              #include <rdma/fi_domain.h>
25
26              int fi_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
27                  struct fid_av **av, void *context);
28
29              int fi_close(struct fid *av);
30
31              int fi_av_bind(struct fid_av *av, struct fid *eq, uint64_t flags);
32
33              int fi_av_insert(struct fid_av *av, void *addr, size_t count,
34                  fi_addr_t *fi_addr, uint64_t flags, void *context);
35
36              int fi_av_insertsvc(struct fid_av *av, const char *node,
37                  const char *service, fi_addr_t *fi_addr, uint64_t flags,
38                  void *context);
39
40              int fi_av_insertsym(struct fid_av *av, const char *node,
41                  size_t nodecnt, const char *service, size_t svccnt,
42                  fi_addr_t *fi_addr, uint64_t flags, void *context);
43
44              int fi_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
45                  uint64_t flags);
46
47              int fi_av_lookup(struct fid_av *av, fi_addr_t fi_addr,
48                  void *addr, size_t *addrlen);
49
50              fi_addr_t fi_rx_addr(fi_addr_t fi_addr, int rx_index,
51                    int rx_ctx_bits);
52
53              const char * fi_av_straddr(struct fid_av *av, const void *addr,
54                    char *buf, size_t *len);
55

ARGUMENTS

57       domain Resource domain
58
59       av     Address vector
60
61       eq     Event queue
62
63       attr   Address vector attributes
64
65       context
66              User specified context associated with the address vector or in‐
67              sert operation.
68
69       addr   Buffer containing one or more addresses to insert  into  address
70              vector.
71
72       addrlen
73              On input, specifies size of addr buffer.  On output, stores num‐
74              ber of bytes written to addr buffer.
75
76       fi_addr
77              For insert, a reference to an array where  returned  fabric  ad‐
78              dresses  will  be  written.   For remove, one or more fabric ad‐
79              dresses to remove.
80
81       count  Number of addresses to insert/remove from an AV.
82
83       flags  Additional flags to apply to the operation.
84

DESCRIPTION

86       Address vectors are used to map higher level addresses,  which  may  be
87       more natural for an application to use, into fabric specific addresses.
88       The mapping of addresses is fabric and provider specific, but  may  in‐
89       volve  lengthy  address resolution and fabric management protocols.  AV
90       operations are synchronous by default, but may be set to operate  asyn‐
91       chronously  by  specifying  the  FI_EVENT flag to fi_av_open.  When re‐
92       questing asynchronous operation, the application  must  first  bind  an
93       event  queue  to the AV before inserting addresses.  See the NOTES sec‐
94       tion for AV restrictions on duplicate addresses.
95
96   fi_av_open
97       fi_av_open allocates or opens an address vector.   The  properties  and
98       behavior of the address vector are defined by struct fi_av_attr.
99
100              struct fi_av_attr {
101                  enum fi_av_type  type;        /* type of AV */
102                  int              rx_ctx_bits; /* address bits to identify rx ctx */
103                  size_t           count;       /* # entries for AV */
104                  size_t           ep_per_node; /* # endpoints per fabric address */
105                  const char       *name;       /* system name of AV */
106                  void             *map_addr;   /* base mmap address */
107                  uint64_t         flags;       /* operation flags */
108              };
109
110       type   An  AV type corresponds to a conceptual implementation of an ad‐
111              dress vector.  The type specifies how an application views  data
112              stored  in the AV, including how it may be accessed.  Valid val‐
113              ues are:
114
115       - FI_AV_MAP
116              Addresses which are inserted into an AV are mapped to  a  native
117              fabric address for use by the application.  The use of FI_AV_MAP
118              requires that an application store the returned fi_addr_t  value
119              that is associated with each inserted address.  The advantage of
120              using FI_AV_MAP is that the returned fi_addr_t value may contain
121              encoded  address  data, which is immediately available when pro‐
122              cessing data transfer requests.  This can  eliminate  or  reduce
123              the  number of memory lookups needed when initiating a transfer.
124              The disadvantage of FI_AV_MAP is the increase  in  memory  usage
125              needed to store the returned addresses.  Addresses are stored in
126              the AV using a provider specific mechanism, including,  but  not
127              limited to a tree, hash table, or maintained on the heap.
128
129       - FI_AV_TABLE
130              Addresses  which are inserted into an AV of type FI_AV_TABLE are
131              accessible using a simple index.  Conceptually, the  AV  may  be
132              treated as an array of addresses, though the provider may imple‐
133              ment the AV using a variety of mechanisms.  When FI_AV_TABLE  is
134              used,  the returned fi_addr_t is an index, with the index for an
135              inserted address the same as its insertion order into the table.
136              The index of the first address inserted into an FI_AV_TABLE will
137              be 0, and successive insertions will  be  given  sequential  in‐
138              dices.   Sequential  indices  will  be assigned across insertion
139              calls on the same AV.
140
141       - FI_AV_UNSPEC
142              Provider will choose its preferred AV type.  The  AV  type  used
143              will be returned through the type field in fi_av_attr.
144
145       Receive Context Bits (rx_ctx_bits)
146              The  receive  context  bits  field is only for use with scalable
147              endpoints.  It indicates the number of bits reserved  in  a  re‐
148              turned fi_addr_t, which will be used to identify a specific tar‐
149              get receive context.  See fi_rx_addr()  and  fi_endpoint(3)  for
150              additional details on receive contexts.  The requested number of
151              bits should be selected such that 2 ^ rx_ctx_bits >=  rx_ctx_cnt
152              for the endpoint.
153
154       count  Indicates the expected number of addresses that will be inserted
155              into the AV.  The provider uses this to optimize resource  allo‐
156              cations.
157
158       ep_per_node
159              This  field indicates the number of endpoints that will be asso‐
160              ciated with a specific fabric, or network, address.  If the num‐
161              ber  of  endpoints per node is unknown, this value should be set
162              to 0.  The provider uses this value to optimize resource alloca‐
163              tions.   For example, distributed, parallel applications may set
164              this to the number of processes allocated per  node,  times  the
165              number of endpoints each process will open.
166
167       name   An  optional  system  name associated with the address vector to
168              create or open.  Address vectors may be shared  across  multiple
169              processes  which  access the same named domain on the same node.
170              The name field allows the  underlying  provider  to  identify  a
171              shared AV.
172
173       If  the  name  field is non-NULL and the AV is not opened for read-only
174       access, a named AV will be created, if it does not already exist.
175
176       map_addr
177              The map_addr  determines  the  base  fi_addr_t  address  that  a
178              provider should use when sharing an AV of type FI_AV_MAP between
179              processes.  Processes that provide the same value  for  map_addr
180              to  a  shared AV may use the same fi_addr_t values returned from
181              an fi_av_insert call.
182
183       The map_addr may be used by the provider to mmap memory allocated for a
184       shared  AV  between processes; however, the provider is not required to
185       use the map_addr in this fashion.  The  only  requirement  is  that  an
186       fi_addr_t  returned  as  part of an fi_av_insert call on one process is
187       usable on another process which opens an AV of the  same  name  at  the
188       same map_addr value.  The relationship between the map_addr and any re‐
189       turned fi_addr_t is not defined.
190
191       If name is non-NULL and map_addr is 0, then the map_addr  used  by  the
192       provider will be returned through the attribute structure.  The map_ad‐
193       dr field is ignored if name is NULL.
194
195       flags  The following flags may be used when opening an AV.
196
197       - FI_EVENT
198              When the flag FI_EVENT is specified, all  insert  operations  on
199              this  AV  will occur asynchronously.  There will be one EQ error
200              entry generated for each failed address insertion,  followed  by
201              one  non-error event indicating that the insertion operation has
202              completed.  There will always be one non-error completion  event
203              for each insert operation, even if all addresses fail.  The con‐
204              text field in all completions will be the context  specified  to
205              the  insert call, and the data field in the final completion en‐
206              try will report the number of addresses  successfully  inserted.
207              If  an  error occurs during the asynchronous insertion, an error
208              completion entry is returned (see fi_eq(3) for a  discussion  of
209              the fi_eq_err_entry error completion struct).  The context field
210              of the error completion will be the context that  was  specified
211              in the insert call; the data field will contain the index of the
212              failed address.  There will be one error completion returned for
213              each address that fails to insert into the AV.
214
215       If an AV is opened with FI_EVENT, any insertions attempted before an EQ
216       is bound to the AV will fail with -FI_ENOEQ.
217
218       Error completions for failed insertions will contain the index  of  the
219       failed address in the index field of the error completion entry.
220
221       Note that the order of delivery of insert completions may not match the
222       order in which the calls to fi_av_insert were made.  The only guarantee
223       is  that  all  error  completions for a given call to fi_av_insert will
224       precede the single associated non-error completion.  • .RS 2
225
226       FI_READ
227              Opens an AV for read-only access.  An AV  opened  for  read-only
228              access must be named (name attribute specified), and the AV must
229              exist.
230       • .RS 2
231
232       FI_SYMMETRIC
233              Indicates that each node will be associated with the same number
234              of  endpoints, the same transport addresses will be allocated on
235              each node, and the transport addresses will be sequential.  This
236              feature  targets  distributed  applications on large fabrics and
237              allows for highly-optimized storage of remote endpoint  address‐
238              ing.
239
240   fi_close
241       The  fi_close  call is used to release all resources associated with an
242       address vector.  Note that any events queued on an event  queue  refer‐
243       encing  the  AV are left untouched.  It is recommended that callers re‐
244       trieve all events associated with the AV before closing it.
245
246       When closing the address vector, there must be no opened endpoints  as‐
247       sociated  with  the  AV.  If resources are still associated with the AV
248       when attempting to close, the call will return -FI_EBUSY.
249
250   fi_av_bind
251       Associates an event queue with the AV.  If an AV has been  opened  with
252       FI_EVENT, then an event queue must be bound to the AV before any inser‐
253       tion calls are attempted.  Any calls  to  insert  addresses  before  an
254       event  queue  has  been  bound will fail with -FI_ENOEQ.  Flags are re‐
255       served for future use and must be 0.
256
257   fi_av_insert
258       The fi_av_insert call inserts zero or more addresses into an  AV.   The
259       number of addresses is specified through the count parameter.  The addr
260       parameter references an array of addresses to insert into the AV.   Ad‐
261       dresses  inserted  into an address vector must be in the same format as
262       specified in the addr_format field of the fi_info struct provided  when
263       opening  the  corresponding domain.  When using the FI_ADDR_STR format,
264       the addr parameter should reference an array of strings (char **).
265
266       For AV’s of type FI_AV_MAP, once inserted addresses have  been  mapped,
267       the  mapped  values  are written into the buffer referenced by fi_addr.
268       The fi_addr buffer must remain valid until the AV  insertion  has  com‐
269       pleted  and  an  event has been generated to an associated event queue.
270       The value of the returned fi_addr should be considered  opaque  by  the
271       application for AVs of type FI_AV_MAP.  The returned value may point to
272       an internal structure or a provider specific encoding of low-level  ad‐
273       dressing  data,  for example.  In the latter case, use of FI_AV_MAP may
274       be able to avoid memory references during data transfer operations.
275
276       For AV’s of type FI_AV_TABLE, addresses are placed into  the  table  in
277       order.   An address is inserted at the lowest index that corresponds to
278       an unused table location, with indices starting at  0.   That  is,  the
279       first  address inserted may be referenced at index 0, the second at in‐
280       dex 1, and so forth.  When addresses are inserted into an AV table, the
281       assigned fi_addr values will be simple indices corresponding to the en‐
282       try into the table where the address was inserted.  Index values  accu‐
283       mulate  across successive insert calls in the order the calls are made,
284       not necessarily in the order the insertions complete.
285
286       Because insertions occur at a pre-determined index, the fi_addr parame‐
287       ter may be NULL.  If fi_addr is non-NULL, it must reference an array of
288       fi_addr_t, and the buffer must remain valid until the insertion  opera‐
289       tion completes.  Note that if fi_addr is NULL and synchronous operation
290       is requested without using FI_SYNC_ERR flag, individual insertion fail‐
291       ures  cannot be reported and the application must use other calls, such
292       as fi_av_lookup to learn which specific  addresses  failed  to  insert.
293       Since  fi_av_remove  is provider-specific, it is recommended that calls
294       to fi_av_insert following a call to  fi_av_remove  always  reference  a
295       valid  buffer  in the fi_addr parameter.  Otherwise it may be difficult
296       to determine what the next assigned index will be.
297
298       flags  The  following  flag  may  be  passed  to  AV  insertion  calls:
299              fi_av_insert, fi_av_insertsvc, or fi_av_insertsym.
300
301       - FI_MORE
302              In  order  to allow optimized address insertion, the application
303              may specify the FI_MORE flag to the insert call to give  a  hint
304              to the provider that more insertion requests will follow, allow‐
305              ing the provider to aggregate insertion requests if desired.  An
306              application  may make any number of insertion calls with FI_MORE
307              set, provided that they are followed by an insertion call  with‐
308              out  FI_MORE.  This signifies to the provider that the insertion
309              list is complete.  Providers are free to ignore FI_MORE.
310
311       - FI_SYNC_ERR
312              This flag applies to synchronous insertions only, and is used to
313              retrieve  error  details of failed insertions.  If set, the con‐
314              text parameter of insertion calls references an array  of  inte‐
315              gers,  with  context  set to address of the first element of the
316              array.  The resulting status of attempting to  insert  each  ad‐
317              dress will be written to the corresponding array location.  Suc‐
318              cessful insertions will be updated to 0.  Failures will  contain
319              a fabric errno code.
320
321   fi_av_insertsvc
322       The  fi_av_insertsvc  call  behaves similar to fi_av_insert, but allows
323       the application to specify the node and service names, similar  to  the
324       fi_getinfo  inputs,  rather than an encoded address.  The node and ser‐
325       vice parameters are defined the same as fi_getinfo(3).  Node should  be
326       a  string  that corresponds to a hostname or network address.  The ser‐
327       vice string corresponds to a textual representation of a transport  ad‐
328       dress.   Applications may also pass in an FI_ADDR_STR formatted address
329       as the node parameter.  In such cases, the service  parameter  must  be
330       NULL.   See  fi_getinfo.3  for details on using FI_ADDR_STR.  Supported
331       flags are the same as for fi_av_insert.
332
333   fi_av_insertsym
334       fi_av_insertsym performs a symmetric insert that inserts  a  sequential
335       range of nodes and/or service addresses into an AV.  The svccnt parame‐
336       ter indicates the number of transport (endpoint)  addresses  to  insert
337       into  the AV for each node address, with the service parameter specify‐
338       ing the starting transport address.  Inserted transport addresses  will
339       be  of  the range {service, service + svccnt - 1}, inclusive.  All ser‐
340       vice addresses for a node will be inserted before the next node is  in‐
341       serted.
342
343       The  nodecnt parameter indicates the number of node (network) addresses
344       to insert into the AV, with the node parameter specifying the  starting
345       node address.  Inserted node addresses will be of the range {node, node
346       + nodecnt - 1}, inclusive.  If node is a non-numeric string, such as  a
347       hostname, it must contain a numeric suffix if nodecnt > 1.
348
349       As an example, if node = “10.1.1.1”, nodecnt = 2, service = “5000”, and
350       svccnt = 2, the following addresses will be inserted into the AV in the
351       order     shown:     10.1.1.1:5000,    10.1.1.1:5001,    10.1.1.2:5000,
352       10.1.1.2:5001.  If node were replaced by the hostname “host10”, the ad‐
353       dresses would be: host10:5000, host10:5001, host11:5000, host11:5001.
354
355       The total number of inserted addresses will be nodecnt x svccnt.
356
357       Supported flags are the same as for fi_av_insert.
358
359   fi_av_remove
360       fi_av_remove  removes  a  set of addresses from an address vector.  All
361       resources associated with the indicated addresses  are  released.   The
362       removed  address - either the mapped address (in the case of FI_AV_MAP)
363       or index (FI_AV_TABLE) - is invalid until it is returned again by a new
364       fi_av_insert.
365
366       The  behavior  of operations in progress that reference the removed ad‐
367       dresses is undefined.
368
369       The use of fi_av_remove is an optimization that applications may use to
370       free  memory  allocated with addresses that will no longer be accessed.
371       Inserted addresses are not required to be  removed.   fi_av_close  will
372       automatically cleanup any resources associated with addresses remaining
373       in the AV when it is invoked.
374
375       Flags are reserved for future use and must be 0.
376
377   fi_av_lookup
378       This call returns the address stored in the address vector that  corre‐
379       sponds  to  the given fi_addr.  The returned address is the same format
380       as those stored by the AV.  On input, the addrlen parameter should  in‐
381       dicate  the  size  of the addr buffer.  If the actual address is larger
382       than what can fit into the buffer, it will be  truncated.   On  output,
383       addrlen  is  set to the size of the buffer needed to store the address,
384       which may be larger than the input value.
385
386   fi_rx_addr
387       This function is used to  convert  an  endpoint  address,  returned  by
388       fi_av_insert,  into an address that specifies a target receive context.
389       The specified fi_addr parameter must either be a  value  returned  from
390       fi_av_insert,  in  the  case  of FI_AV_MAP, or an index, in the case of
391       FI_AV_TABLE.  The value for rx_ctx_bits must match  that  specified  in
392       the AV attributes for the given address.
393
394       Connected endpoints that support multiple receive contexts, but are not
395       associated with address vectors should specify FI_ADDR_NOTAVAIL for the
396       fi_addr parameter.
397
398   fi_av_straddr
399       The  fi_av_straddr function converts the provided address into a print‐
400       able string.  The specified address must be of the same format as those
401       stored  by  the  AV,  though the address itself is not required to have
402       been inserted.  On input, the len parameter should specify the size  of
403       the buffer referenced by buf.  On output, addrlen is set to the size of
404       the buffer needed to store the address.  This size may be  larger  than
405       the  input  len.  If the provided buffer is too small, the results will
406       be truncated.  fi_av_straddr returns a pointer to buf.
407

NOTES

409       An AV should only store a single instance of an address.  Attempting to
410       insert  a  duplicate  copy of the same address into an AV may result in
411       undefined  behavior,  depending   on   the   provider   implementation.
412       Providers  are  not required to check for duplicates, as doing so could
413       incur significant overhead to the insertion process.  For  portability,
414       applications  may need to track which peer addresses have been inserted
415       into a  given  AV  in  order  to  avoid  duplicate  entries.   However,
416       providers  are  required to support the removal, followed by the re-in‐
417       sertion of an address.  Only duplicate insertions are restricted.
418
419       Providers may implement AV’s using a variety of  mechanisms.   Specifi‐
420       cally,  a  provider  may  begin resolving inserted addresses as soon as
421       they have been added to an AV, even if asynchronous operation has  been
422       specified.  Similarly, a provider may lazily release resources from re‐
423       moved entries.
424

RETURN VALUES

426       Insertion calls for an AV opened for synchronous operation will  return
427       the  number  of addresses that were successfully inserted.  In the case
428       of failure, the return value will be less than the number of  addresses
429       that was specified.
430
431       Insertion  calls  for  an  AV  opened  for asynchronous operation (with
432       FI_EVENT flag specified) will return 0 if the operation was successful‐
433       ly  initiated.  In the case of failure, a negative fabric errno will be
434       returned.  Providers are allowed to abort insertion operations  in  the
435       case  of  an  error.  Addresses that are not inserted because they were
436       aborted will fail with an error code of FI_ECANCELED.
437
438       In both the synchronous and asynchronous modes of operation, the fi_ad‐
439       dr  buffer associated with a failed or aborted insertion will be set to
440       FI_ADDR_NOTAVAIL.
441
442       All other calls return 0 on success, or a negative value  corresponding
443       to  fabric  errno  on  error.   Fabric  errno values are defined in rd‐
444       ma/fi_errno.h.
445

SEE ALSO

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

AUTHORS

450       OpenFabrics.
451
452
453
454Libfabric Programmer’s Manual     2022-01-22                          fi_av(3)
Impressum