@@ -242,7 +242,7 @@ static ucs_status_t uct_ib_mlx5_devx_reg_ksm_data_addr(
242242 * that were registered in single-threaded mode.
243243 */
244244static ucs_status_t uct_ib_mlx5_devx_reg_ksm_data_contig (
245- uct_ib_mlx5_md_t * md , void * address , uint32_t iova_offset , int atomic ,
245+ uct_ib_mlx5_md_t * md , void * address , uint64_t iova , int atomic ,
246246 uint32_t mkey_index , const char * reason , uct_ib_mlx5_devx_mr_t * mr ,
247247 struct mlx5dv_devx_obj * * mr_p , uint32_t * mkey )
248248{
@@ -255,7 +255,7 @@ static ucs_status_t uct_ib_mlx5_devx_reg_ksm_data_contig(
255255 /* FW requires indirect atomic MR address and length to be aligned
256256 * to max supported atomic argument size */
257257 ksm_address = ucs_align_down_pow2 ((uint64_t )address , UCT_IB_MD_MAX_MR_SIZE );
258- ksm_iova = ksm_address + iova_offset ;
258+ ksm_iova = ksm_address - ( uint64_t ) address + iova ;
259259 ksm_length = mr_length + (uint64_t )address - ksm_address ;
260260 ksm_length = ucs_align_up (ksm_length , md -> super .dev .atomic_align );
261261
@@ -437,16 +437,16 @@ uct_ib_mlx5_devx_reg_ksm_data(uct_ib_mlx5_md_t *md,
437437{
438438 uct_ib_mlx5_devx_mr_t * mr = & memh -> mrs [mr_type ];
439439 void * address = uct_ib_mlx5_devx_memh_base_address (memh );
440+ uint64_t iova = (uint64_t )memh -> address + iova_offset ;
440441
441442 if (memh -> super .flags & UCT_IB_MEM_MULTITHREADED ) {
442- return uct_ib_mlx5_devx_reg_ksm_data_mt (md , address ,
443- (uint64_t )address + iova_offset ,
444- atomic , mkey_index , reason ,
443+ return uct_ib_mlx5_devx_reg_ksm_data_mt (md , address , iova , atomic ,
444+ mkey_index , reason ,
445445 mr -> ksm_data , mr_p , mkey );
446446 } else {
447- return uct_ib_mlx5_devx_reg_ksm_data_contig (md , address , iova_offset ,
448- atomic , mkey_index , reason ,
449- mr , mr_p , mkey );
447+ return uct_ib_mlx5_devx_reg_ksm_data_contig (md , address , iova , atomic ,
448+ mkey_index , reason , mr ,
449+ mr_p , mkey );
450450 }
451451}
452452
@@ -651,7 +651,7 @@ static void uct_ib_mlx5_devx_reg_symmetric(uct_ib_mlx5_md_t *md,
651651 /* Best effort, only allocate in the range below the atomic keys. */
652652 while (md -> smkey_index < md -> super .mkey_by_name_reserve .size ) {
653653 status = uct_ib_mlx5_devx_reg_ksm_data_contig (
654- md , address , 0 ,
654+ md , address , ( uint64_t ) address ,
655655 (memh -> super .flags & UCT_IB_MEM_ACCESS_REMOTE_ATOMIC ),
656656 md -> super .mkey_by_name_reserve .base + md -> smkey_index ,
657657 "symmetric-key" , & memh -> mrs [UCT_IB_MR_DEFAULT ], & smkey_mr ,
@@ -2116,7 +2116,8 @@ UCS_PROFILE_FUNC_ALWAYS(ucs_status_t, uct_ib_mlx5_devx_reg_exported_key,
21162116 }
21172117
21182118 ucs_assert (!(memh -> super .flags & UCT_IB_MEM_MULTITHREADED ));
2119- status = uct_ib_mlx5_devx_reg_ksm_data_contig (md , memh -> address , 0 , 0 , 0 ,
2119+ status = uct_ib_mlx5_devx_reg_ksm_data_contig (md , memh -> address ,
2120+ (uint64_t )memh -> address , 0 , 0 ,
21202121 "exported-key" ,
21212122 & memh -> mrs [UCT_IB_MR_DEFAULT ],
21222123 & cross_mr , & exported_lkey );
0 commit comments