@@ -125,6 +125,31 @@ ucp_rkey_unpack_distance(const ucp_rkey_packed_distance_t *packed_distance,
125125 distance -> bandwidth = UCS_FP8_UNPACK (BANDWIDTH , packed_distance -> bandwidth );
126126}
127127
128+ ucs_sys_device_t ucp_rkey_pack_sys_dev (ucp_mem_h memh )
129+ {
130+ ucs_sys_device_t sys_dev_packed = memh -> sys_dev ;
131+ ucp_md_index_t md_index ;
132+ ucp_sys_dev_map_t sys_dev_map ;
133+ ucs_sys_device_t sys_dev ;
134+
135+ ucs_assert (sys_dev_packed <= UCP_SYS_DEVICE_MAX_PACKED );
136+
137+ ucs_for_each_bit (md_index , memh -> md_map ) {
138+ sys_dev_map = memh -> context -> tl_mds [md_index ].sys_dev_map ;
139+ ucs_for_each_bit (sys_dev , sys_dev_map ) {
140+ if (ucs_topo_is_sibling (sys_dev , sys_dev_packed )) {
141+ /* PUT operation on such rkey requires remote flush.
142+ * Set a flag for the peer to recognize it. */
143+ sys_dev_packed |= UCP_SYS_DEVICE_FLUSH_BIT ;
144+ goto out ;
145+ }
146+ }
147+ }
148+
149+ out :
150+ return sys_dev_packed ;
151+ }
152+
128153UCS_PROFILE_FUNC (ssize_t , ucp_rkey_pack_memh ,
129154 (context , md_map , memh , address , length , mem_info , sys_dev_map ,
130155 sys_distance , uct_flags , buffer ),
@@ -184,7 +209,7 @@ UCS_PROFILE_FUNC(ssize_t, ucp_rkey_pack_memh,
184209 }
185210
186211 /* Pack system device id */
187- * ucs_serialize_next (& p , uint8_t ) = mem_info -> sys_dev ;
212+ * ucs_serialize_next (& p , uint8_t ) = memh -> packed_sys_dev ;
188213
189214 /* Pack distance from sys_dev to each device in distance_dev_map */
190215 ucs_for_each_bit (sys_dev , sys_dev_map ) {
@@ -577,12 +602,11 @@ ucp_memh_packed_size(ucp_mem_h memh, uint64_t flags, int rkey_compat)
577602 ucp_memh_export_md_map (memh ));
578603 }
579604
580- if (rkey_compat ) {
581- return ucp_rkey_packed_size (context , memh -> md_map ,
582- UCS_SYS_DEVICE_ID_UNKNOWN , 0 );
605+ if (!rkey_compat ) {
606+ ucs_fatal ("packing rkey using ucp_memh_pack() is unsupported" );
583607 }
584608
585- ucs_fatal ( "packing rkey using ucp_memh_pack() is unsupported" );
609+ return ucp_rkey_packed_size ( context , memh -> md_map , memh -> sys_dev , 0 );
586610}
587611
588612static ssize_t ucp_memh_do_pack (ucp_mem_h memh , uint64_t flags ,
@@ -594,15 +618,15 @@ static ssize_t ucp_memh_do_pack(ucp_mem_h memh, uint64_t flags,
594618 return ucp_memh_exported_pack (memh , memh_buffer );
595619 }
596620
597- if (rkey_compat ) {
598- mem_info .type = memh -> mem_type ;
599- mem_info .sys_dev = UCS_SYS_DEVICE_ID_UNKNOWN ;
600- return ucp_rkey_pack_memh (memh -> context , memh -> md_map , memh ,
601- ucp_memh_address (memh ), ucp_memh_length (memh ),
602- & mem_info , 0 , NULL , 0 , memh_buffer );
621+ if (!rkey_compat ) {
622+ ucs_fatal ("packing rkey using ucp_memh_pack() is unsupported" );
603623 }
604624
605- ucs_fatal ("packing rkey using ucp_memh_pack() is unsupported" );
625+ mem_info .type = memh -> mem_type ;
626+ mem_info .sys_dev = memh -> sys_dev ;
627+ return ucp_rkey_pack_memh (memh -> context , memh -> md_map , memh ,
628+ ucp_memh_address (memh ), ucp_memh_length (memh ),
629+ & mem_info , 0 , NULL , 0 , memh_buffer );
606630}
607631
608632int ucp_memh_buffer_is_dummy (const void * exported_memh_buffer )
0 commit comments