1
1

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.
Этот коммит содержится в:
Mitch Sukalski 2004-12-10 20:14:12 +00:00
родитель e5605b3e1b
Коммит 1741006a4e
4 изменённых файлов: 58 добавлений и 38 удалений

Просмотреть файл

@ -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;