@@ -165,12 +165,12 @@ ucp_proto_request_set_stage(ucp_request_t *req, uint8_t proto_stage)
165165{
166166 const ucp_proto_t *proto = req->send .proto_config ->proto ;
167167
168- ucs_assertv (proto_stage < UCP_PROTO_STAGE_LAST , " stage=%" PRIu8,
168+ ucs_assertv (proto_stage < UCP_PROTO_STAGE_LAST , " stage=%" PRIu8,
169169 proto_stage);
170170 ucs_assert (proto->progress [proto_stage] != NULL );
171171
172172 ucp_trace_req (req, " set to stage %u, progress function '%s'" , proto_stage,
173- ucs_debug_get_symbol_name (proto->progress [proto_stage]));
173+ ucs_debug_get_symbol_name (( void *) proto->progress [proto_stage]));
174174 req->send .proto_stage = proto_stage;
175175
176176 /* Set pointer to progress function */
@@ -186,7 +186,7 @@ static void ucp_proto_request_set_proto(ucp_request_t *req,
186186 const ucp_proto_config_t *proto_config,
187187 size_t msg_length)
188188{
189- ucs_assertv (req->flags & UCP_REQUEST_FLAG_PROTO_SEND , " flags=0x%" PRIx32,
189+ ucs_assertv (req->flags & UCP_REQUEST_FLAG_PROTO_SEND , " flags=0x%" PRIx32,
190190 req->flags );
191191
192192 req->send .proto_config = proto_config;
@@ -346,6 +346,7 @@ ucp_proto_request_pack_rkey(ucp_request_t *req, ucp_md_map_t md_map,
346346 const ucs_sys_dev_distance_t *dev_distance,
347347 void *rkey_buffer)
348348{
349+ ucp_context_h context = req->send .ep ->worker ->context ;
349350 const ucp_datatype_iter_t *dt_iter = &req->send .state .dt_iter ;
350351 ucp_mem_h memh;
351352 ssize_t packed_rkey_size;
@@ -366,17 +367,19 @@ ucp_proto_request_pack_rkey(ucp_request_t *req, ucp_md_map_t md_map,
366367 ucs_unlikely (memh->flags & UCP_MEMH_FLAG_HAS_AUTO_GVA )) {
367368 ucp_memh_disable_gva (memh, md_map);
368369 }
369-
370370 if (!ucs_test_all_flags (memh->md_map , md_map)) {
371- ucs_trace (" dt_iter_md_map=0x%" PRIx64" md_map=0x%" PRIx64, memh-> md_map ,
372- md_map);
371+ ucs_trace (" dt_iter_md_map=0x%" PRIx64 " md_map=0x%" PRIx64 ,
372+ memh-> md_map , md_map);
373373 }
374374
375+ /* TODO: context lock is not scalable. Consider fine-grained lock per memh,
376+ * immutable memh with rkey cache, RCU/COW */
377+ UCP_THREAD_CS_ENTER (&context->mt_lock );
375378 packed_rkey_size = ucp_rkey_pack_memh (
376- req->send .ep ->worker ->context , md_map & memh->md_map , memh,
377- dt_iter->type .contig .buffer , dt_iter->length , &dt_iter->mem_info ,
378- distance_dev_map, dev_distance,
379+ context, md_map & memh->md_map , memh, dt_iter->type .contig .buffer ,
380+ dt_iter->length , &dt_iter->mem_info , distance_dev_map, dev_distance,
379381 ucp_ep_config (req->send .ep )->uct_rkey_pack_flags , rkey_buffer);
382+ UCP_THREAD_CS_EXIT (&context->mt_lock );
380383
381384 if (packed_rkey_size < 0 ) {
382385 ucs_error (" failed to pack remote key: %s" ,
0 commit comments