@@ -51,7 +51,7 @@ mca_btl_base_descriptor_t *mca_btl_uct_alloc(mca_btl_base_module_t *btl,
51
51
}
52
52
53
53
static inline void _mca_btl_uct_send_pack (void * data , void * header , size_t header_size ,
54
- opal_convertor_t * convertor , size_t payload_size )
54
+ opal_convertor_t * convertor , size_t * payload_size )
55
55
{
56
56
uint32_t iov_count = 1 ;
57
57
struct iovec iov ;
@@ -64,11 +64,9 @@ static inline void _mca_btl_uct_send_pack(void *data, void *header, size_t heade
64
64
65
65
/* pack the data into the supplied buffer */
66
66
iov .iov_base = (IOVBASE_TYPE * ) ((intptr_t ) data + header_size );
67
- iov .iov_len = length = payload_size ;
67
+ iov .iov_len = * payload_size ;
68
68
69
- (void ) opal_convertor_pack (convertor , & iov , & iov_count , & length );
70
-
71
- assert (length == payload_size );
69
+ (void ) opal_convertor_pack (convertor , & iov , & iov_count , payload_size );
72
70
}
73
71
74
72
struct mca_btl_base_descriptor_t * mca_btl_uct_prepare_src (mca_btl_base_module_t * btl ,
@@ -92,7 +90,10 @@ struct mca_btl_base_descriptor_t *mca_btl_uct_prepare_src(mca_btl_base_module_t
92
90
}
93
91
94
92
_mca_btl_uct_send_pack ((void * ) ((intptr_t ) frag -> uct_iov .buffer + reserve ), NULL , 0 ,
95
- convertor , * size );
93
+ convertor , size );
94
+ /* update the length of the fragment according to the convertor packed data */
95
+ frag -> segments [0 ].seg_len = reserve + * size ;
96
+ frag -> uct_iov .length = frag -> segments [0 ].seg_len ;
96
97
} else {
97
98
opal_convertor_get_current_pointer (convertor , & data_ptr );
98
99
assert (NULL != data_ptr );
@@ -286,7 +287,7 @@ static size_t mca_btl_uct_sendi_pack(void *data, void *arg)
286
287
287
288
am_header -> value = args -> am_header ;
288
289
_mca_btl_uct_send_pack ((void * ) ((intptr_t ) data + 8 ), args -> header , args -> header_size ,
289
- args -> convertor , args -> payload_size );
290
+ args -> convertor , & args -> payload_size );
290
291
return args -> header_size + args -> payload_size + 8 ;
291
292
}
292
293
@@ -329,9 +330,18 @@ int mca_btl_uct_sendi(mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpo
329
330
} else if (msg_size < (size_t ) MCA_BTL_UCT_TL_ATTR (uct_btl -> am_tl , context -> context_id )
330
331
.cap .am .max_short ) {
331
332
int8_t * data = alloca (total_size );
332
- _mca_btl_uct_send_pack (data , header , header_size , convertor , payload_size );
333
- ucs_status = uct_ep_am_short (ep_handle , MCA_BTL_UCT_FRAG , am_header .value , data ,
334
- total_size );
333
+ size_t packed_payload_size = payload_size ;
334
+ _mca_btl_uct_send_pack (data , header , header_size , convertor , & packed_payload_size );
335
+ if (packed_payload_size != payload_size ) {
336
+ /* This should never happen as the packed data should go in a single pack. But
337
+ in case it does, fallback onto a descriptor allocation and let the caller
338
+ send the data.
339
+ */
340
+ ucs_status = UCS_ERR_NO_RESOURCE ;
341
+ } else {
342
+ ucs_status = uct_ep_am_short (ep_handle , MCA_BTL_UCT_FRAG , am_header .value , data ,
343
+ total_size );
344
+ }
335
345
} else {
336
346
ssize_t size ;
337
347
0 commit comments