@@ -34,6 +34,7 @@ typedef union uct_ib_mlx5_mr {
3434
3535typedef struct uct_ib_mlx5_mem {
3636 uct_ib_mem_t super ;
37+ void * address ;
3738#if HAVE_DEVX
3839 struct mlx5dv_devx_obj * atomic_dvmr ;
3940 struct mlx5dv_devx_obj * indirect_dvmr ;
@@ -51,6 +52,8 @@ uct_ib_mlx5_reg_key(uct_ib_md_t *md, void *address, size_t length,
5152{
5253 uct_ib_mlx5_mem_t * memh = ucs_derived_of (ib_memh , uct_ib_mlx5_mem_t );
5354
55+ memh -> address = address ;
56+
5457 return uct_ib_reg_key_impl (md , address , length , access_flags , dmabuf_fd ,
5558 dmabuf_offset , ib_memh ,
5659 & memh -> mrs [mr_type ].super , mr_type , silent );
@@ -208,12 +211,13 @@ static ucs_status_t uct_ib_mlx5_devx_reg_ksm(uct_ib_mlx5_md_t *md, int atomic,
208211}
209212
210213static ucs_status_t
211- uct_ib_mlx5_devx_reg_ksm_data (uct_ib_mlx5_md_t * md , int atomic ,
214+ uct_ib_mlx5_devx_reg_ksm_data (uct_ib_mlx5_md_t * md , int atomic , void * address ,
212215 uct_ib_mlx5_ksm_data_t * ksm_data ,
213216 size_t length , off_t off ,
214217 struct mlx5dv_devx_obj * * mr_p ,
215218 uint32_t * mkey )
216219{
220+ void * mr_address = address ;
217221 ucs_status_t status ;
218222 char * in ;
219223 void * klm ;
@@ -226,14 +230,15 @@ uct_ib_mlx5_devx_reg_ksm_data(uct_ib_mlx5_md_t *md, int atomic,
226230
227231 klm = UCT_IB_MLX5DV_ADDR_OF (create_mkey_in , in , klm_pas_mtt );
228232 for (i = 0 ; i < ksm_data -> mr_num ; i ++ ) {
229- UCT_IB_MLX5DV_SET64 (klm , klm , address , (intptr_t ) ksm_data -> mrs [ i ] -> addr );
233+ UCT_IB_MLX5DV_SET64 (klm , klm , address , (uintptr_t ) mr_address );
230234 UCT_IB_MLX5DV_SET (klm , klm , byte_count , ksm_data -> mrs [i ]-> length );
231235 UCT_IB_MLX5DV_SET (klm , klm , mkey , ksm_data -> mrs [i ]-> lkey );
232- klm = UCS_PTR_BYTE_OFFSET (klm , UCT_IB_MLX5DV_ST_SZ_BYTES (klm ));
236+ klm = UCS_PTR_BYTE_OFFSET (klm , UCT_IB_MLX5DV_ST_SZ_BYTES (klm ));
237+ mr_address = UCS_PTR_BYTE_OFFSET (mr_address , ksm_data -> mrs [i ]-> length );
233238 }
234239
235240 status = uct_ib_mlx5_devx_reg_ksm (md , atomic ,
236- (intptr_t ) ksm_data -> mrs [ 0 ] -> addr + off ,
241+ (uintptr_t ) address + off ,
237242 length , ksm_data -> mr_num ,
238243 ksm_data -> mrs [0 ]-> length , in , mr_p ,
239244 mkey );
@@ -276,14 +281,15 @@ uct_ib_mlx5_devx_reg_ksm_data_addr(uct_ib_mlx5_md_t *md, struct ibv_mr *mr,
276281static ucs_status_t
277282uct_ib_mlx5_devx_reg_ksm_data_contig (uct_ib_mlx5_md_t * md ,
278283 uct_ib_mlx5_mr_t * mr , off_t off ,
279- int atomic , struct mlx5dv_devx_obj * * mr_p ,
284+ void * address , int atomic ,
285+ struct mlx5dv_devx_obj * * mr_p ,
280286 uint32_t * mkey )
281287{
282- intptr_t addr = (intptr_t )mr -> super . ib -> addr & ~(UCT_IB_MD_MAX_MR_SIZE - 1 );
288+ intptr_t addr = (intptr_t )address & ~(UCT_IB_MD_MAX_MR_SIZE - 1 );
283289 /* FW requires indirect atomic MR addr and length to be aligned
284290 * to max supported atomic argument size */
285291 size_t length = ucs_align_up (mr -> super .ib -> length +
286- (intptr_t )mr -> super . ib -> addr - addr ,
292+ (intptr_t )address - addr ,
287293 md -> super .dev .atomic_align );
288294 /* add off to workaround CREATE_MKEY range check issue */
289295 int list_size = ucs_div_round_up (length + off , UCT_IB_MD_MAX_MR_SIZE );
@@ -445,8 +451,8 @@ static ucs_status_t uct_ib_mlx5_devx_reg_indirect_key(uct_ib_md_t *ibmd,
445451
446452 do {
447453 status = uct_ib_mlx5_devx_reg_ksm_data_contig (
448- md , & memh -> mrs [UCT_IB_MR_DEFAULT ], 0 , 0 , & memh -> indirect_dvmr ,
449- & memh -> super .indirect_rkey );
454+ md , & memh -> mrs [UCT_IB_MR_DEFAULT ], 0 , memh -> address , 0 ,
455+ & memh -> indirect_dvmr , & memh -> super .indirect_rkey );
450456 if (status != UCS_OK ) {
451457 break ;
452458 }
@@ -549,23 +555,24 @@ static ucs_status_t uct_ib_mlx5_devx_reg_atomic_key(uct_ib_md_t *ibmd,
549555 is_atomic = memh -> super .flags & UCT_IB_MEM_ACCESS_REMOTE_ATOMIC ;
550556
551557 if (memh -> super .flags & UCT_IB_MEM_MULTITHREADED ) {
552- return uct_ib_mlx5_devx_reg_ksm_data (md , is_atomic , mr -> ksm_data ,
558+ return uct_ib_mlx5_devx_reg_ksm_data (md , is_atomic , memh -> address ,
559+ mr -> ksm_data ,
553560 mr -> ksm_data -> length ,
554561 uct_ib_md_atomic_offset (mr_id ),
555562 & memh -> atomic_dvmr ,
556563 & memh -> super .atomic_rkey );
557564 }
558565
559566 status = uct_ib_mlx5_devx_reg_ksm_data_contig (
560- md , mr , uct_ib_md_atomic_offset (mr_id ), is_atomic ,
567+ md , mr , uct_ib_md_atomic_offset (mr_id ), memh -> address , is_atomic ,
561568 & memh -> atomic_dvmr , & memh -> super .atomic_rkey );
562569 if (status != UCS_OK ) {
563570 return status ;
564571 }
565572
566573 ucs_debug ("KSM registered memory %p..%p offset 0x%x%s on %s rkey 0x%x" ,
567- mr -> super . ib -> addr ,
568- UCS_PTR_BYTE_OFFSET (mr -> super . ib -> addr , mr -> super .ib -> length ),
574+ memh -> address ,
575+ UCS_PTR_BYTE_OFFSET (memh -> address , mr -> super .ib -> length ),
569576 uct_ib_md_atomic_offset (mr_id ), is_atomic ? " atomic" : "" ,
570577 uct_ib_device_name (& md -> super .dev ), memh -> super .atomic_rkey );
571578 return status ;
@@ -627,8 +634,8 @@ static ucs_status_t uct_ib_mlx5_devx_reg_multithreaded(uct_ib_md_t *ibmd,
627634 goto err ;
628635 }
629636
630- status = uct_ib_mlx5_devx_reg_ksm_data (md , is_atomic , ksm_data , length , 0 ,
631- & ksm_data -> dvmr , & mkey );
637+ status = uct_ib_mlx5_devx_reg_ksm_data (md , is_atomic , address , ksm_data ,
638+ length , 0 , & ksm_data -> dvmr , & mkey );
632639 if (status != UCS_OK ) {
633640 goto err_dereg ;
634641 }
@@ -639,6 +646,8 @@ static ucs_status_t uct_ib_mlx5_devx_reg_multithreaded(uct_ib_md_t *ibmd,
639646 if (mr_type == UCT_IB_MR_DEFAULT ) {
640647 uct_ib_memh_init_keys (ib_memh , mkey , mkey );
641648 }
649+
650+ memh -> address = address ;
642651 return UCS_OK ;
643652
644653err_dereg :
@@ -1460,18 +1469,18 @@ uct_ib_mlx5_devx_reg_exported_key(uct_ib_md_t *ib_md, uct_ib_mem_t *ib_memh)
14601469 struct mlx5dv_devx_umem_in umem_in ;
14611470 ucs_status_t status ;
14621471 void * access_key ;
1463- void * address , * aligned_address ;
1472+ void * aligned_address ;
14641473 size_t length ;
14651474 void * mkc ;
14661475
1467- address = memh -> mrs [UCT_IB_MR_DEFAULT ].super .ib -> addr ;
14681476 length = memh -> mrs [UCT_IB_MR_DEFAULT ].super .ib -> length ;
14691477
14701478 /* register umem */
1471- umem_in .addr = address ;
1479+ umem_in .addr = memh -> address ;
14721480 umem_in .size = length ;
14731481 umem_in .access = UCT_IB_MLX5_MD_UMEM_ACCESS ;
1474- aligned_address = ucs_align_down_pow2_ptr (address , ucs_get_page_size ());
1482+ aligned_address = ucs_align_down_pow2_ptr (memh -> address ,
1483+ ucs_get_page_size ());
14751484 umem_in .pgsz_bitmap = UCS_MASK (ucs_ffs64 ((uint64_t )aligned_address ) + 1 );
14761485 umem_in .comp_mask = 0 ;
14771486
@@ -1502,7 +1511,7 @@ uct_ib_mlx5_devx_reg_exported_key(uct_ib_md_t *ib_md, uct_ib_mem_t *ib_memh)
15021511 UCT_IB_MLX5DV_SET (mkc , mkc , qpn , 0xffffff );
15031512 UCT_IB_MLX5DV_SET (mkc , mkc , pd , uct_ib_mlx5_devx_md_get_pdn (md ));
15041513 UCT_IB_MLX5DV_SET (mkc , mkc , mkey_7_0 , md -> mkey_tag );
1505- UCT_IB_MLX5DV_SET64 (mkc , mkc , start_addr , (intptr_t )address );
1514+ UCT_IB_MLX5DV_SET64 (mkc , mkc , start_addr , (intptr_t )memh -> address );
15061515 UCT_IB_MLX5DV_SET64 (mkc , mkc , len , length );
15071516
15081517 ucs_assertv (memh -> cross_mr == NULL , "memh %p cross_mr %p" , memh ,
0 commit comments