From 1741006a4e4b3a9293c33e645182e7546e2ad904 Mon Sep 17 00:00:00 2001 From: Mitch Sukalski Date: Fri, 10 Dec 2004 20:14:12 +0000 Subject: [PATCH] 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. --- src/mca/ptl/ib/src/ptl_ib.h | 11 +++++++++ src/mca/ptl/ib/src/ptl_ib_priv.c | 37 ++++++++++------------------ src/mca/ptl/ib/src/ptl_ib_recvfrag.c | 11 ++++++++- src/mca/ptl/ib/src/ptl_ib_sendfrag.c | 37 ++++++++++++++++++---------- 4 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/mca/ptl/ib/src/ptl_ib.h b/src/mca/ptl/ib/src/ptl_ib.h index d2dac0e710..5dbe5fbe44 100644 --- a/src/mca/ptl/ib/src/ptl_ib.h +++ b/src/mca/ptl/ib/src/ptl_ib.h @@ -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 */ diff --git a/src/mca/ptl/ib/src/ptl_ib_priv.c b/src/mca/ptl/ib/src/ptl_ib_priv.c index 521d43fc8f..b307571fca 100644 --- a/src/mca/ptl/ib/src/ptl_ib_priv.c +++ b/src/mca/ptl/ib/src/ptl_ib_priv.c @@ -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, diff --git a/src/mca/ptl/ib/src/ptl_ib_recvfrag.c b/src/mca/ptl/ib/src/ptl_ib_recvfrag.c index 7f966ac71f..a9c9dded7b 100644 --- a/src/mca/ptl/ib/src/ptl_ib_recvfrag.c +++ b/src/mca/ptl/ib/src/ptl_ib_recvfrag.c @@ -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, diff --git a/src/mca/ptl/ib/src/ptl_ib_sendfrag.c b/src/mca/ptl/ib/src/ptl_ib_sendfrag.c index 8f715b086d..eeacc78058 100644 --- a/src/mca/ptl/ib/src/ptl_ib_sendfrag.c +++ b/src/mca/ptl/ib/src/ptl_ib_sendfrag.c @@ -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;