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
Этот коммит содержится в:
родитель
eae3df4904
Коммит
8900d3ae43
@ -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)
|
||||
{
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user