You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Thank you for your contribution on rdma and your project really helps me. However, I am confused with the usage of struct rdma_buffer_attr and struct ibv_mr.
Typically, in below two parts of code. Client and Server both wants to send similar metadata(includes buffer address and key) to the other. Why sge values of each are set in different way? And why client does two times of rdma_buffer_register() while server only does one time?
In server's send_server_metadata_to_client() :
server_buffer_mr = rdma_buffer_alloc(pd /* which protection domain */,
client_metadata_attr.length /* what size to allocate */,
(IBV_ACCESS_LOCAL_WRITE|
IBV_ACCESS_REMOTE_READ|
IBV_ACCESS_REMOTE_WRITE) /* access permissions */);
if(!server_buffer_mr){
rdma_error("Server failed to create a buffer \n");
/* we assume that it is due to out of memory error */
return -ENOMEM;
}
/* This buffer is used to transmit information about the above
* buffer to the client. So this contains the metadata about the server
* buffer. Hence this is called metadata buffer. Since this is already
* on allocated, we just register it.
* We need to prepare a send I/O operation that will tell the
* client the address of the server buffer.
*/
server_metadata_attr.address = (uint64_t) server_buffer_mr->addr;
server_metadata_attr.length = (uint32_t) server_buffer_mr->length;
server_metadata_attr.stag.local_stag = (uint32_t) server_buffer_mr->lkey;
In client's client_xchange_metadata_with_server():
client_src_mr = rdma_buffer_register(pd,
src,
strlen(src),
(IBV_ACCESS_LOCAL_WRITE|
IBV_ACCESS_REMOTE_READ|
IBV_ACCESS_REMOTE_WRITE));
if(!client_src_mr){
rdma_error("Failed to register the first buffer, ret = %d \n", ret);
return ret;
}
/* we prepare metadata for the first buffer */
client_metadata_attr.address = (uint64_t) client_src_mr->addr;
client_metadata_attr.length = client_src_mr->length;
client_metadata_attr.stag.local_stag = client_src_mr->lkey;
/* now we register the metadata memory */
client_metadata_mr = rdma_buffer_register(pd,
&client_metadata_attr,
sizeof(client_metadata_attr),
IBV_ACCESS_LOCAL_WRITE);
if(!client_metadata_mr) {
rdma_error("Failed to register the client metadata buffer, ret = %d \n", ret);
return ret;
}
/* now we fill up SGE */
client_send_sge.addr = (uint64_t) client_metadata_mr->addr;
client_send_sge.length = (uint32_t) client_metadata_mr->length;
client_send_sge.lkey = client_metadata_mr->lkey;
The text was updated successfully, but these errors were encountered:
Hi Mr. Trivedi,
Thank you for your contribution on rdma and your project really helps me. However, I am confused with the usage of struct rdma_buffer_attr and struct ibv_mr.
Typically, in below two parts of code. Client and Server both wants to send similar metadata(includes buffer address and key) to the other. Why sge values of each are set in different way? And why client does two times of rdma_buffer_register() while server only does one time?
In server's send_server_metadata_to_client() :
In client's client_xchange_metadata_with_server():
The text was updated successfully, but these errors were encountered: