1
1

Add optional ordering to the BTL interface.

This is required to tighten up the BTL semantics. Ordering is not guaranteed,
but, if the BTL returns a order tag in a descriptor (other than
MCA_BTL_NO_ORDER) then we may request another descriptor that will obey
ordering w.r.t. to the other descriptor.


This will allow sane behavior for RDMA networks, where local completion of an
RDMA operation on the active side does not imply remote completion on the
passive side. If we send a FIN message after local completion and the FIN is
not ordered w.r.t. the RDMA operation then badness may occur as the passive
side may now try to deregister the memory and the RDMA operation may still be
pending on the passive side. 

Note that this has no impact on networks that don't suffer from this
limitation as the ORDER tag can simply always be specified as
MCA_BTL_NO_ORDER.

This commit was SVN r14768.
Этот коммит содержится в:
Galen Shipman 2007-05-24 19:51:26 +00:00
родитель a665b7a20d
Коммит 3401bd2b07
32 изменённых файлов: 241 добавлений и 95 удалений

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

@ -260,8 +260,8 @@ typedef struct mca_bml_base_endpoint_t mca_bml_base_endpoint_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_bml_base_endpoint_t);
static inline void mca_bml_base_alloc(mca_bml_base_btl_t* bml_btl, mca_btl_base_descriptor_t** des, size_t size) {
*des = bml_btl->btl_alloc(bml_btl->btl, size);
static inline void mca_bml_base_alloc(mca_bml_base_btl_t* bml_btl, mca_btl_base_descriptor_t** des, uint8_t order, size_t size) {
*des = bml_btl->btl_alloc(bml_btl->btl, order, size);
}
static inline void mca_bml_base_free(mca_bml_base_btl_t* bml_btl, mca_btl_base_descriptor_t* des) {
@ -316,14 +316,16 @@ static inline int mca_bml_base_get(mca_bml_base_btl_t* bml_btl, mca_btl_base_des
static inline void mca_bml_base_prepare_src(mca_bml_base_btl_t* bml_btl,
mca_mpool_base_registration_t* reg,
struct ompi_convertor_t* conv,
uint8_t order,
size_t reserve,
size_t *size,
size_t *size,
mca_btl_base_descriptor_t** des) {
*des = bml_btl->btl_prepare_src(
bml_btl->btl,
bml_btl->btl_endpoint,
reg,
conv,
order,
reserve,
size
);
@ -335,6 +337,7 @@ static inline void mca_bml_base_prepare_src(mca_bml_base_btl_t* bml_btl,
static inline void mca_bml_base_prepare_dst(mca_bml_base_btl_t* bml_btl,
mca_mpool_base_registration_t* reg,
struct ompi_convertor_t* conv,
uint8_t order,
size_t reserve,
size_t *size,
mca_btl_base_descriptor_t** des) {
@ -343,6 +346,7 @@ static inline void mca_bml_base_prepare_dst(mca_bml_base_btl_t* bml_btl,
bml_btl->btl_endpoint,
reg,
conv,
order,
reserve,
size
);
@ -352,16 +356,19 @@ static inline void mca_bml_base_prepare_dst(mca_bml_base_btl_t* bml_btl,
}
#if OMPI_HAVE_THREAD_SUPPORT
#define MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, alloc_size, seg_size) \
#define MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, order, \
alloc_size, seg_size) \
do { \
if( NULL != (des = bml_btl->btl_cache) ) { \
if( MCA_BTL_NO_ORDER == order && \
NULL != (des = bml_btl->btl_cache) ) { \
/* atomically acquire the cached descriptor */ \
if(opal_atomic_cmpset_ptr(&bml_btl->btl_cache, \
des, NULL) == 0) { \
des = bml_btl->btl_alloc(bml_btl->btl, alloc_size); \
des = bml_btl->btl_alloc(bml_btl->btl, order, \
alloc_size); \
} \
} else { \
des = bml_btl->btl_alloc(bml_btl->btl, alloc_size); \
des = bml_btl->btl_alloc(bml_btl->btl, order, alloc_size); \
} \
if(des != NULL) { \
des->des_src->seg_len = seg_size; \
@ -369,12 +376,14 @@ static inline void mca_bml_base_prepare_dst(mca_bml_base_btl_t* bml_btl,
} \
} while(0)
#else
#define MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, alloc_size, seg_size) \
#define MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, order, \
alloc_size, seg_size) \
do { \
if( NULL != (des = bml_btl->btl_cache) ) { \
if( MCA_BTL_NO_ORDER == order && \
NULL != (des = bml_btl->btl_cache) ) { \
bml_btl->btl_cache = NULL; \
} else { \
des = bml_btl->btl_alloc(bml_btl->btl, alloc_size); \
des = bml_btl->btl_alloc(bml_btl->btl, order, alloc_size); \
} \
if(des != NULL) { \
des->des_src->seg_len = seg_size; \

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

@ -135,6 +135,8 @@ struct ompi_proc_t;
/* send/recv operations require tag matching */
typedef uint8_t mca_btl_base_tag_t;
#define MCA_BTL_NO_ORDER 255
/* reserved tag values */
#define MCA_BTL_TAG_BTL 0
#define MCA_BTL_TAG_PML 1
@ -158,6 +160,9 @@ typedef uint8_t mca_btl_base_tag_t;
/* btl can report put/get completion before data hits the other side */
#define MCA_BTL_FLAGS_FAKE_RDMA 0x40
/* btl needs local rdma completion */
#define MCA_BTL_FLAGS_RDMA_COMPLETION 0x80
/* Default exclusivity levels */
#define MCA_BTL_EXCLUSIVITY_HIGH 64*1024 /* internal loopback */
#define MCA_BTL_EXCLUSIVITY_DEFAULT 1024 /* GM/IB/etc. */
@ -212,6 +217,7 @@ struct mca_btl_base_descriptor_t {
void* des_cbdata;
void* des_context;
int32_t des_flags;
uint8_t order;
};
typedef struct mca_btl_base_descriptor_t mca_btl_base_descriptor_t;
@ -449,9 +455,12 @@ typedef int (*mca_btl_base_module_register_error_fn_t)(
*
* @param btl (IN) BTL module
* @param size (IN) Request segment size.
* @param order (IN) The ordering tag (may be MCA_BTL_NO_ORDER)
*/
typedef mca_btl_base_descriptor_t* (*mca_btl_base_module_alloc_fn_t)(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size
);
@ -486,6 +495,7 @@ typedef struct mca_btl_base_descriptor_t* (*mca_btl_base_module_prepare_fn_t)(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);

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

@ -202,6 +202,7 @@ int mca_btl_gm_register_error_cb(
mca_btl_base_descriptor_t* mca_btl_gm_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_gm_module_t* gm_btl = (mca_btl_gm_module_t*) btl;
@ -232,6 +233,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_alloc(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -266,6 +268,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
)
@ -316,6 +319,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -358,6 +362,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -382,6 +387,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -415,6 +421,8 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_dst(
frag->base.des_dst = &frag->segment;
frag->base.des_dst_cnt = 1;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
if(NULL == registration) {
rc = mpool->mpool_register( mpool,
frag->segment.seg_addr.pval,

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

@ -292,6 +292,7 @@ extern int mca_btl_gm_register_error_cb(
extern mca_btl_base_descriptor_t* mca_btl_gm_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size);
@ -326,6 +327,7 @@ mca_btl_base_descriptor_t* mca_btl_gm_prepare_src(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -335,6 +337,7 @@ extern mca_btl_base_descriptor_t* mca_btl_gm_prepare_dst(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);

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

@ -163,6 +163,7 @@ int mca_btl_mx_register( struct mca_btl_base_module_t* btl,
*/
mca_btl_base_descriptor_t* mca_btl_mx_alloc( struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size )
{
mca_btl_mx_module_t* mx_btl = (mca_btl_mx_module_t*) btl;
@ -180,6 +181,8 @@ mca_btl_base_descriptor_t* mca_btl_mx_alloc( struct mca_btl_base_module_t* btl,
frag->base.des_src = frag->segment;
frag->base.des_src_cnt = 1;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return (mca_btl_base_descriptor_t*)frag;
}
@ -210,6 +213,7 @@ mca_btl_mx_prepare_src( struct mca_btl_base_module_t* btl,
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size )
{
@ -269,6 +273,8 @@ mca_btl_mx_prepare_src( struct mca_btl_base_module_t* btl,
frag->segment[1].seg_addr.pval = iov.iov_base;
}
frag->base.des_src = frag->segment;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -290,6 +296,7 @@ mca_btl_base_descriptor_t* mca_btl_mx_prepare_dst( struct mca_btl_base_module_t*
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -323,6 +330,7 @@ mca_btl_base_descriptor_t* mca_btl_mx_prepare_dst( struct mca_btl_base_module_t*
frag->base.des_dst = frag->segment;
frag->base.des_dst_cnt = 1;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}

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

@ -247,6 +247,7 @@ extern int mca_btl_mx_register(
*/
mca_btl_base_descriptor_t* mca_btl_mx_alloc( struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size );
@ -279,6 +280,7 @@ mca_btl_mx_prepare_src( struct mca_btl_base_module_t* btl,
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size );
@ -287,6 +289,7 @@ mca_btl_mx_prepare_dst( struct mca_btl_base_module_t* btl,
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size );

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

@ -360,12 +360,14 @@ int mca_btl_openib_register_error_cb(
*
* @param btl (IN) BTL module
* @param size (IN) Request segment size.
* @param size (IN) Size of segment to allocate
*
* When allocating a segment we pull a pre-alllocated segment
* from one of two free lists, an eager list and a max list
*/
mca_btl_base_descriptor_t* mca_btl_openib_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_openib_frag_t* frag = NULL;
@ -375,14 +377,27 @@ mca_btl_base_descriptor_t* mca_btl_openib_alloc(
if(size <= mca_btl_openib_component.eager_limit){
MCA_BTL_IB_FRAG_ALLOC_EAGER(btl, frag, rc);
if(order == MCA_BTL_NO_ORDER) {
order = BTL_OPENIB_HP_QP;
}
frag->base.order = order;
} else if(size <= mca_btl_openib_component.max_send_size) {
if(order == MCA_BTL_NO_ORDER) {
order = BTL_OPENIB_LP_QP;
} else if(order != BTL_OPENIB_LP_QP) {
return NULL;
}
MCA_BTL_IB_FRAG_ALLOC_MAX(btl, frag, rc);
frag->base.order = order;
}
if(NULL == frag)
return NULL;
frag->segment.seg_len = size <= openib_btl->super.btl_eager_limit ? size : openib_btl->super.btl_eager_limit;
frag->segment.seg_len =
size <= openib_btl->super.btl_eager_limit ? size : openib_btl->super.btl_eager_limit;
frag->base.des_flags = 0;
return (mca_btl_base_descriptor_t*)frag;
@ -442,6 +457,7 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
)
@ -496,7 +512,13 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
frag->segment.seg_len = max_data;
frag->segment.seg_addr.pval = iov.iov_base;
frag->segment.seg_key.key32[0] = (uint32_t)frag->sg_entry.lkey;
if(MCA_BTL_NO_ORDER == order) {
frag->base.order = BTL_OPENIB_LP_QP;
} else {
frag->base.order = order;
}
BTL_VERBOSE(("frag->sg_entry.lkey = %lu .addr = %llu "
"frag->segment.seg_key.key32[0] = %lu",
frag->sg_entry.lkey, frag->sg_entry.addr,
@ -509,13 +531,26 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
if(max_data + reserve <= btl->btl_eager_limit) {
/* the data is small enough to fit in the eager frag and
* memory is not prepinned */
MCA_BTL_IB_FRAG_ALLOC_EAGER(btl, frag, rc);
if(MCA_BTL_NO_ORDER == order) {
frag->base.order = BTL_OPENIB_LP_QP;
} else {
frag->base.order = order;
}
}
if(NULL == frag) {
/* the data doesn't fit into eager frag or eager frag is
* not available */
if(MCA_BTL_NO_ORDER == order) {
order = BTL_OPENIB_LP_QP;
} else if(BTL_OPENIB_HP_QP == order){
return NULL;
}
MCA_BTL_IB_FRAG_ALLOC_MAX(btl, frag, rc);
frag->base.order = order;
if(NULL == frag) {
return NULL;
}
@ -539,7 +574,9 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
return &frag->base;
}
@ -562,6 +599,7 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -607,6 +645,13 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_dst(
frag->base.des_src_cnt = 0;
frag->base.des_flags = 0;
if(MCA_BTL_NO_ORDER == order) {
frag->base.order = BTL_OPENIB_LP_QP;
} else {
frag->base.order = order;
}
BTL_VERBOSE(("frag->sg_entry.lkey = %lu .addr = %llu "
"frag->segment.seg_key.key32[0] = %lu",
frag->sg_entry.lkey, frag->sg_entry.addr,

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

@ -393,6 +393,7 @@ extern int mca_btl_openib_get(
*/
extern mca_btl_base_descriptor_t* mca_btl_openib_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size);
@ -419,6 +420,7 @@ mca_btl_base_descriptor_t* mca_btl_openib_prepare_src(
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -434,6 +436,7 @@ extern mca_btl_base_descriptor_t* mca_btl_openib_prepare_dst(
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);
/**

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

@ -177,9 +177,10 @@ static inline int mca_btl_openib_endpoint_post_send(mca_btl_openib_module_t* ope
int do_rdma = 0, prio;
frag->sg_entry.addr = (unsigned long) frag->hdr;
prio = (frag->base.des_flags & MCA_BTL_DES_FLAGS_PRIORITY) ?
BTL_OPENIB_HP_QP : BTL_OPENIB_LP_QP;
prio = frag->base.order;
/* (frag->base.des_flags & MCA_BTL_DES_FLAGS_PRIORITY) ? */
/* BTL_OPENIB_HP_QP : BTL_OPENIB_LP_QP; */
if(btl_openib_acquire_send_resources(openib_btl, endpoint, frag,
prio, &do_rdma) == OMPI_ERR_OUT_OF_RESOURCE)

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

@ -75,6 +75,7 @@ static void mca_btl_openib_recv_frag_common_constructor(mca_btl_openib_frag_t* f
static void mca_btl_openib_send_frag_eager_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_HP_QP;
frag->size = mca_btl_openib_component.eager_limit;
frag->type = MCA_BTL_OPENIB_FRAG_EAGER;
mca_btl_openib_send_frag_common_constructor(frag);
@ -83,6 +84,7 @@ static void mca_btl_openib_send_frag_eager_constructor(mca_btl_openib_frag_t* fr
static void mca_btl_openib_send_frag_max_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_LP_QP;
frag->size = mca_btl_openib_component.max_send_size;
frag->type = MCA_BTL_OPENIB_FRAG_MAX;
mca_btl_openib_send_frag_common_constructor(frag);
@ -90,6 +92,7 @@ static void mca_btl_openib_send_frag_max_constructor(mca_btl_openib_frag_t* frag
static void mca_btl_openib_recv_frag_max_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_LP_QP;
frag->size = mca_btl_openib_component.max_send_size;
frag->type = MCA_BTL_OPENIB_FRAG_MAX;
mca_btl_openib_recv_frag_common_constructor(frag);
@ -98,6 +101,7 @@ static void mca_btl_openib_recv_frag_max_constructor(mca_btl_openib_frag_t* frag
static void mca_btl_openib_recv_frag_eager_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_HP_QP;
frag->size = mca_btl_openib_component.eager_limit;
frag->type = MCA_BTL_OPENIB_FRAG_EAGER;
mca_btl_openib_recv_frag_common_constructor(frag);
@ -108,6 +112,7 @@ static void mca_btl_openib_recv_frag_eager_constructor(mca_btl_openib_frag_t* fr
static void mca_btl_openib_send_frag_frag_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_LP_QP;
frag->size = 0;
frag->type = MCA_BTL_OPENIB_SEND_FRAG_FRAG;
frag->registration = NULL;
@ -116,6 +121,7 @@ static void mca_btl_openib_send_frag_frag_constructor(mca_btl_openib_frag_t* fra
static void mca_btl_openib_recv_frag_frag_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_LP_QP;
frag->size = 0;
frag->type = MCA_BTL_OPENIB_RECV_FRAG_FRAG;
frag->registration = NULL;
@ -124,6 +130,7 @@ static void mca_btl_openib_recv_frag_frag_constructor(mca_btl_openib_frag_t* fra
static void mca_btl_openib_send_frag_control_constructor(mca_btl_openib_frag_t* frag)
{
frag->base.order = BTL_OPENIB_HP_QP;
frag->size = sizeof(mca_btl_openib_eager_rdma_header_t);
frag->type = MCA_BTL_OPENIB_FRAG_CONTROL;
mca_btl_openib_send_frag_common_constructor(frag);

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

@ -237,6 +237,7 @@ mca_btl_portals_register(struct mca_btl_base_module_t* btl_base,
mca_btl_base_descriptor_t*
mca_btl_portals_alloc(struct mca_btl_base_module_t* btl_base,
uint8_t order,
size_t size)
{
int rc;
@ -260,6 +261,7 @@ mca_btl_portals_alloc(struct mca_btl_base_module_t* btl_base,
frag->base.des_src_cnt = 1;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -304,6 +306,7 @@ mca_btl_portals_prepare_src(struct mca_btl_base_module_t* btl_base,
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -415,7 +418,7 @@ mca_btl_portals_prepare_src(struct mca_btl_base_module_t* btl_base,
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -425,6 +428,7 @@ mca_btl_portals_prepare_dst(struct mca_btl_base_module_t* btl_base,
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -500,7 +504,7 @@ mca_btl_portals_prepare_dst(struct mca_btl_base_module_t* btl_base,
OMPI_BTL_PORTALS_FRAG_RETURN_USER(&mca_btl_portals_module.super, frag);
return NULL;
}
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}

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

@ -172,6 +172,7 @@ int mca_btl_portals_register(struct mca_btl_base_module_t* btl_base,
mca_btl_base_descriptor_t*
mca_btl_portals_alloc(struct mca_btl_base_module_t* btl_base,
uint8_t order,
size_t size);
int mca_btl_portals_free(struct mca_btl_base_module_t* btl_base,
@ -182,6 +183,7 @@ mca_btl_portals_prepare_src(struct mca_btl_base_module_t* btl_base,
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);
@ -190,6 +192,7 @@ mca_btl_portals_prepare_dst(struct mca_btl_base_module_t* btl_base,
struct mca_btl_base_endpoint_t* peer,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);

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

@ -149,6 +149,7 @@ int mca_btl_self_register( struct mca_btl_base_module_t* btl,
* @param size (IN) Request segment size.
*/
mca_btl_base_descriptor_t* mca_btl_self_alloc( struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size )
{
mca_btl_self_frag_t* frag;
@ -206,6 +207,7 @@ struct mca_btl_base_descriptor_t* mca_btl_self_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -273,6 +275,7 @@ struct mca_btl_base_descriptor_t* mca_btl_self_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{

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

@ -163,6 +163,7 @@ int mca_btl_self_register(
*/
mca_btl_base_descriptor_t* mca_btl_self_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size
);
@ -188,6 +189,7 @@ struct mca_btl_base_descriptor_t* mca_btl_self_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -203,6 +205,7 @@ struct mca_btl_base_descriptor_t* mca_btl_self_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);

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

@ -699,6 +699,7 @@ int mca_btl_sm_register_error_cb(
*/
extern mca_btl_base_descriptor_t* mca_btl_sm_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_sm_frag_t* frag;
@ -745,6 +746,7 @@ struct mca_btl_base_descriptor_t* mca_btl_sm_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{

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

@ -267,6 +267,7 @@ extern int mca_btl_sm_register(
*/
extern mca_btl_base_descriptor_t* mca_btl_sm_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size
);
@ -293,6 +294,7 @@ struct mca_btl_base_descriptor_t* mca_btl_sm_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);

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

@ -186,6 +186,7 @@ int mca_btl_tcp_register(
mca_btl_base_descriptor_t* mca_btl_tcp_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_tcp_frag_t* frag;
@ -208,6 +209,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_alloc(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
frag->btl = (mca_btl_tcp_module_t*)btl;
return (mca_btl_base_descriptor_t*)frag;
}
@ -238,6 +240,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -307,6 +310,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
*size = max_data;
return &frag->base;
}
@ -331,6 +335,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -353,6 +358,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_prepare_dst(
frag->base.des_dst = frag->segments;
frag->base.des_dst_cnt = 1;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}

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

@ -286,6 +286,7 @@ extern int mca_btl_tcp_register(
extern mca_btl_base_descriptor_t* mca_btl_tcp_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size);
@ -320,6 +321,7 @@ mca_btl_base_descriptor_t* mca_btl_tcp_prepare_src(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -329,6 +331,7 @@ extern mca_btl_base_descriptor_t* mca_btl_tcp_prepare_dst(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);

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

@ -38,8 +38,9 @@ mca_btl_template_module_t mca_btl_template_module = {
0, /* max size of first fragment */
0, /* min send fragment size */
0, /* max send fragment size */
0, /* min rdma fragment size */
0, /* max rdma fragment size */
0, /* rdma pipeline offset */
0, /* rdma pipeline frag size */
0, /* min rdma pipeline size */
0, /* exclusivity */
0, /* latency */
0, /* bandwidth */
@ -164,6 +165,7 @@ int mca_btl_template_register(
mca_btl_base_descriptor_t* mca_btl_template_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_template_module_t* template_btl = (mca_btl_template_module_t*) btl;
@ -223,6 +225,7 @@ mca_btl_base_descriptor_t* mca_btl_template_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
)
@ -311,6 +314,7 @@ mca_btl_base_descriptor_t* mca_btl_template_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{

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

@ -258,6 +258,7 @@ extern int mca_btl_template_register(
extern mca_btl_base_descriptor_t* mca_btl_template_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size);
@ -292,6 +293,7 @@ mca_btl_base_descriptor_t* mca_btl_template_prepare_src(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -301,6 +303,7 @@ extern mca_btl_base_descriptor_t* mca_btl_template_prepare_dst(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);

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

@ -124,10 +124,12 @@ int mca_btl_template_component_open(void)
mca_btl_template_param_register_int ("min_send_size", 64*1024) - sizeof(mca_btl_base_header_t);
mca_btl_template_module.super.btl_max_send_size =
mca_btl_template_param_register_int ("max_send_size", 128*1024) - sizeof(mca_btl_base_header_t);
mca_btl_template_module.super.btl_min_rdma_size =
mca_btl_template_param_register_int("min_rdma_size", 1024*1024);
mca_btl_template_module.super.btl_max_rdma_size =
mca_btl_template_param_register_int("max_rdma_size", 1024*1024);
mca_btl_template_module.super.btl_min_rdma_pipeline_size =
mca_btl_template_param_register_int("min_rdma_pipeline_size", 1024*1024);
mca_btl_template_module.super.btl_rdma_pipeline_frag_size =
mca_btl_template_param_register_int("rdma_pipeline_frag_size", 1024*1024);
mca_btl_template_module.super.btl_rdma_pipeline_offset =
mca_btl_template_param_register_int("rdma_pipeline_offset", 1024*1024);
mca_btl_template_module.super.btl_flags =
mca_btl_template_param_register_int("flags", MCA_BTL_FLAGS_PUT);
return OMPI_SUCCESS;

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

@ -691,6 +691,7 @@ int mca_btl_udapl_register(
mca_btl_base_descriptor_t* mca_btl_udapl_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size)
{
mca_btl_udapl_module_t* udapl_btl = (mca_btl_udapl_module_t*) btl;
@ -730,7 +731,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_alloc(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -775,6 +776,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
)
@ -832,7 +834,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
}
@ -879,7 +881,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}
@ -902,6 +904,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_dst(
struct mca_btl_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size)
{
@ -941,6 +944,8 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_dst(
frag->segment.seg_key.key32[0] =
((mca_btl_udapl_reg_t*)registration)->rmr_context;
frag->base.order = MCA_BTL_NO_ORDER;
return &frag->base;
}

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

@ -337,6 +337,7 @@ extern int mca_btl_udapl_register(
extern mca_btl_base_descriptor_t* mca_btl_udapl_alloc(
struct mca_btl_base_module_t* btl,
uint8_t order,
size_t size);
@ -371,6 +372,7 @@ mca_btl_base_descriptor_t* mca_btl_udapl_prepare_src(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size
);
@ -380,6 +382,7 @@ extern mca_btl_base_descriptor_t* mca_btl_udapl_prepare_dst(
struct mca_btl_base_endpoint_t* peer,
struct mca_mpool_base_registration_t*,
struct ompi_convertor_t* convertor,
uint8_t order,
size_t reserve,
size_t* size);

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

@ -427,9 +427,11 @@ static inline int mca_btl_udapl_sendrecv(mca_btl_udapl_module_t* btl,
int rc;
/* Post a receive to get the peer's address data */
frag = (mca_btl_udapl_frag_t*)mca_btl_udapl_alloc(
(mca_btl_base_module_t*)btl, sizeof(mca_btl_udapl_addr_t) +
sizeof(int32_t));
frag = (mca_btl_udapl_frag_t*)
mca_btl_udapl_alloc(
(mca_btl_base_module_t*)btl, MCA_BTL_NO_ORDER,
sizeof(mca_btl_udapl_addr_t) +
sizeof(int32_t));
cookie.as_ptr = frag;
frag->type = MCA_BTL_UDAPL_CONN_RECV;
@ -449,9 +451,12 @@ static inline int mca_btl_udapl_sendrecv(mca_btl_udapl_module_t* btl,
/* Send our local address data over this EP */
frag = (mca_btl_udapl_frag_t*)mca_btl_udapl_alloc(
(mca_btl_base_module_t*)btl, sizeof(mca_btl_udapl_addr_t) +
sizeof(int32_t));
frag = (mca_btl_udapl_frag_t*)
mca_btl_udapl_alloc(
(mca_btl_base_module_t*)btl,
MCA_BTL_NO_ORDER,
sizeof(mca_btl_udapl_addr_t) +
sizeof(int32_t));
cookie.as_ptr = frag;
memcpy(frag->segment.seg_addr.pval,

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

@ -221,6 +221,7 @@ ompi_osc_rdma_sendreq_send(ompi_osc_rdma_module_t *module,
endpoint = (mca_bml_base_endpoint_t*) sendreq->req_target_proc->proc_bml;
bml_btl = mca_bml_base_btl_array_get_next(&endpoint->btl_eager);
descriptor = bml_btl->btl_alloc(bml_btl->btl,
MCA_BTL_NO_ORDER,
needed_len < bml_btl->btl_eager_limit ? needed_len :
bml_btl->btl_eager_limit);
if (NULL == descriptor) {
@ -428,6 +429,7 @@ ompi_osc_rdma_replyreq_send(ompi_osc_rdma_module_t *module,
endpoint = (mca_bml_base_endpoint_t*) replyreq->rep_origin_proc->proc_bml;
bml_btl = mca_bml_base_btl_array_get_next(&endpoint->btl_eager);
descriptor = bml_btl->btl_alloc(bml_btl->btl,
MCA_BTL_NO_ORDER,
bml_btl->btl_eager_limit);
if (NULL == descriptor) {
ret = OMPI_ERR_TEMP_OUT_OF_RESOURCE;
@ -827,6 +829,7 @@ ompi_osc_rdma_control_send(ompi_osc_rdma_module_t *module,
endpoint = (mca_bml_base_endpoint_t*) proc->proc_bml;
bml_btl = mca_bml_base_btl_array_get_next(&endpoint->btl_eager);
descriptor = bml_btl->btl_alloc(bml_btl->btl,
MCA_BTL_NO_ORDER,
sizeof(ompi_osc_rdma_control_header_t));
if (NULL == descriptor) {
ret = OMPI_ERR_TEMP_OUT_OF_RESOURCE;

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

@ -237,9 +237,9 @@ extern int mca_pml_dr_ft_event(int state);
#endif
#define MCA_PML_DR_DES_ALLOC(bml_btl, des, size) \
MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, \
sizeof(mca_pml_dr_hdr_t) + (sizeof(mca_btl_base_segment_t) << 4), size)
#define MCA_PML_DR_DES_ALLOC(bml_btl, des, size) \
MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, MCA_BTL_NO_ORDER, \
sizeof(mca_pml_dr_hdr_t) + (sizeof(mca_btl_base_segment_t) << 4),size)
#endif

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

@ -383,7 +383,8 @@ int mca_pml_dr_send_request_start_buffered(
(bml_btl->btl_flags & MCA_BTL_FLAGS_NEED_CSUM);
/* allocate descriptor */
mca_bml_base_alloc(bml_btl, &descriptor, sizeof(mca_pml_dr_rendezvous_hdr_t) + size);
mca_bml_base_alloc(bml_btl, &descriptor, MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_rendezvous_hdr_t) + size);
if(NULL == descriptor) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
@ -497,7 +498,9 @@ int mca_pml_dr_send_request_start_copy(
(bml_btl->btl_flags & MCA_BTL_FLAGS_NEED_CSUM);
/* allocate descriptor */
mca_bml_base_alloc(bml_btl, &descriptor, sizeof(mca_pml_dr_match_hdr_t) + size);
mca_bml_base_alloc(bml_btl, &descriptor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_match_hdr_t) + size);
if(NULL == descriptor) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
@ -585,6 +588,7 @@ int mca_pml_dr_send_request_start_prepare(
bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_match_hdr_t),
&size,
&descriptor);
@ -656,6 +660,7 @@ int mca_pml_dr_send_request_start_rndv(
mca_bml_base_alloc(
bml_btl,
&des,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_rendezvous_hdr_t)
);
} else {
@ -663,6 +668,7 @@ int mca_pml_dr_send_request_start_rndv(
bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_rendezvous_hdr_t),
&size,
&des);
@ -774,6 +780,7 @@ int mca_pml_dr_send_request_schedule(mca_pml_dr_send_request_t* sendreq)
bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_frag_hdr_t),
&size,
&des
@ -898,6 +905,7 @@ int mca_pml_dr_send_request_schedule(mca_pml_dr_send_request_t* sendreq)
bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_dr_frag_hdr_t),
&size,
&des

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

@ -374,7 +374,7 @@ do { \
\
des_old = sendreq->req_descriptor; \
mca_bml_base_alloc(vfrag->bml_btl, &des_new, \
des_old->des_src->seg_len); \
MCA_BTL_NO_ORDER, des_old->des_src->seg_len); \
sendreq->req_descriptor = des_new; \
memcpy(des_new->des_src->seg_addr.pval, \
des_old->des_src->seg_addr.pval, \
@ -406,6 +406,7 @@ do { \
\
assert(sendreq->req_descriptor->des_src != NULL); \
mca_bml_base_alloc(bml_btl, &des_new, \
MCA_BTL_NO_ORDER, \
sizeof(mca_pml_dr_rendezvous_hdr_t)); \
des_old = sendreq->req_descriptor; \
/* build hdr */ \

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

@ -249,18 +249,20 @@ static void mca_pml_ob1_fin_completion(
MCA_PML_OB1_PROGRESS_PENDING(bml_btl);
}
int mca_pml_ob1_send_fin_btl(
int mca_pml_ob1_send_fin(
ompi_proc_t* proc,
mca_bml_base_btl_t* bml_btl,
void *hdr_des
void *hdr_des,
uint8_t order
)
{
mca_btl_base_descriptor_t* fin;
mca_pml_ob1_fin_hdr_t* hdr;
int rc;
MCA_PML_OB1_DES_ALLOC(bml_btl, fin, sizeof(mca_pml_ob1_fin_hdr_t));
MCA_PML_OB1_DES_ALLOC(bml_btl, fin, order, sizeof(mca_pml_ob1_fin_hdr_t));
if(NULL == fin) {
MCA_PML_OB1_ADD_FIN_TO_PENDING(proc, hdr_des, bml_btl, order);
return OMPI_ERR_OUT_OF_RESOURCE;
}
fin->des_flags |= MCA_BTL_DES_FLAGS_PRIORITY;
@ -347,12 +349,13 @@ void mca_pml_ob1_process_pending_packets(mca_bml_base_btl_t* bml_btl)
}
break;
case MCA_PML_OB1_HDR_TYPE_FIN:
rc = mca_pml_ob1_send_fin_btl(pckt->proc, send_dst,
pckt->hdr.hdr_fin.hdr_des.pval);
rc = mca_pml_ob1_send_fin(pckt->proc, send_dst,
pckt->hdr.hdr_fin.hdr_des.pval,
pckt->order);
MCA_PML_OB1_PCKT_PENDING_RETURN(pckt);
if(OMPI_ERR_OUT_OF_RESOURCE == rc) {
MCA_PML_OB1_ADD_FIN_TO_PENDING(pckt->proc,
pckt->hdr.hdr_fin.hdr_des.pval, pckt->bml_btl);
MCA_PML_OB1_ADD_FIN_TO_PENDING(pckt->proc,
pckt->hdr.hdr_fin.hdr_des.pval, pckt->bml_btl, pckt->order);
return;
}
break;

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

@ -224,8 +224,8 @@ extern int mca_pml_ob1_ft_event(
}
#endif
#define MCA_PML_OB1_DES_ALLOC(bml_btl, des, size) \
MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, \
#define MCA_PML_OB1_DES_ALLOC(bml_btl, des, order, size) \
MCA_BML_BASE_BTL_DES_ALLOC(bml_btl, des, order, \
sizeof(mca_pml_ob1_hdr_t) + (sizeof(mca_btl_base_segment_t) << 4), size)
@ -246,6 +246,7 @@ struct mca_pml_ob1_pckt_pending_t {
ompi_proc_t* proc;
mca_pml_ob1_hdr_t hdr;
struct mca_bml_base_btl_t *bml_btl;
uint8_t order;
};
typedef struct mca_pml_ob1_pckt_pending_t mca_pml_ob1_pckt_pending_t;
OBJ_CLASS_DECLARATION(mca_pml_ob1_pckt_pending_t);
@ -264,7 +265,7 @@ do { \
(ompi_free_list_item_t*)pckt); \
} while(0)
#define MCA_PML_OB1_ADD_FIN_TO_PENDING(P, D, B) \
#define MCA_PML_OB1_ADD_FIN_TO_PENDING(P, D, B, O) \
do { \
mca_pml_ob1_pckt_pending_t *_pckt; \
int _rc; \
@ -274,6 +275,7 @@ do { \
_pckt->hdr.hdr_fin.hdr_des.pval = (D); \
_pckt->proc = (P); \
_pckt->bml_btl = (B); \
_pckt->order = (O); \
OPAL_THREAD_LOCK(&mca_pml_ob1.lock); \
opal_list_append(&mca_pml_ob1.pckt_pending, \
(opal_list_item_t*)_pckt); \
@ -281,42 +283,10 @@ do { \
} while(0)
int mca_pml_ob1_send_fin_btl(ompi_proc_t* proc, mca_bml_base_btl_t* bml_btl,
void *hdr_des);
static inline int mca_pml_ob1_send_fin(ompi_proc_t* proc, void *hdr_des,
mca_bml_base_btl_t* bml_btl)
{
size_t i;
mca_bml_base_endpoint_t* endpoint =
(mca_bml_base_endpoint_t*)proc->proc_bml;
int mca_pml_ob1_send_fin(ompi_proc_t* proc, mca_bml_base_btl_t* bml_btl,
void *hdr_des, uint8_t order);
/* Some BTLs (e.g TCP) can report put/get completion before data actually
* hits the buffer on the other side. For this kind of BTLs we need to send
* FIN through the same BTL PUT was performed with so network will handle
* ordering for us. If we will use another BTL, receiver can get FIN before
* data will hit the buffer and complete request prematurely. We mark such
* problematic BTLs with MCA_BTL_FLAGS_FAKE_RDMA flag (this kind of RDMA
* is really fake, because the real one guaranties that sender will see the
* completion only after receiver's NIC confirmed that all the data was
* received)
*/
if(bml_btl->btl_flags & MCA_BTL_FLAGS_FAKE_RDMA) {
if(mca_pml_ob1_send_fin_btl(proc, bml_btl, hdr_des) == OMPI_SUCCESS)
return OMPI_SUCCESS;
} else {
for(i = 0; i < mca_bml_base_btl_array_get_size(&endpoint->btl_eager);
i++) {
bml_btl = mca_bml_base_btl_array_get_next(&endpoint->btl_eager);
if(mca_pml_ob1_send_fin_btl(proc, bml_btl, hdr_des) == OMPI_SUCCESS)
return OMPI_SUCCESS;
}
bml_btl = NULL;
}
MCA_PML_OB1_ADD_FIN_TO_PENDING(proc, hdr_des, bml_btl);
return OMPI_ERR_OUT_OF_RESOURCE;
}
/* This function tries to resend FIN/ACK packets from pckt_pending queue.
* Packets are added to the queue when sending of FIN or ACK is failed due to
* resource unavailability. bml_btl passed to the function doesn't represents

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

@ -186,7 +186,7 @@ int mca_pml_ob1_recv_request_ack_send_btl(
int rc;
/* allocate descriptor */
MCA_PML_OB1_DES_ALLOC(bml_btl, des, sizeof(mca_pml_ob1_ack_hdr_t));
MCA_PML_OB1_DES_ALLOC(bml_btl, des, MCA_BTL_NO_ORDER, sizeof(mca_pml_ob1_ack_hdr_t));
if(NULL == des) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
@ -307,7 +307,9 @@ static void mca_pml_ob1_rget_completion(
}
mca_pml_ob1_send_fin(recvreq->req_recv.req_base.req_proc,
frag->rdma_hdr.hdr_rget.hdr_des.pval, bml_btl);
bml_btl,
frag->rdma_hdr.hdr_rget.hdr_des.pval,
des->order);
/* is receive request complete */
if( OPAL_THREAD_ADD_SIZE_T(&recvreq->req_bytes_received, frag->rdma_length)
@ -343,6 +345,7 @@ int mca_pml_ob1_recv_request_get_frag(
bml_btl,
NULL,
&recvreq->req_recv.req_convertor,
MCA_BTL_NO_ORDER,
0,
&frag->rdma_length,
&descriptor);
@ -677,8 +680,9 @@ int mca_pml_ob1_recv_request_schedule_exclusive( mca_pml_ob1_recv_request_t* rec
}
/* prepare a descriptor for RDMA */
mca_bml_base_prepare_dst(bml_btl, reg,
&recvreq->req_recv.req_convertor, 0, &size, &dst);
mca_bml_base_prepare_dst(bml_btl, reg,
&recvreq->req_recv.req_convertor, MCA_BTL_NO_ORDER,
0, &size, &dst);
if(dst == NULL) {
continue;
}
@ -693,7 +697,7 @@ int mca_pml_ob1_recv_request_schedule_exclusive( mca_pml_ob1_recv_request_t* rec
(dst->des_dst_cnt-1));
}
MCA_PML_OB1_DES_ALLOC(bml_btl, ctl, hdr_size);
MCA_PML_OB1_DES_ALLOC(bml_btl, ctl, MCA_BTL_NO_ORDER, hdr_size);
if(ctl == NULL) {
mca_bml_base_free(bml_btl,dst);
continue;

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

@ -386,7 +386,8 @@ int mca_pml_ob1_send_request_start_buffered(
int rc;
/* allocate descriptor */
mca_bml_base_alloc(bml_btl, &descriptor, sizeof(mca_pml_ob1_rendezvous_hdr_t) + size);
mca_bml_base_alloc(bml_btl, &descriptor,
MCA_BTL_NO_ORDER, sizeof(mca_pml_ob1_rendezvous_hdr_t) + size);
if(NULL == descriptor) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
@ -498,6 +499,7 @@ int mca_pml_ob1_send_request_start_copy( mca_pml_ob1_send_request_t* sendreq,
/* allocate descriptor */
if( 0 == size ) {
MCA_PML_OB1_DES_ALLOC( bml_btl, descriptor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_match_hdr_t) );
if( OPAL_UNLIKELY(NULL == descriptor) ) {
return OMPI_ERR_OUT_OF_RESOURCE;
@ -506,6 +508,7 @@ int mca_pml_ob1_send_request_start_copy( mca_pml_ob1_send_request_t* sendreq,
descriptor->des_cbfunc = mca_pml_ob1_match_completion_cache;
} else {
mca_bml_base_alloc( bml_btl, &descriptor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_match_hdr_t) + size );
if( OPAL_UNLIKELY(NULL == descriptor) ) {
return OMPI_ERR_OUT_OF_RESOURCE;
@ -587,6 +590,7 @@ int mca_pml_ob1_send_request_start_prepare( mca_pml_ob1_send_request_t* sendreq,
mca_bml_base_prepare_src( bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_match_hdr_t),
&size,
&descriptor);
@ -673,6 +677,7 @@ int mca_pml_ob1_send_request_start_rdma(
bml_btl,
reg,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
0,
&size,
&src);
@ -685,7 +690,7 @@ int mca_pml_ob1_send_request_start_rdma(
src->des_cbdata = sendreq;
/* allocate space for get hdr + segment list */
mca_bml_base_alloc(bml_btl, &des,
mca_bml_base_alloc(bml_btl, &des, MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_rget_hdr_t) + (sizeof(mca_btl_base_segment_t)*(src->des_src_cnt-1)));
if(NULL == des) {
ompi_convertor_set_position(&sendreq->req_send.req_convertor,
@ -747,7 +752,8 @@ int mca_pml_ob1_send_request_start_rdma(
* receiver will schedule rdma put(s) of the entire message
*/
mca_bml_base_alloc(bml_btl, &des, sizeof(mca_pml_ob1_rendezvous_hdr_t));
mca_bml_base_alloc(bml_btl, &des,
MCA_BTL_NO_ORDER, sizeof(mca_pml_ob1_rendezvous_hdr_t));
if(NULL == des) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
@ -819,6 +825,7 @@ int mca_pml_ob1_send_request_start_rndv(
mca_bml_base_alloc(
bml_btl,
&des,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_rendezvous_hdr_t)
);
} else {
@ -826,6 +833,7 @@ int mca_pml_ob1_send_request_start_rndv(
bml_btl,
NULL,
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_rendezvous_hdr_t),
&size,
&des);
@ -954,8 +962,9 @@ int mca_pml_ob1_send_request_schedule_exclusive(
&sendreq->req_send_offset);
mca_bml_base_prepare_src(bml_btl, NULL,
&sendreq->req_send.req_convertor,
sizeof(mca_pml_ob1_frag_hdr_t), &size, &des);
&sendreq->req_send.req_convertor,
MCA_BTL_NO_ORDER,
sizeof(mca_pml_ob1_frag_hdr_t), &size, &des);
if(des == NULL) {
continue;
}
@ -1042,12 +1051,14 @@ static void mca_pml_ob1_put_completion( mca_btl_base_module_t* btl,
}
mca_pml_ob1_send_fin(sendreq->req_send.req_base.req_proc,
frag->rdma_hdr.hdr_rdma.hdr_des.pval, bml_btl);
bml_btl,
frag->rdma_hdr.hdr_rdma.hdr_des.pval,
des->order);
/* check for request completion */
if( OPAL_THREAD_ADD_SIZE_T(&sendreq->req_bytes_delivered, frag->rdma_length)
>= sendreq->req_send.req_bytes_packed) {
/* if we've got completion on rndv packet */
if (sendreq->req_state == 2) {
MCA_PML_OB1_SEND_REQUEST_PML_COMPLETE(sendreq);
@ -1077,6 +1088,7 @@ int mca_pml_ob1_send_request_put_frag( mca_pml_ob1_rdma_frag_t* frag )
mca_bml_base_prepare_src( bml_btl,
reg,
&frag->convertor,
MCA_BTL_NO_ORDER,
0,
&frag->rdma_length,
&des );