first version of memory registration bug fixes: RDMA write target
memory freed on receipt of FIN packet with memory region information from the sender (mca_ptl_ib_fin_header_t); RDMA write source memory freed on completion notification from RDMA write... This commit was SVN r3776.
Этот коммит содержится в:
родитель
e5605b3e1b
Коммит
1741006a4e
@ -126,6 +126,17 @@ typedef struct mca_ptl_ib_module_t mca_ptl_ib_module_t;
|
||||
|
||||
extern mca_ptl_ib_module_t mca_ptl_ib_module;
|
||||
|
||||
/**
|
||||
* IB FIN header
|
||||
*/
|
||||
typedef struct mca_ptl_ib_fin_header_t mca_ptl_ib_fin_header_t;
|
||||
|
||||
struct mca_ptl_ib_fin_header_t {
|
||||
mca_ptl_base_frag_header_t frag_hdr;
|
||||
ompi_ptr_t mr_addr;
|
||||
uint64_t mr_size;
|
||||
};
|
||||
|
||||
/**
|
||||
* Register IB component parameters with the MCA framework
|
||||
*/
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "ptl_ib_vapi.h"
|
||||
#include "ptl_ib_priv.h"
|
||||
#include "ptl_ib.h"
|
||||
#include "ptl_ib_memory.h"
|
||||
|
||||
/*
|
||||
* Asynchronous event handler to detect unforseen
|
||||
@ -635,21 +636,19 @@ void mca_ptl_ib_prepare_ack(mca_ptl_ib_state_t *ib_state,
|
||||
void* addr_to_reg, int len_to_reg,
|
||||
void* ack_buf, int* len_added)
|
||||
{
|
||||
int rc;
|
||||
vapi_memhandle_t memhandle;
|
||||
mca_ptl_ib_mem_registry_info_t *info =
|
||||
mca_ptl_ib_register_mem_with_registry(ib_state,
|
||||
addr_to_reg, (size_t)len_to_reg);
|
||||
|
||||
rc = mca_ptl_ib_register_mem(ib_state->nic, ib_state->ptag,
|
||||
addr_to_reg, len_to_reg, &memhandle);
|
||||
|
||||
if(rc != OMPI_SUCCESS) {
|
||||
if(NULL == info) {
|
||||
ompi_output(0, "Error in registering");
|
||||
}
|
||||
|
||||
A_PRINT("Sending Remote key : %d", memhandle.rkey);
|
||||
A_PRINT("Sending Remote key : %d", info->reply.r_key);
|
||||
|
||||
memcpy(ack_buf,(void*) &memhandle.rkey, sizeof(VAPI_rkey_t));
|
||||
memcpy(ack_buf,(void*) &(info->reply.r_key), sizeof(VAPI_rkey_t));
|
||||
|
||||
*len_added = sizeof(VAPI_lkey_t);
|
||||
*len_added = sizeof(VAPI_rkey_t);
|
||||
}
|
||||
|
||||
int mca_ptl_ib_rdma_write(mca_ptl_ib_state_t *ib_state,
|
||||
@ -658,28 +657,18 @@ int mca_ptl_ib_rdma_write(mca_ptl_ib_state_t *ib_state,
|
||||
VAPI_rkey_t remote_key, void* id_buf)
|
||||
{
|
||||
VAPI_ret_t ret;
|
||||
VAPI_mrw_t mr_in, mr_out;
|
||||
vapi_memhandle_t mem_handle;
|
||||
|
||||
/* Register local application buffer */
|
||||
mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE;
|
||||
mr_in.l_key = 0;
|
||||
mr_in.r_key = 0;
|
||||
mr_in.pd_hndl = ib_state->ptag;
|
||||
mr_in.size = send_len;
|
||||
mr_in.start = (VAPI_virt_addr_t) (MT_virt_addr_t) send_buf;
|
||||
mr_in.type = VAPI_MR;
|
||||
mca_ptl_ib_mem_registry_info_t *info =
|
||||
mca_ptl_ib_register_mem_with_registry(ib_state,
|
||||
send_buf, send_len);
|
||||
|
||||
ret = VAPI_register_mr(ib_state->nic, &mr_in,
|
||||
&mem_handle.hndl, &mr_out);
|
||||
if(VAPI_OK != ret) {
|
||||
MCA_PTL_IB_VAPI_RET(ret, "VAPI_register_mr");
|
||||
if (NULL == info) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
/* Prepare descriptor */
|
||||
IB_PREPARE_RDMA_W_DESC(ib_buf, (peer_conn->rres->qp_num),
|
||||
send_len, send_buf, (mr_out.l_key), remote_key,
|
||||
send_len, send_buf, (info->reply.l_key), remote_key,
|
||||
id_buf, remote_buf);
|
||||
|
||||
ret = VAPI_post_sr(ib_state->nic,
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "ptl_ib_peer.h"
|
||||
#include "ptl_ib_recvfrag.h"
|
||||
#include "ptl_ib_sendfrag.h"
|
||||
#include "ptl_ib_memory.h"
|
||||
|
||||
static void mca_ptl_ib_recv_frag_construct(mca_ptl_ib_recv_frag_t* frag);
|
||||
static void mca_ptl_ib_recv_frag_destruct(mca_ptl_ib_recv_frag_t* frag);
|
||||
@ -108,7 +109,7 @@ static void mca_ptl_ib_data_frag(mca_ptl_base_module_t *module,
|
||||
if (!matched) {
|
||||
/* Oh my GOD
|
||||
* !!! */
|
||||
//ompi_output(0, "Can't match buffer. Mama is unhappy\n");
|
||||
/* ompi_output(0, "Can't match buffer. Mama is unhappy\n"); */
|
||||
memcpy (recv_frag->unex_buf,
|
||||
(char *) header + sizeof (mca_ptl_base_header_t),
|
||||
header->hdr_frag.hdr_frag_length);
|
||||
@ -151,9 +152,17 @@ static void mca_ptl_ib_ctrl_frag(mca_ptl_base_module_t *module,
|
||||
static void mca_ptl_ib_last_frag(mca_ptl_base_module_t *module,
|
||||
mca_ptl_base_header_t *hdr)
|
||||
{
|
||||
mca_ptl_ib_fin_header_t *fin_hdr = (mca_ptl_ib_fin_header_t *)hdr;
|
||||
mca_pml_base_recv_request_t *request;
|
||||
request = (mca_pml_base_recv_request_t*) hdr->hdr_frag.hdr_dst_ptr.pval;
|
||||
|
||||
/* deregister memory if this is the last fragment */
|
||||
if ((request->req_bytes_received + hdr->hdr_frag.hdr_frag_length) >=
|
||||
request->req_bytes_packed) {
|
||||
mca_ptl_ib_deregister_mem_with_registry(((mca_ptl_ib_module_t *)module)->ib_state,
|
||||
fin_hdr->mr_addr.pval, (size_t)fin_hdr->mr_size);
|
||||
}
|
||||
|
||||
module->ptl_recv_progress (
|
||||
module,
|
||||
request,
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "ptl_ib_proc.h"
|
||||
#include "ptl_ib_sendfrag.h"
|
||||
#include "ptl_ib_priv.h"
|
||||
#include "ptl_ib_memory.h"
|
||||
|
||||
static void mca_ptl_ib_send_frag_construct(mca_ptl_ib_send_frag_t* frag);
|
||||
static void mca_ptl_ib_send_frag_destruct(mca_ptl_ib_send_frag_t* frag);
|
||||
@ -250,6 +251,14 @@ int mca_ptl_ib_register_send_frags(mca_ptl_base_module_t *ptl)
|
||||
void mca_ptl_ib_process_rdma_w_comp(mca_ptl_base_module_t *module,
|
||||
void* comp_addr)
|
||||
{
|
||||
mca_ptl_ib_module_t *ib_module = (mca_ptl_ib_module_t *)module;
|
||||
mca_ptl_ib_send_frag_t *sendfrag = (mca_ptl_ib_send_frag_t *) comp_addr;
|
||||
|
||||
/* deregister memory region for RDMA write */
|
||||
mca_ptl_ib_deregister_mem_with_registry(ib_module->ib_state,
|
||||
(void *)(unsigned long)(sendfrag->ib_buf.desc.sg_entry.addr),
|
||||
(size_t)(sendfrag->ib_buf.desc.sg_entry.len));
|
||||
|
||||
#if 0
|
||||
mca_ptl_ib_send_frag_t *sendfrag;
|
||||
ompi_free_list_t *flist;
|
||||
@ -339,20 +348,22 @@ int mca_ptl_ib_put_frag_init(mca_ptl_ib_send_frag_t *sendfrag,
|
||||
{
|
||||
int rc;
|
||||
int size_in, size_out;
|
||||
mca_ptl_base_header_t *hdr;
|
||||
mca_ptl_ib_fin_header_t *hdr;
|
||||
|
||||
size_in = *size;
|
||||
|
||||
hdr = (mca_ptl_base_header_t *)
|
||||
hdr = (mca_ptl_ib_fin_header_t *)
|
||||
&sendfrag->ib_buf.buf[0];
|
||||
|
||||
hdr->hdr_common.hdr_type = MCA_PTL_HDR_TYPE_FIN;
|
||||
hdr->hdr_common.hdr_flags = flags;
|
||||
hdr->hdr_frag.hdr_frag_offset = offset;
|
||||
hdr->hdr_frag.hdr_src_ptr.lval = 0;
|
||||
hdr->hdr_frag.hdr_src_ptr.pval = sendfrag;
|
||||
hdr->hdr_frag.hdr_dst_ptr = req->req_peer_match;
|
||||
hdr->hdr_frag.hdr_frag_length = size_in;
|
||||
hdr->frag_hdr.hdr_common.hdr_type = MCA_PTL_HDR_TYPE_FIN;
|
||||
hdr->frag_hdr.hdr_common.hdr_flags = flags;
|
||||
hdr->frag_hdr.hdr_frag_offset = offset;
|
||||
hdr->frag_hdr.hdr_src_ptr.lval = 0;
|
||||
hdr->frag_hdr.hdr_src_ptr.pval = sendfrag;
|
||||
hdr->frag_hdr.hdr_dst_ptr = req->req_peer_match;
|
||||
hdr->frag_hdr.hdr_frag_length = size_in;
|
||||
hdr->mr_addr.lval = req->req_peer_addr.lval;
|
||||
hdr->mr_size = req->req_peer_size;
|
||||
|
||||
if(size_in > 0 && 0) {
|
||||
struct iovec iov;
|
||||
@ -373,7 +384,7 @@ int mca_ptl_ib_put_frag_init(mca_ptl_ib_send_frag_t *sendfrag,
|
||||
offset,
|
||||
NULL );
|
||||
}
|
||||
iov.iov_base = &sendfrag->ib_buf.buf[sizeof(mca_ptl_base_frag_header_t)];
|
||||
iov.iov_base = &sendfrag->ib_buf.buf[sizeof(mca_ptl_ib_fin_header_t)];
|
||||
iov.iov_len = size_in;
|
||||
iov_count = 1;
|
||||
max_data = size_in;
|
||||
@ -390,10 +401,10 @@ int mca_ptl_ib_put_frag_init(mca_ptl_ib_send_frag_t *sendfrag,
|
||||
}
|
||||
|
||||
*size = size_out;
|
||||
hdr->hdr_frag.hdr_frag_length = size_out;
|
||||
hdr->frag_hdr.hdr_frag_length = size_out;
|
||||
|
||||
IB_SET_SEND_DESC_LEN((&sendfrag->ib_buf),
|
||||
(sizeof(mca_ptl_base_frag_header_t)));
|
||||
(sizeof(mca_ptl_ib_fin_header_t)));
|
||||
|
||||
/* fragment state */
|
||||
sendfrag->frag_send.frag_base.frag_owner =
|
||||
@ -401,7 +412,7 @@ int mca_ptl_ib_put_frag_init(mca_ptl_ib_send_frag_t *sendfrag,
|
||||
sendfrag->frag_send.frag_request = req;
|
||||
|
||||
sendfrag->frag_send.frag_base.frag_addr =
|
||||
&sendfrag->ib_buf.buf[sizeof(mca_ptl_base_frag_header_t)];
|
||||
&sendfrag->ib_buf.buf[sizeof(mca_ptl_ib_fin_header_t)];
|
||||
|
||||
sendfrag->frag_send.frag_base.frag_size = size_out;
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user