Release the memory if we fail to open an MX endpoint.
This commit was SVN r19871.
Этот коммит содержится в:
родитель
9528d33e90
Коммит
ef3d8cd2a1
@ -425,7 +425,7 @@ static int mca_btl_mx_sendi( struct mca_btl_base_module_t* btl,
|
||||
{
|
||||
mca_btl_mx_module_t* mx_btl = (mca_btl_mx_module_t*) btl;
|
||||
size_t max_data;
|
||||
|
||||
|
||||
if( OPAL_UNLIKELY(MCA_BTL_MX_CONNECTED != ((mca_btl_mx_endpoint_t*)endpoint)->status) ) {
|
||||
if( MCA_BTL_MX_NOT_REACHEABLE == ((mca_btl_mx_endpoint_t*)endpoint)->status )
|
||||
return OMPI_ERROR;
|
||||
@ -434,35 +434,35 @@ static int mca_btl_mx_sendi( struct mca_btl_base_module_t* btl,
|
||||
if( OMPI_SUCCESS != mca_btl_mx_proc_connect( (mca_btl_mx_endpoint_t*)endpoint ) )
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
|
||||
if( !ompi_convertor_need_buffers(convertor) ) {
|
||||
uint32_t mx_segment_count = 0;
|
||||
uint64_t tag64 = 0x01ULL | (((uint64_t)tag) << 8);
|
||||
mx_return_t mx_return;
|
||||
mx_request_t mx_request;
|
||||
mx_segment_t mx_segments[2], *mx_segment = mx_segments;
|
||||
|
||||
if( 0 != header_size ) {
|
||||
mx_segment->segment_ptr = header;
|
||||
mx_segment->segment_length = header_size;
|
||||
mx_segment++;
|
||||
mx_segment_count++;
|
||||
}
|
||||
if( 0 != payload_size ) {
|
||||
struct iovec iov;
|
||||
uint32_t iov_count = 1;
|
||||
|
||||
iov.iov_base = NULL;
|
||||
iov.iov_len = payload_size;
|
||||
|
||||
(void)ompi_convertor_pack( convertor, &iov, &iov_count, &max_data );
|
||||
assert( max_data == payload_size );
|
||||
|
||||
mx_segment->segment_ptr = iov.iov_base;
|
||||
mx_segment->segment_length = max_data;
|
||||
mx_segment_count++;
|
||||
}
|
||||
|
||||
|
||||
if( 0 != header_size ) {
|
||||
mx_segment->segment_ptr = header;
|
||||
mx_segment->segment_length = header_size;
|
||||
mx_segment++;
|
||||
mx_segment_count++;
|
||||
}
|
||||
if( 0 != payload_size ) {
|
||||
struct iovec iov;
|
||||
uint32_t iov_count = 1;
|
||||
|
||||
iov.iov_base = NULL;
|
||||
iov.iov_len = payload_size;
|
||||
|
||||
(void)ompi_convertor_pack( convertor, &iov, &iov_count, &max_data );
|
||||
assert( max_data == payload_size );
|
||||
|
||||
mx_segment->segment_ptr = iov.iov_base;
|
||||
mx_segment->segment_length = max_data;
|
||||
mx_segment_count++;
|
||||
}
|
||||
|
||||
mx_return = mx_isend( mx_btl->mx_endpoint, mx_segments, mx_segment_count,
|
||||
endpoint->mx_peer_addr, tag64, NULL, &mx_request );
|
||||
if( OPAL_UNLIKELY(MX_SUCCESS != mx_return) ) {
|
||||
@ -470,25 +470,25 @@ static int mca_btl_mx_sendi( struct mca_btl_base_module_t* btl,
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
#ifdef HAVE_MX_FORGET
|
||||
{
|
||||
uint32_t mx_result;
|
||||
mx_return = mx_ibuffered( mx_btl->mx_endpoint, &mx_request, &mx_result );
|
||||
if( OPAL_UNLIKELY(MX_SUCCESS != mx_return) ) {
|
||||
opal_output( 0, "mx_ibuffered failed with error %d (%s)\n",
|
||||
mx_return, mx_strerror(mx_return) );
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
if( mx_result ) {
|
||||
mx_return = mx_forget( mx_btl->mx_endpoint, &mx_request );
|
||||
if( OPAL_UNLIKELY(MX_SUCCESS != mx_return) ) {
|
||||
opal_output( 0, "mx_forget failed with error %d (%s)\n",
|
||||
mx_return, mx_strerror(mx_return) );
|
||||
}
|
||||
}
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
{
|
||||
uint32_t mx_result;
|
||||
mx_return = mx_ibuffered( mx_btl->mx_endpoint, &mx_request, &mx_result );
|
||||
if( OPAL_UNLIKELY(MX_SUCCESS != mx_return) ) {
|
||||
opal_output( 0, "mx_ibuffered failed with error %d (%s)\n",
|
||||
mx_return, mx_strerror(mx_return) );
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
if( mx_result ) {
|
||||
mx_return = mx_forget( mx_btl->mx_endpoint, &mx_request );
|
||||
if( OPAL_UNLIKELY(MX_SUCCESS != mx_return) ) {
|
||||
opal_output( 0, "mx_forget failed with error %d (%s)\n",
|
||||
mx_return, mx_strerror(mx_return) );
|
||||
}
|
||||
}
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
/* No optimization on this path. Just allocate a descriptor and return it
|
||||
* to the user.
|
||||
*/
|
||||
|
@ -427,7 +427,7 @@ mca_btl_base_module_t** mca_btl_mx_component_init(int *num_btl_modules,
|
||||
mx_return_t status;
|
||||
uint32_t size, count;
|
||||
int32_t i;
|
||||
uint64_t *nic_addrs;
|
||||
uint64_t *nic_addrs = NULL;
|
||||
mca_btl_mx_addr_t *mx_addrs;
|
||||
|
||||
*num_btl_modules = 0;
|
||||
@ -496,13 +496,11 @@ mca_btl_base_module_t** mca_btl_mx_component_init(int *num_btl_modules,
|
||||
&mca_btl_mx_component.mx_num_btls, sizeof(uint32_t))) != MX_SUCCESS ) {
|
||||
opal_output( 0, "mca_btl_mx_component_init: mx_get_info(MX_NIC_COUNT) failed with status %d(%s)\n",
|
||||
status, mx_strerror(status) );
|
||||
ompi_modex_send(&mca_btl_mx_component.super.btl_version, NULL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (0 == mca_btl_mx_component.mx_num_btls) {
|
||||
mca_btl_base_error_no_nics("Myrinet/MX", "NIC");
|
||||
ompi_modex_send(&mca_btl_mx_component.super.btl_version, NULL, 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -530,13 +528,15 @@ mca_btl_base_module_t** mca_btl_mx_component_init(int *num_btl_modules,
|
||||
*/
|
||||
mca_btl_mx_component.mx_btls = malloc( mca_btl_mx_component.mx_num_btls * sizeof(mca_btl_base_module_t*) );
|
||||
if( NULL == mca_btl_mx_component.mx_btls ) {
|
||||
opal_output( 0, "MX BTL no memory\n" );
|
||||
if( NULL != nic_addrs) free( nic_addrs );
|
||||
opal_output( 0, "MX BTL unable to allocate memory\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mx_addrs = (mca_btl_mx_addr_t*)calloc( mca_btl_mx_component.mx_num_btls, sizeof(mca_btl_mx_addr_t) );
|
||||
if( NULL == mx_addrs ) {
|
||||
free( nic_addrs );
|
||||
if( NULL != nic_addrs) free( nic_addrs );
|
||||
opal_output( 0, "MX BTL unable to allocate memory\n" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -558,18 +558,22 @@ mca_btl_base_module_t** mca_btl_mx_component_init(int *num_btl_modules,
|
||||
BTL_MX_ADDR_HTON(mx_addrs[count]);
|
||||
#endif
|
||||
mca_btl_mx_component.mx_btls[count] = mx_btl;
|
||||
count++; /* one more succesfully initialized MX interface */
|
||||
count++; /* one more succesfully initialized MX interface */
|
||||
}
|
||||
mca_btl_mx_component.mx_num_btls = count;
|
||||
*num_btl_modules = count;
|
||||
if( 0 == count ) {
|
||||
/* No active BTL module */
|
||||
free(nic_addrs);
|
||||
free(mx_addrs);
|
||||
free(mca_btl_mx_component.mx_btls);
|
||||
mca_btl_mx_component.mx_btls = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* publish the MX addresses via the MCA framework */
|
||||
ompi_modex_send(&mca_btl_mx_component.super.btl_version, mx_addrs,
|
||||
sizeof(mca_btl_mx_addr_t) * mca_btl_mx_component.mx_num_btls);
|
||||
sizeof(mca_btl_mx_addr_t) * mca_btl_mx_component.mx_num_btls);
|
||||
|
||||
free( nic_addrs );
|
||||
free( mx_addrs );
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user