|
NAMEfi_av - Address vector operations
SYNOPSIS
ARGUMENTS
DESCRIPTIONAddress vectors are used to map higher level addresses, which may be more natural for an application to use, into fabric specific addresses. The mapping of addresses 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.fi_av_openfi_av_open allocates or opens an address vector. The properties and behavior of the address vector are defined by struct fi_av_attr.
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.
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.
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
• .RS 2
fi_closeThe 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_bindAssociates 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_insertThe 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.
fi_av_insertsvcThe 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_insertsymfi_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_removefi_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_lookupThis 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_addrThis 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_straddrThe 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.NOTESProviders 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.RETURN VALUESInsertion 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 ALSOfi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_eq(3)AUTHORSOpenFabrics.
Visit the GSP FreeBSD Man Page Interface. |