1
1

Second take at fixing the issues with using ompi_ptr_t. Add helper functions for converting from .pval to .lval and vice-versa. Users of ompi_ptr_t types should only use one of the fields in the union unless using the helper conversion functions. For the BTLs, local pointers will always be stored in the .pval field and remote pointers always stored in the .lval field.

George wrote the initial patch, I extended it slightly and am responsible for all bugs found.

Refs trac:587

This commit was SVN r13023.

The following Trac tickets were found above:
  Ticket 587 --> https://svn.open-mpi.org/trac/ompi/ticket/587
Этот коммит содержится в:
Brian Barrett 2007-01-07 01:48:57 +00:00
родитель eae3df4904
Коммит 8900d3ae43
9 изменённых файлов: 49 добавлений и 32 удалений

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

@ -721,11 +721,7 @@ static int mca_btl_gm_put_nl(
/* post the put descriptor */
gm_put(gm_btl->port,
des->des_src->seg_addr.pval,
#if GM_SIZEOF_VOID_P == 4
des->des_dst->seg_addr.ival,
#else
des->des_dst->seg_addr.lval,
#endif
des->des_src->seg_len,
GM_LOW_PRIORITY,
endpoint->endpoint_addr.node_id,
@ -767,11 +763,7 @@ int mca_btl_gm_put(
/* post the put descriptor */
gm_put(gm_btl->port,
des->des_src->seg_addr.pval,
#if GM_SIZEOF_VOID_P == 4
des->des_dst->seg_addr.ival,
#else
des->des_dst->seg_addr.lval,
#endif
des->des_src->seg_len,
GM_LOW_PRIORITY,
endpoint->endpoint_addr.node_id,
@ -876,11 +868,7 @@ static int mca_btl_gm_get_nl(
/* post get put descriptor */
gm_get(gm_btl->port,
#if GM_SIZEOF_VOID_P == 4
des->des_dst->seg_addr.ival,
#else
des->des_dst->seg_addr.lval,
#endif
des->des_src->seg_addr.pval,
des->des_src->seg_len,
GM_LOW_PRIORITY,
@ -923,11 +911,7 @@ int mca_btl_gm_get(
/* post get put descriptor */
gm_get(gm_btl->port,
#if GM_SIZEOF_VOID_P == 4
des->des_dst->seg_addr.ival,
#else
des->des_dst->seg_addr.lval,
#endif
des->des_src->seg_addr.pval,
des->des_src->seg_len,
GM_LOW_PRIORITY,

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

@ -495,7 +495,7 @@ int mca_btl_mvapi_put( mca_btl_base_module_t* btl,
} else {
frag->sr_desc.remote_qp = endpoint->rem_info.rem_qp_num_lp;
frag->sr_desc.remote_addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->base.des_dst->seg_addr.pval;
frag->sr_desc.remote_addr = (VAPI_virt_addr_t) frag->base.des_dst->seg_addr.lval;
frag->sr_desc.r_key = frag->base.des_dst->seg_key.key32[0];
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->base.des_src->seg_addr.pval;
frag->sg_entry.len = frag->base.des_src->seg_len;
@ -556,7 +556,7 @@ int mca_btl_mvapi_get( mca_btl_base_module_t* btl,
} else {
frag->sr_desc.remote_qp = endpoint->rem_info.rem_qp_num_lp;
frag->sr_desc.remote_addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->base.des_src->seg_addr.pval;
frag->sr_desc.remote_addr = (VAPI_virt_addr_t) frag->base.des_src->seg_addr.lval;
frag->sr_desc.r_key = frag->base.des_src->seg_key.key32[0];
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->base.des_dst->seg_addr.pval;
frag->sg_entry.len = frag->base.des_dst->seg_len;

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

@ -1206,7 +1206,7 @@ static int mca_btl_mvapi_endpoint_send_eager_rdma(
rdma_hdr = (mca_btl_mvapi_eager_rdma_header_t*)frag->segment.seg_addr.pval;
rdma_hdr->control.type = MCA_BTL_MVAPI_CONTROL_RDMA;
rdma_hdr->rkey = endpoint->eager_rdma_local.reg->r_key;
rdma_hdr->rdma_start.pval = endpoint->eager_rdma_local.base.pval;
rdma_hdr->rdma_start.lval = ompi_ptr_ptol(endpoint->eager_rdma_local.base.pval);
frag->segment.seg_len = sizeof(mca_btl_mvapi_eager_rdma_header_t);
if (mca_btl_mvapi_endpoint_post_send(mvapi_btl, endpoint, frag) !=
OMPI_SUCCESS) {

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

@ -646,7 +646,7 @@ int mca_btl_openib_put( mca_btl_base_module_t* btl,
} else {
frag->wr_desc.sr_desc.send_flags = IBV_SEND_SIGNALED;
frag->wr_desc.sr_desc.wr.rdma.remote_addr = (unsigned long) frag->base.des_dst->seg_addr.pval;
frag->wr_desc.sr_desc.wr.rdma.remote_addr = frag->base.des_dst->seg_addr.lval;
frag->wr_desc.sr_desc.wr.rdma.rkey = frag->base.des_dst->seg_key.key32[0];
frag->sg_entry.addr = (unsigned long) frag->base.des_src->seg_addr.pval;
frag->sg_entry.length = frag->base.des_src->seg_len;
@ -708,7 +708,7 @@ int mca_btl_openib_get( mca_btl_base_module_t* btl,
} else {
frag->wr_desc.sr_desc.send_flags = IBV_SEND_SIGNALED;
frag->wr_desc.sr_desc.wr.rdma.remote_addr = (unsigned long) frag->base.des_src->seg_addr.pval;
frag->wr_desc.sr_desc.wr.rdma.remote_addr = frag->base.des_src->seg_addr.lval;
frag->wr_desc.sr_desc.wr.rdma.rkey = frag->base.des_src->seg_key.key32[0];
frag->sg_entry.addr = (unsigned long) frag->base.des_dst->seg_addr.pval;
frag->sg_entry.length = frag->base.des_dst->seg_len;

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

@ -165,7 +165,7 @@ static inline int mca_btl_openib_endpoint_post_send(mca_btl_openib_module_t* ope
#endif
frag->wr_desc.sr_desc.wr.rdma.rkey = endpoint->eager_rdma_remote.rkey;
frag->wr_desc.sr_desc.wr.rdma.remote_addr =
(uintptr_t)endpoint->eager_rdma_remote.base.pval +
endpoint->eager_rdma_remote.base.lval +
endpoint->eager_rdma_remote.head *
openib_btl->eager_rdma_frag_size +
sizeof(mca_btl_openib_frag_t) +
@ -1146,7 +1146,7 @@ static int mca_btl_openib_endpoint_send_eager_rdma(
rdma_hdr = (mca_btl_openib_eager_rdma_header_t*)frag->segment.seg_addr.pval;
rdma_hdr->control.type = MCA_BTL_OPENIB_CONTROL_RDMA;
rdma_hdr->rkey = endpoint->eager_rdma_local.reg->mr->rkey;
rdma_hdr->rdma_start.pval = endpoint->eager_rdma_local.base.pval;
rdma_hdr->rdma_start.lval = ompi_ptr_ptol(endpoint->eager_rdma_local.base.pval);
frag->segment.seg_len = sizeof(mca_btl_openib_eager_rdma_header_t);
if (mca_btl_openib_endpoint_send(endpoint, frag) != OMPI_SUCCESS) {
MCA_BTL_IB_FRAG_RETURN(openib_btl, frag);

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

@ -251,7 +251,7 @@ bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd)
goto repeat;
} else if (frag->iov_idx == 2) {
for(i=0; i<frag->hdr.count; i++) {
frag->iov[i+2].iov_base = (IOVBASE_TYPE*)frag->segments[i].seg_addr.pval;
frag->iov[i+2].iov_base = (IOVBASE_TYPE*)ompi_ptr_ltop(frag->segments[i].seg_addr.lval);
frag->iov[i+2].iov_len = frag->segments[i].seg_len;
frag->iov_cnt++;
}

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

@ -578,7 +578,7 @@ int mca_pml_ob1_recv_request_schedule_exclusive( mca_pml_ob1_recv_request_t* rec
while( bytes_remaining > 0 &&
recvreq->req_pipeline_depth < mca_pml_ob1.recv_pipeline_depth ) {
size_t hdr_size;
size_t size;
size_t size, i;
mca_pml_ob1_rdma_hdr_t* hdr;
mca_btl_base_descriptor_t* dst;
mca_btl_base_descriptor_t* ctl;
@ -684,8 +684,13 @@ int mca_pml_ob1_recv_request_schedule_exclusive( mca_pml_ob1_recv_request_t* rec
hdr->hdr_des.pval = dst;
hdr->hdr_rdma_offset = recvreq->req_rdma_offset;
hdr->hdr_seg_cnt = dst->des_dst_cnt;
memcpy(hdr->hdr_segs, dst->des_dst,
dst->des_dst_cnt * sizeof(mca_btl_base_segment_t));
for( i = 0; i < dst->des_dst_cnt; i++ ) {
hdr->hdr_segs[i].seg_addr.lval = ompi_ptr_ptol(dst->des_dst[i].seg_addr.pval);
hdr->hdr_segs[i].seg_len = dst->des_dst[i].seg_len;
hdr->hdr_segs[i].seg_key.key64 = dst->des_dst[i].seg_key.key64;
}
if(!recvreq->req_ack_sent)
recvreq->req_ack_sent = true;
#if OMPI_ENABLE_HETEROGENEOUS_SUPPORT

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

@ -704,8 +704,11 @@ int mca_pml_ob1_send_request_start_rdma(
#endif
#endif
for(i=0; i<src->des_src_cnt; i++)
hdr->hdr_rget.hdr_segs[i] = src->des_src[i];
for( i = 0; i < src->des_src_cnt; i++ ) {
hdr->hdr_rget.hdr_segs[i].seg_addr.lval = ompi_ptr_ptol(src->des_src[i].seg_addr.pval);
hdr->hdr_rget.hdr_segs[i].seg_len = src->des_src[i].seg_len;
hdr->hdr_rget.hdr_segs[i].seg_key.key64 = src->des_src[i].seg_key.key64;
}
des->des_cbfunc = mca_pml_ob1_send_ctl_completion;
@ -1139,9 +1142,11 @@ void mca_pml_ob1_send_request_put(
}
/* setup fragment */
for(i=0; i<hdr->hdr_seg_cnt; i++) {
size += hdr->hdr_segs[i].seg_len;
frag->rdma_segs[i] = hdr->hdr_segs[i];
for( i = 0; i < hdr->hdr_seg_cnt; i++ ) {
frag->rdma_segs[i].seg_addr.lval = hdr->hdr_segs[i].seg_addr.lval;
frag->rdma_segs[i].seg_len = hdr->hdr_segs[i].seg_len;
frag->rdma_segs[i].seg_key.key64 = hdr->hdr_segs[i].seg_key.key64;
size += frag->rdma_segs[i].seg_len;
}
frag->rdma_hdr.hdr_rdma = *hdr;

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

@ -34,6 +34,10 @@
#include <arpa/inet.h>
#endif
#if OMPI_ENABLE_DEBUG
#include "opal/util/output.h"
#endif
#ifndef __WINDOWS__
/*
* Increase FD_SETSIZE
@ -144,6 +148,25 @@ static inline uint64_t ntoh64(uint64_t val)
return r.ll;
}
/**
* Convert between a local representation of pointer and a 64 bits value.
*/
static inline uint64_t ompi_ptr_ptol( void* ptr )
{
return (uint64_t)(uintptr_t) ptr;
}
static inline void* ompi_ptr_ltop( uint64_t value )
{
#if SIZEOF_VOID_P == 4 && OMPI_ENABLE_DEBUG
if (value > ((1ULL << 32) - 1ULL)) {
opal_output(0, "Warning: truncating value in ompi_ptr_ltop");
}
#endif
return (void*)(uintptr_t) value;
}
#ifdef WORDS_BIGENDIAN
static inline uint16_t opal_swap_bytes2(uint16_t val)
{