Initial commit of master's thesis
This is the version I submitted to RWTH Aachen University at November 9, 2018.
This commit is contained in:
17
scripts/Makefile
Normal file
17
scripts/Makefile
Normal file
@@ -0,0 +1,17 @@
|
||||
BUILDDIR = build
|
||||
SRCS = ib_verbs.py rdma_cm_verbs.py nodetype_functions.py
|
||||
TEXS = $(patsubst %.py, $(BUILDDIR)/%.tex, $(SRCS))
|
||||
|
||||
all: ${BUILDDIR} $(TEXS)
|
||||
|
||||
$(BUILDDIR)/%.tex: %.py dict_to_table.py
|
||||
./$<
|
||||
mv $*.tex $(BUILDDIR)
|
||||
|
||||
${BUILDDIR}:
|
||||
mkdir -p ${BUILDDIR}
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)
|
||||
|
||||
.PHONY: clean
|
42
scripts/dict_to_table.py
Normal file
42
scripts/dict_to_table.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import os, errno
|
||||
|
||||
def print_file(dictionary, label, caption, anchor):
|
||||
label = label.replace(".py", "")
|
||||
file_loc = label + ".tex"
|
||||
path = open(file_loc, 'w')
|
||||
|
||||
path.write("{\\linespread{0.8}\\selectfont\\centering")
|
||||
path.write("\\begin{longtable}[ht!]{ p{15.2cm} }")
|
||||
path.write("\\caption{" + caption + "}")
|
||||
path.write("\\label{tab:" + label + "}")
|
||||
path.write("\\vspace{3mm}")
|
||||
|
||||
path.write("\\phantomsection\\belowpdfbookmark{")
|
||||
path.write(sorted(dictionary.items())[0][0].replace("_","\_"))
|
||||
path.write("}{verbs_" + str(anchor) + "}")
|
||||
path.write("\\endfirsthead")
|
||||
path.write("\\endhead")
|
||||
|
||||
for i, (key, value) in enumerate(sorted(dictionary.items())):
|
||||
name = key.replace("_", "\_")
|
||||
template = value[0].replace(key.split()[0], \
|
||||
"\\textbf{\\underline{" + key.split()[0] + "}}").replace("_", "\_")
|
||||
description = value[1]
|
||||
|
||||
path.write("\\Tstrut")
|
||||
path.write("{\\footnotesize\n")
|
||||
path.write("\\textbf{\colorbox{table_gray}{\parbox{15.0cm}{\\texttt{")
|
||||
path.write(template)
|
||||
path.write("}}}}\\vspace{1.8mm}\\newline\n")
|
||||
path.write("" + description + "}\n")
|
||||
path.write("\\newline\n")
|
||||
path.write("\\Bstrut")
|
||||
|
||||
if i != len(dictionary) - 1:
|
||||
path.write("\\phantomsection\\belowpdfbookmark{")
|
||||
path.write(sorted(dictionary.items())[i+1][0].replace("_", "\_"))
|
||||
path.write("}{verbs_" + str(anchor + i + 1) + "}")
|
||||
|
||||
path.write("\\tabularnewline\n")
|
||||
|
||||
path.write("\\end{longtable}}")
|
120
scripts/ib_verbs.py
Executable file
120
scripts/ib_verbs.py
Executable file
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env python3
|
||||
import dict_to_table as dtt
|
||||
from sys import argv
|
||||
|
||||
caption = "\\gls{ib} verbs"
|
||||
|
||||
ibverbs = {'ibv_fork_init':['int ibv_fork_init(void)','Initializes the data structure to handle \\texttt{fork()} safely.'],
|
||||
|
||||
'ibv_get_device_list':['struct ibv_device ** ibv_get_device_list(int *num_devices)','Returns a list, including name and other properties, of devices in the system that support the IB verbs.'],
|
||||
|
||||
'ibv_free_device_list':['void ibv_free_device_list(struct ibv_device **list)','Frees the list that was previously returned by \\texttt{ibv\_get\_device\_list().}'],
|
||||
|
||||
'ibv_get_device_name':['const char * ibv_get_device_name(struct ibv_device *device)','Returns a pointer to the name of a device returned by \\texttt{ibv\_get\_device\_list()}.'],
|
||||
|
||||
'ibv_get_device_guid':['uint64_t ibv_get_device_guid(struct ibv_device *device)','Returns the 64-bit \\gls{guid} of a device returned by \\texttt{ibv\_get\_device\_list()}.'],
|
||||
|
||||
'ibv_open_device':['struct ibv_context * ibv_open_device(struct ibv_device *device)','Opens a device returned by \\texttt{ibv\_get\_device\_list()} and returns a context that can be used with all verbs that directly modify the device.'],
|
||||
|
||||
'ibv_close_device':['int ibv_close_device(struct ibv_context *context)','Closes the context that was opened by \\texttt{ibv\_open\_device()}.'],
|
||||
|
||||
'ibv_node_type_str':['const char * ibv_node_type_str (enum ibv_node_type node_type)','Returns the type of the device: \\gls{hca}, switch, router, \\gls{rdma} enabled \\gls{nic}, or unknown.'],
|
||||
|
||||
'ibv_port_state_str':['const char * ibv_port_state_str (enum ibv_port_state port_state)','Returns a string that describes the enumeration \\texttt{port\_state}.'],
|
||||
|
||||
'ibv_query_device':['int ibv_query_device(struct ibv_context *context, struct ibv_device_attr *device_attr)','Retrieves an extensive list of attributes of a device, e.g., maximum \\gls{mr} size, maximum number of \\glspl{qp}, maximum number of \\glspl{cq}, vendor ID, node and system image \\gls{guid}, and hardware version.'],
|
||||
|
||||
'ibv_query_port':['int ibv_query_port(struct ibv_context *context, uint8_t port_num, struct ibv_port_attr *port_attr)','Retrieves and extensive list of attributes of a port, e.g., maximum \\gls{mtu} and message size.'],
|
||||
|
||||
'ibv_query_gid':['int ibv_query_gid(struct ibv_context *context, uint8_t port_num, int index, union ibv_gid *gid)','Retrieves an entry from the port\'s \\gls{gid} table.'],
|
||||
|
||||
'ibv_query_pkey':['int ibv_query_pkey(struct ibv_context *context, uint8_t port_num, int index, uint16_t *pkey)','Retrieves an entry from the port\'s partition key table.'],
|
||||
|
||||
'ibv_alloc_pd':['struct ibv_pd * ibv_alloc_pd(struct ibv_context *context)','Allocates a \\acrfull{pd} for the given context.'],
|
||||
|
||||
'ibv_dealloc_pd':['int ibv_dealloc_pd(struct ibv_pd *pd)','Deallocates a \\acrfull{pd}. Fails if objects are still associated with the given \\gls{pd}.'],
|
||||
|
||||
'ibv_create_cq':['struct ibv_cq * ibv_create_cq(struct ibv_context *context, int cqe, void *cq_context, struct ibv_comp_channel *channel, int comp_vector)', 'Creates a \\acrfull{cq}. The variable \\texttt{cq\_context} is user defined and is returned as parameter in \\texttt{ibv\_get\_cq\_event()} if a \\acrfull{cc} is used.'],
|
||||
|
||||
'ibv_resize_cq':['int ibv_resize_cq(struct ibv_cq *cq, int cqe)', 'Resizes the \\acrfull{cq}. The new size must be bigger than the number of \\glspl{cqe} present in the \\gls{cq}.'],
|
||||
|
||||
'ibv_destroy_cq':['int ibv_destroy_cq(struct ibv_cq *cq)', 'Destroys an \\acrfull{cq}. This will only succeed if no more \\gls{qp} is associated with the \\gls{cq}.'],
|
||||
|
||||
'ibv_create_comp_channel':['struct ibv_comp_channel *ibv_create_comp_channel(struct ibv_context *context)', 'Creates a new, unbound \\acrfull{cc}.'],
|
||||
|
||||
'ibv_destroy_comp_channel':['int ibv_destroy_comp_channel(struct ibv_comp_channel *channel)', 'Destroys an \\acrfull{cc}. This will only succeed if no more \\gls{cq} is associated with the \\gls{cc}.'],
|
||||
|
||||
'ibv_reg_mr':['struct ibv_mr * ibv_reg_mr(struct ibv_pd *pd, void *addr, size_t length, enum ibv_access_flags access)', 'Registers a \\acrfull{mr} associated with a \\gls{pd}. The returned struct \\texttt{ibv\_mr} contains the local and remote key.'],
|
||||
|
||||
'ibv_dereg_mr':['int ibv_dereg_mr(struct ibv_mr *mr)', 'Destroys a \\acrfull{mr}. This will only succeed if no more \\glspl{mw} are associated to the \\gls{mr}.'],
|
||||
|
||||
'ibv_create_qp':['struct ibv_qp * ibv_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *qp_init_attr)', 'Creates a \\acrfull{qp} in the \\textit{reset} state. All desired initial attributes must be placed in \\texttt{*qp\_init\_attr}.'],
|
||||
|
||||
'ibv_destroy_qp':['int ibv_destroy_qp(struct ibv_qp *qp)', 'Destroys a \\acrfull{qp}.'],
|
||||
|
||||
'ibv_create_srq':['struct ibv_srq * ibv_create_srq(struct ibv_pd *pd, struct ibv_srq_init_attr *srq_init_attr)', 'Creates a \\acrfull{srq}. All desired initial attributes must be placed in \\texttt{*srq\_init\_attr}. An \\acrshort{srq} serves as \\gls{rq} for several \\glspl{qp} and must be passed to \\texttt{ibv\_create\_qp()} with \\texttt{*qp\_init\_attr}. It is used in order to save resources.'],
|
||||
|
||||
'ibv_modify_srq':['int ibv_modify_srq (struct ibv_srq *srq, struct ibv_srq_attr *srq_attr, int srq_attr_mask)', 'Modifies the attributes which are specified in the bitmask \\texttt{srq\_attr\_mask} with the values in \\texttt{*srq\_attr}.'],
|
||||
|
||||
'ibv_destroy_srq':['int ibv_destroy_srq(struct ibv_srq *srq)', 'Destroys a \\acrfull{srq}. This will only succeed if no more \\gls{qp} is associated with this \\acrfull{srq}.'],
|
||||
|
||||
'ibv_open_xrc_domain':['struct ibv_xrc_domain * ibv_open_xrc_domain(struct ibv_context *context, int fd, int oflag)', 'Opens and \\acrfull{xrc} domain for the device.'],
|
||||
|
||||
'ibv_create_xrc_srq':['struct ibv_srq * ibv_create_xrc_srq(struct ibv_pd *pd, struct ibv_xrc_domain *xrc_domain, struct ibv_cq *xrc_cq, struct ibv_srq_init_attr *srq_init_attr)', 'Creates an \\acrfull{xrc} \\acrfull{srq}.'],
|
||||
|
||||
'ibv_close_xrc_domain':['int ibv_close_xrc_domain(struct ibv_xrc_domain *d)', 'Closes an \\acrfull{xrc} domain. This will only succeed if no more \\gls{qp} or \\acrshort{srq} is associated with the \\acrshort{xrc}.'],
|
||||
|
||||
'ibv_create_xrc_rcv_qp':['int ibv_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr, uint32_t *xrc_rcv_qpn)', 'Creates an \\acrfull{xrc} \\acrfull{qp}.'],
|
||||
|
||||
'ibv_modify_xrc_rcv_qp':['int ibv_modify_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain, uint32_t xrc_qp_num, struct ibv_qp_attr *attr, int attr_mask)', 'Modifies the attributes which are specified in the bitmask \\texttt{attr\_mask} with the values in \\texttt{*attr}. The \\gls{qp} is then transitioned through \\textit{reset}$\\,\\to\\,$\\textit{init}$\\,\\to\\,$\\textit{started}.'],
|
||||
|
||||
'ibv_reg_xrc_rcv_qp':['int ibv_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain, uint32_t xrc_qp_num)', 'Registers a user process with the defined \\acrfull{xrc} receive \\acrfull{qp}.'],
|
||||
|
||||
'ibv_unreg_xrc_rcv_qp':['int ibv_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain, uint32_t xrc_qp_num)', 'Unregisters a user process from the defined \\acrfull{xrc} receive \\acrfull{qp}.'],
|
||||
|
||||
'ibv_create_ah':['struct ibv_ah *ibv_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr)', 'Creates an \\acrfull{ah} out of \\gls{ah} attributes. These can be manually created or acquired via \\texttt{rdma\_get\_cm\_event()}.'],
|
||||
|
||||
'ibv_destroy_ah':['int ibv_destroy_ah(struct ibv_ah *ah)', 'Destroys an \\acrfull{ah}.'],
|
||||
|
||||
'ibv_modify_qp':['int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, enum ibv_qp_attr_mask attr_mask)', 'Modifies the attributes and the state of a \\acrfull{qp}. Attribute changes and transitions are subject to strict rules that can be found in~\\cite{mellanox2015RDMA} and~\\cite{infinibandvol1}.'],
|
||||
|
||||
'ibv_query_qp':['int ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, enum ibv_qp_attr_mask attr_mask, struct ibv_qp_init_attr *init_attr)', 'Retrieves the attributes which are specified in the bitmask \\texttt{attr\_mask} from the \\acrfull{qp}.'],
|
||||
|
||||
'ibv_query_srq':['int ibv_query_srq(struct ibv_srq *srq, struct ibv_srq_attr *srq_attr)', 'Similar to \\texttt{ibv\_query\_qp()}, but for a \\acrfull{srq}.'],
|
||||
|
||||
'ibv_query_xrc_rcv_qp':['int ibv_query_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain, uint32_t xrc_qp_num, struct ibv_qp_attr *attr, int attr_mask, struct ibv_qp_init_attr *init_attr)', 'Similar to \\texttt{ibv\_query\_qp()}, but for an \\acrfull{xrc}.'],
|
||||
|
||||
'ibv_post_recv':['int ibv_post_recv(struct ibv_qp *qp, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr)', 'Submits a linked list of \\acrfullpl{wr} to the \\acrfull{rq}. Processing will stop on the first error and the erroneous \\gls{wr} will be returned via \\texttt{**bad\_wr}. At least one \\gls{wr} must be placed in the \\gls{rq} to transition to the state \\textit{ready to receive}.'],
|
||||
|
||||
'ibv_post_send':['int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr)', 'Submits a linked list of \\acrfullpl{wr} to the \\acrfull{sq}. All communication is initialized through this function. Processing will stop on the first error and the erroneous \\gls{wr} will be returned via \\texttt{**bad\_wr}.'],
|
||||
|
||||
'ibv_post_srq_recv':['int ibv_post_srq_recv(struct ibv_srq *srq, struct ibv_recv_wr *recv_wr, struct ibv_recv_wr **bad_recv_wr)', 'Submits a linked list of \\acrfullpl{wr} to a given \\acrfull{srq}. This function is similar to \\texttt{ibv\_post\_recv()}.'],
|
||||
|
||||
'ibv_req_notify_cq':['int ibv_req_notify_cq(struct ibv_cq *cq, int solicited_only)', 'Informs the \\acrfull{cq} about the fact that it must send completion events to a \\acrfull{cc}. This works only for \\acrfullpl{cqe} that were not yet present in the \\gls{cq} when this function was called.'],
|
||||
|
||||
'ibv_get_cq_event':['int ibv_get_cq_event(struct ibv_comp_channel *channel, struct ibv_cq **cq, void **cq_context)', 'Retrieves notifications from a \\acrfull{cc} that is bound to one or more \\glspl{cq}. This function is a blocking function.'],
|
||||
|
||||
'ibv_ack_cq_events':['void ibv_ack_cq_events(struct ibv_cq *cq, unsigned int nevents)', 'Acknowledges events from \\texttt{ibv\_get\_cq\_event()}. Events must be acknowledged before associated objects can be destroyed. This is done in order to avoid races. Calling this function is relatively expensive and it is possible to ackknowledge multiple events in one call.'],
|
||||
|
||||
'ibv_poll_cq':['int ibv_poll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *wc)', 'Retrieves \\acrfullpl{cqe} from the \\acrfull{cq}.'],
|
||||
|
||||
'ibv_init_ah_from_wc':['int ibv_init_ah_from_wc(struct ibv_context *context, uint8_t port_num, struct ibv_wc *wc, struct ibv_grh *grh, struct ibv_ah_attr *ah_attr)', 'Initializes an \\acrfull{ah} in \\texttt{*ah\_attr}, based on a \\gls{cqe} of a received message.'],
|
||||
|
||||
'ibv_create_ah_from_wc':['struct ibv_ah * ibv_create_ah_from_wc(struct ibv_pd *pd, struct ibv_wc *wc, struct ibv_grh *grh, uint8_t port_num)', 'Combines \\texttt{ibv\_init\_ah\_from\_wc()} and \\texttt{ibv\_create\_ah()}.'],
|
||||
|
||||
'ibv_attach_mcast':['int ibv_attach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid)', 'Attaches a \\gls{ud} \\gls{qp} to a multicast group with a given \\gls{gid} and \\gls{lid}.'],
|
||||
|
||||
'ibv_detach_mcast':['int ibv_detach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid)', 'Detaches a \\gls{ud} \\gls{qp} from the multicast group with a given \\gls{gid} and \\gls{lid}.'],
|
||||
|
||||
'ibv_get_async_event':['int ibv_get_async_event(struct ibv_context *context, struct ibv_async_event *event)', 'Retrieves asynchronous events from the devices. This function is a blocking function.'],
|
||||
|
||||
'ibv_ack_async_event':['void ibv_ack_async_event(struct ibv_async_event *event)', 'Acknowledges events from \\texttt{ibv\_get\_async\_event()}. Events must be acknowledged before associated objects can be destroyed. This is done in order to avoid races.'],
|
||||
|
||||
'ibv_event_type_str':['const char * ibv_event_type_str(enum ibv_event_type event_type)', 'Translates an enumeration that is included in an event returned by \\texttt{ibv\_get\_async\_event()} into a string.']
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
dtt.print_file(ibverbs, argv[0], caption, 1000)
|
||||
|
63
scripts/nodetype_functions.py
Executable file
63
scripts/nodetype_functions.py
Executable file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
import dict_to_table as dtt
|
||||
from sys import argv
|
||||
|
||||
caption = "Function pointers from the \\texttt{node\_type} C structure (\\autoref{lst:struct_nodetype}), which are used to register node-type functions with the super-node."
|
||||
|
||||
ibverbs = {'start node-type':
|
||||
['int (*start)(struct super_node *sn);',
|
||||
'This function is executed once when at least one instance of a certain node-type is present in the super-node. It can be used as global initialization to create shared resources for a certain node-type.'],
|
||||
|
||||
'parse':
|
||||
['int (*parse)(struct node *n, json_t *cfg);',
|
||||
'The number of instances to be created of a certain node-type and their settings are specified in a \\acrshort{json} file and decoded using the Jansson C library\\footnote{\\url{http://www.digip.org/jansson}}. This function is executed once for every instance of a node-type and shall interpret all settings which are passed to the instance via the parameter \\texttt{json\\_t *cfg}.'],
|
||||
|
||||
'check':
|
||||
['int (*check)(struct node *n);',
|
||||
'This function is executed once for every instance of a node-type and shall check if all previously parsed settings are valid.'],
|
||||
|
||||
'start node':
|
||||
['int (*start)(struct node *n);',
|
||||
'This function is executed once for every instance of a node-type and is used to initialize resources which are unique for every node.'],
|
||||
|
||||
'print':
|
||||
['char * (*print)(struct node *n);',
|
||||
'When invoked, this function shall return a string with a textual representation of this instance of the node-type.'],
|
||||
|
||||
'reverse':
|
||||
['int (*reverse)(struct node *n);',
|
||||
'This function may be called by the super-node between the parse- and the start-node-function. It will interchange the source and target address information and can be used to initialize a source and destination node-type instance with the same configuration file. This function is mainly used for debugging environments.'],
|
||||
|
||||
'read':
|
||||
['int (*read)(struct node *n, struct sample *smps[], unsigned cnt, unsigned *release);',
|
||||
'This function forms---together with the write-function---the core of every node-type instance. By calling this function, the super-node passes an empty structure which can hold \\texttt{cnt} samples. The node-type instance than fills \\texttt{*smps[]} with $0 < \\texttt{ret} < \\texttt{cnt}$ values, where \\texttt{ret} is also the value that is returned by the function.\
|
||||
\\newline\
|
||||
Every sample contains a reference counter which is incremented before the sample is passed to a node. Usually, after the read (or write) function returns, these samples are released for re-use by decrementing the reference counter. There are certain situations in which it is undesirable to release the samples after read (or write) is called. The \\texttt{*release} value lets the node define how many samples from \\texttt{*smps[]} may be released on return. \\texttt{*release} is initialized to \\texttt{cnt}; this indicates the default case in which all samples are released after the struct returns.\
|
||||
\\newline\
|
||||
An example of this situation for the InfiniBand node can be found in \\autoref{sec:villas_read}.'],
|
||||
|
||||
'write':
|
||||
['int (*write)(struct node *n, struct sample *smps[], unsigned cnt, unsigned *release);',
|
||||
'The parameters of this function are similar to those of the read-function. The super-node provides \\texttt{cnt} samples, which it wants the node to send to its target. The return value of this function indicates the number of samples which were successfully sent. By changing \\texttt{*release}, the node-type instance can define that only the first $\\texttt{*release}$ elements from \\texttt{*smps[]} should be released for re-use on return of the function.\
|
||||
\\newline\
|
||||
An example of this situation for the InfiniBand node can be found in \\autoref{sec:villas_write}.'],
|
||||
|
||||
'fd':
|
||||
['int (*fd)(struct node *n);',
|
||||
'This function must return a file descriptor, which enables the node to send notifications to the super-node. This is necessary when the super-node multiplexes incoming data from several nodes, and only wants to call a node\'s read-function when data is actually available.'],
|
||||
|
||||
'stop node':
|
||||
['int (*stop)(struct node *n);',
|
||||
'This function is the counterpart of \\texttt{int (*start)(struct node *n);} and shall be used to stop operation of the node-type instance.'],
|
||||
|
||||
'destroy':
|
||||
['int (*destroy)(struct node *n);',
|
||||
'This function is the counterpart of \\texttt{int (*start)(struct super\\_node *sn);} and can be used as global de-initialization of certain node-type.'],
|
||||
|
||||
'stop node-type':
|
||||
['int (*stop)();',
|
||||
'This function shall free the memory of an instance of a node-type.'],
|
||||
}
|
||||
|
||||
|
||||
dtt.print_file(ibverbs, argv[0], caption, 500)
|
74
scripts/rdma_cm_verbs.py
Executable file
74
scripts/rdma_cm_verbs.py
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env python3
|
||||
import dict_to_table as dtt
|
||||
from sys import argv
|
||||
|
||||
caption = "RDMA CM verbs"
|
||||
|
||||
rdmacmverbs = {'rdma_create_event_channel':['struct rdma_event_channel * rdma_create_event_channel(void)','Creates a new, unbound communication event channel.'],
|
||||
|
||||
'rdma_destroy_event_channel':['void rdma_destroy_event_channel(struct rdma_event channel *channel)','Destroys a communication event channel. Prior to destroying the channel, all associated communication identifiers must have been destroyed and all events must have been acknowledged.'],
|
||||
|
||||
'rdma_create_id':['int rdma_create_id(struct rdma_event_channel *channel, struct rdma_cm_id **id, void *context, enum rdma_port_space ps)','Creates an \\gls{rdma} \\gls{cm} communication identifier. Although similar to sockets, the \\texttt{rdma\_cm\_id} must be bound to a device before communication can occur.'],
|
||||
|
||||
'rdma_destroy_id':['int rdma_destroy_id(struct rdma_cm_id *id)','Destroys an \\gls{rdma} \\gls{cm} communication identifier. Prior to destroying the identifier, all associated \\glspl{qp} must have been destroyed and all events must have been acknowledged.'],
|
||||
|
||||
'rdma_migrade_id':['int rdma_migrate_id(struct rdma_cm_id *id, struct rdma_event_channel *channel)','Migrates a communication identifier and all its pending events to a new communication event channel.'],
|
||||
|
||||
'rdma_set_option':['int rdma_set_option(struct rdma_cm_id *id, int level, int optname, void *optval, size_t optlen)','Sets options for a communication identifier. The options can be found in the \\texttt{rdma\_cma.h} header file.\\footnote{\\url{https://github.com/linux-rdma/rdma-core/blob/master/librdmacm/rdma_cma.h}}'],
|
||||
|
||||
'rdma_create_ep':['int rdma_create_ep(struct rdma_cm_id **id, struct rdma_addrinfo *res, struct ibv_pd *pd, struct ibv_qp_init_attr *qp_init_attr)','Creates a communication endpoint. If \\texttt{*qp\_init\_attr} is provided, a \\gls{qp} to track communication information will be created. If no \\gls{pd} is defined, it will be associated with the default \\gls{pd}. Furthermore, it creates an communication identifier that operates synchronously. To let it operate asynchronously, it must be bound to a \\acrfull{cc} using \\texttt{rdma\_migrate\_id()}.'],
|
||||
|
||||
'rdma_destroy_ep':['int rdma_destroy_ep(struct rdma_cm_id *id)','Destroys the communication endpoint and all associated resources.'],
|
||||
|
||||
'rdma_resolve_addr':['int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, struct sockaddr *dst_addr, int timeout_ms)','Resolves a destination IP address to a valid \\gls{rdma} address. If, additionally, a source IP address is provided, the \\gls{rdma} \\gls{cm} communication identifier will be bound to that device. The latter is only necessary if \\texttt{rdma\_bind\_addr()} has not been called yet.'],
|
||||
|
||||
'rdma_bind_addr':['int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)','Binds the communication identifier to a local \\gls{rdma} device that is associated with the source IP address.'],
|
||||
|
||||
'rdma_resolve_route':['int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms)','Resolves the route to a given destination address. Prior to calling this function, \\texttt{rdma\_resolve\_addr()} must have been called on a destination address.'],
|
||||
|
||||
'rdma_listen':['int rdma_listen(struct rdma_cm_id *id, int backlog)','Sets the communication identifier to listening mode for incoming connection requests. Prior to calling this function, the device must have been bound to a local device with \\texttt{rdma\_bind\_addr()}.'],
|
||||
|
||||
'rdma_connect':['int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)','Initiates a connection request. When relying on a connected service type, this requests a connection to a remote location. In case of an unconnected service type, this requests all information from the remote \\gls{qp} to send datagrams. Before calling \\texttt{rdma\_connect()}, \\texttt{rdma\_resolve\_route()} must have been called.'],
|
||||
|
||||
'rdma_get_request':['int rdma_get_request(struct rdma_cm_id *listen, struct rdma_cm_id **id)','Retrieves the next pending connection request event from a synchronously operating communication identifier. If the function returns successfully, it will create a new communication identifier that represents the connection.'],
|
||||
|
||||
'rdma_accept':['int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)','Accepts a connection request or datagram service lookup. This function is called on the passive, listening side.'],
|
||||
|
||||
'rdma_reject':['int rdma_reject(struct rdma_cm_id *id, const void *private_data, uint8_t private_data_len)','Rejects a connection request or datagram service lookup. This function is called on the passive, listening side.'],
|
||||
|
||||
'rdma_notify':['int rdma_notify(struct rdma_cm_id *id, enum ibv_event_type event)','Notifies the communication identifier about events that have occured on a \\gls{qp} that is associated to it. Usually, this is not necessary. However, it can be necessary if the \\gls{qp} was created out of band and the communication identifier does not know its status yet.'],
|
||||
|
||||
'rdma_disconnect':['int rdma_disconnect(struct rdma_cm_id *id)','Disconnects any \\gls{qp} and transitions them tot the \\textit{error} state.'],
|
||||
|
||||
'rdma_get_src_port':['uint16_t rdma_get_src_port(struct rdma_cm_id *id)','Returns the local port number of a communication identifier.'],
|
||||
|
||||
'rdma_get_dst_port':['uint16_t rdma_get_dst_port(struct rdma_cm_id *id)','Returns the port number of a communication identifier\'s peer endpoint. If the identifier is unconnected, the function shall return \\zero.'],
|
||||
|
||||
'rdma_get_local_addr':['struct sockaddr * rdma_get_local_addr(struct rdma_cm_id *id)','Retrieves the local \\texttt{sockaddr} address of a communication identifier.'],
|
||||
|
||||
'rdma_get_peer_addr':['struct sockaddr * rdma_get_peer_addr(struct rdma_cm_id *id)','Retrieves the remote \\texttt{sockaddr} address of a communication identifier. If the identifier is unconnected, the function shall fill the complete \\texttt{sockaddr} C structure with zeros.'],
|
||||
|
||||
'rdma_get_devices':['struct ibv_context ** rdma_get_devices(int *num_devices)','Retrieves an array of available \\gls{rdma} devices in the system.'],
|
||||
|
||||
'rdma_free_devices':['void rdma_free_devices(struct ibv_context **list)','Destroys the array that was retrieved by \\texttt{rdma\_get\_devices()}.'],
|
||||
|
||||
'rdma_getaddrinfo':['int rdma_getaddrinfo(char *node, char *service, struct rdma_addrinfo *hints, struct rdma_addrinfo **res)','Resolves the destination node and service address and returns all information to communicate with a remote node in \\texttt{**res}. This function is very similar to \\texttt{getaddrinfo()}~\\cite{kerrisk2010linux}.'],
|
||||
|
||||
'rdma_freeaddrinfo':['void rdma_freeaddrinfo(struct rdma_addrinfo *res)','Frees the address that was retrieved with \\texttt{rdma\_getaddrinfo()}. This function is very similar to \\texttt{freeaddrinfo()}~\\cite{kerrisk2010linux}.'],
|
||||
|
||||
'rdma_create_qp':['int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd, struct ibv_qp_init_attr *qp_init_attr)','Creates a \\acrfull{qp} that is associated to an communication identifier. The \\gls{qp}\'s state transitions are managed by the identifier.'],
|
||||
|
||||
'rdma_destroy_qp':['void rdma_destroy_qp(struct rdma_cm_id *id)','Destroys a \\acrfull{qp} associated with the communication identifier.'],
|
||||
|
||||
'rdma_join_multicast':['int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr, void *context)','Joins a multicast group and attaches a \\acrfull{qp} that is associated to the communication identifier.'],
|
||||
|
||||
'rdma_leave_multicast':['int rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)','Leaves a multicast group and detaches a \\acrfull{qp} that is associated to the communication identifier.'],
|
||||
|
||||
'rdma_get_cm_event':['int rdma_get_cm_event(struct rdma_event_channel *channel, struct rdma_cm_event **event)','Retrieves asynchronous events from the communication event channel. This function is a blocking function.'],
|
||||
|
||||
'rdma_ack_cm_event':['int rdma_ack_cm_event(struct rdma_cm_event *event)','Acknowledges events from \\texttt{ibv\_get\_cm\_event()}. Events must be acknowledged before associated objects can be destroyed. This is done in order to avoid races.'],
|
||||
|
||||
'rdma_event_str':['char * rdma_event_str(enum rdma_cm_event_type event)','Translates an enumeration that is included in an event returned by \\texttt{ibv\_get\_cm\_event()} into a string.'],
|
||||
}
|
||||
|
||||
dtt.print_file(rdmacmverbs, argv[0], caption, 2000)
|
Reference in New Issue
Block a user