Skip to content

Commit c9acd63

Browse files
authored
Merge pull request #9299 from ivankochin/uct/ib/avoid-using-ibv-mr-addr-and-fix-relaxed-order-memh-sizev1.15
UCT/IB: avoid using ibv mr addr and fix relaxed order memh size - v1.15
2 parents a577a33 + 688b467 commit c9acd63

File tree

3 files changed

+81
-56
lines changed

3 files changed

+81
-56
lines changed

src/uct/ib/base/ib_md.c

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ static void uct_ib_md_release_device_config(uct_ib_md_t *md)
12581258
ucs_free(md->custom_devices.specs);
12591259
}
12601260

1261-
static ucs_status_t
1261+
ucs_status_t
12621262
uct_ib_md_parse_reg_methods(uct_ib_md_t *md,
12631263
const uct_ib_md_config_t *md_config)
12641264
{
@@ -1524,9 +1524,20 @@ ucs_status_t uct_ib_md_open(uct_component_t *component, const char *md_name,
15241524
return status;
15251525
}
15261526

1527+
static void uct_ib_md_init_memh_size(uct_ib_md_t *md, size_t memh_base_size,
1528+
size_t mr_size)
1529+
{
1530+
int num_mrs = md->relaxed_order ?
1531+
2 /* UCT_IB_MR_DEFAULT and UCT_IB_MR_STRICT_ORDER */ :
1532+
1 /* UCT_IB_MR_DEFAULT */;
1533+
1534+
md->memh_struct_size = memh_base_size + (mr_size * num_mrs);
1535+
}
1536+
15271537
void uct_ib_md_parse_relaxed_order(uct_ib_md_t *md,
15281538
const uct_ib_md_config_t *md_config,
1529-
int is_supported)
1539+
int is_supported,
1540+
size_t memh_base_size, size_t mr_size)
15301541
{
15311542
int have_relaxed_order = (IBV_ACCESS_RELAXED_ORDERING != 0) && is_supported;
15321543

@@ -1546,20 +1557,13 @@ void uct_ib_md_parse_relaxed_order(uct_ib_md_t *md,
15461557
ucs_cpu_prefer_relaxed_order();
15471558
}
15481559

1560+
/* Reset the memory handler size */
1561+
uct_ib_md_init_memh_size(md, memh_base_size, mr_size);
1562+
15491563
ucs_debug("%s: relaxed order memory access is %sabled",
15501564
uct_ib_device_name(&md->dev), md->relaxed_order ? "en" : "dis");
15511565
}
15521566

1553-
static void uct_ib_md_init_memh_size(uct_ib_md_t *md, size_t memh_base_size,
1554-
size_t mr_size)
1555-
{
1556-
int num_mrs = md->relaxed_order ?
1557-
2 /* UCT_IB_MR_DEFAULT and UCT_IB_MR_STRICT_ORDER */ :
1558-
1 /* UCT_IB_MR_DEFAULT */;
1559-
1560-
md->memh_struct_size = memh_base_size + (mr_size * num_mrs);
1561-
}
1562-
15631567
static void uct_ib_check_gpudirect_driver(uct_ib_md_t *md, const char *file,
15641568
ucs_memory_type_t mem_type)
15651569
{
@@ -1601,8 +1605,7 @@ static void uct_ib_md_check_dmabuf(uct_ib_md_t *md)
16011605

16021606
ucs_status_t uct_ib_md_open_common(uct_ib_md_t *md,
16031607
struct ibv_device *ib_device,
1604-
const uct_ib_md_config_t *md_config,
1605-
size_t memh_base_size, size_t mr_size)
1608+
const uct_ib_md_config_t *md_config)
16061609
{
16071610
ucs_status_t status;
16081611

@@ -1615,8 +1618,6 @@ ucs_status_t uct_ib_md_open_common(uct_ib_md_t *md,
16151618
UCT_MD_FLAG_ADVISE;
16161619
md->relaxed_order = 0;
16171620

1618-
uct_ib_md_init_memh_size(md, memh_base_size, mr_size);
1619-
16201621
/* Create statistics */
16211622
status = UCS_STATS_NODE_ALLOC(&md->stats, &uct_ib_md_stats_class,
16221623
ucs_stats_get_root(), "%s-%p",
@@ -1668,11 +1669,6 @@ ucs_status_t uct_ib_md_open_common(uct_ib_md_t *md,
16681669
goto err_cleanup_device;
16691670
}
16701671

1671-
status = uct_ib_md_parse_reg_methods(md, md_config);
1672-
if (status != UCS_OK) {
1673-
goto err_cleanup_device;
1674-
}
1675-
16761672
md->dev.max_zcopy_log_sge = INT_MAX;
16771673
if (md->reg_mem_types & ~UCS_BIT(UCS_MEMORY_TYPE_HOST)) {
16781674
md->dev.max_zcopy_log_sge = 1;
@@ -1843,9 +1839,7 @@ static ucs_status_t uct_ib_verbs_md_open(struct ibv_device *ibv_device,
18431839
goto err_device_config_release;
18441840
}
18451841

1846-
status = uct_ib_md_open_common(md, ibv_device, md_config,
1847-
sizeof(uct_ib_verbs_mem_t),
1848-
sizeof(uct_ib_mr_t));
1842+
status = uct_ib_md_open_common(md, ibv_device, md_config);
18491843
if (status != UCS_OK) {
18501844
goto err_md_free;
18511845
}
@@ -1855,7 +1849,14 @@ static ucs_status_t uct_ib_verbs_md_open(struct ibv_device *ibv_device,
18551849
md->flush_rkey = UCT_IB_MD_INVALID_FLUSH_RKEY;
18561850

18571851
uct_ib_md_ece_check(md);
1858-
uct_ib_md_parse_relaxed_order(md, md_config, 0);
1852+
uct_ib_md_parse_relaxed_order(md, md_config, 0,
1853+
sizeof(uct_ib_verbs_mem_t),
1854+
sizeof(uct_ib_mr_t));
1855+
1856+
status = uct_ib_md_parse_reg_methods(md, md_config);
1857+
if (status != UCS_OK) {
1858+
goto err_md_free;
1859+
}
18591860

18601861
*p_md = md;
18611862
return UCS_OK;

src/uct/ib/base/ib_md.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,14 +630,18 @@ ucs_status_t uct_ib_md_open(uct_component_t *component, const char *md_name,
630630

631631
void uct_ib_md_parse_relaxed_order(uct_ib_md_t *md,
632632
const uct_ib_md_config_t *md_config,
633-
int is_supported);
633+
int is_supported,
634+
size_t memh_base_size, size_t mr_size);
634635

635636
int uct_ib_device_is_accessible(struct ibv_device *device);
636637

638+
ucs_status_t
639+
uct_ib_md_parse_reg_methods(uct_ib_md_t *md,
640+
const uct_ib_md_config_t *md_config);
641+
637642
ucs_status_t uct_ib_md_open_common(uct_ib_md_t *md,
638643
struct ibv_device *ib_device,
639-
const uct_ib_md_config_t *md_config,
640-
size_t mem_size, size_t mr_size);
644+
const uct_ib_md_config_t *md_config);
641645

642646
void uct_ib_md_close_common(uct_ib_md_t *md);
643647

src/uct/ib/mlx5/dv/ib_mlx5dv_md.c

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ typedef union uct_ib_mlx5_mr {
3434

3535
typedef 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

210213
static 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,
276281
static ucs_status_t
277282
uct_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

644653
err_dereg:
@@ -1225,9 +1234,8 @@ static ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
12251234
}
12261235

12271236
md->super.ops = &uct_ib_mlx5_devx_md_ops;
1228-
status = uct_ib_md_open_common(&md->super, ibv_device, md_config,
1229-
sizeof(uct_ib_mlx5_mem_t),
1230-
sizeof(uct_ib_mlx5_mr_t));
1237+
1238+
status = uct_ib_md_open_common(&md->super, ibv_device, md_config);
12311239
if (status != UCS_OK) {
12321240
goto err_lru_cleanup;
12331241
}
@@ -1274,7 +1282,14 @@ static ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
12741282

12751283
/* Enable relaxed order only if we would be able to create an indirect key
12761284
(with offset) for strict order access */
1277-
uct_ib_md_parse_relaxed_order(&md->super, md_config, ksm_atomic);
1285+
uct_ib_md_parse_relaxed_order(&md->super, md_config, ksm_atomic,
1286+
sizeof(uct_ib_mlx5_mem_t),
1287+
sizeof(uct_ib_mlx5_mr_t));
1288+
1289+
status = uct_ib_md_parse_reg_methods(&md->super, md_config);
1290+
if (status != UCS_OK) {
1291+
goto err_dbrec_mpool_cleanup;
1292+
}
12781293

12791294
uct_ib_mlx5_devx_init_flush_mr(md);
12801295

@@ -1454,18 +1469,18 @@ uct_ib_mlx5_devx_reg_exported_key(uct_ib_md_t *ib_md, uct_ib_mem_t *ib_memh)
14541469
struct mlx5dv_devx_umem_in umem_in;
14551470
ucs_status_t status;
14561471
void *access_key;
1457-
void *address, *aligned_address;
1472+
void *aligned_address;
14581473
size_t length;
14591474
void *mkc;
14601475

1461-
address = memh->mrs[UCT_IB_MR_DEFAULT].super.ib->addr;
14621476
length = memh->mrs[UCT_IB_MR_DEFAULT].super.ib->length;
14631477

14641478
/* register umem */
1465-
umem_in.addr = address;
1479+
umem_in.addr = memh->address;
14661480
umem_in.size = length;
14671481
umem_in.access = UCT_IB_MLX5_MD_UMEM_ACCESS;
1468-
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());
14691484
umem_in.pgsz_bitmap = UCS_MASK(ucs_ffs64((uint64_t)aligned_address) + 1);
14701485
umem_in.comp_mask = 0;
14711486

@@ -1496,7 +1511,7 @@ uct_ib_mlx5_devx_reg_exported_key(uct_ib_md_t *ib_md, uct_ib_mem_t *ib_memh)
14961511
UCT_IB_MLX5DV_SET(mkc, mkc, qpn, 0xffffff);
14971512
UCT_IB_MLX5DV_SET(mkc, mkc, pd, uct_ib_mlx5_devx_md_get_pdn(md));
14981513
UCT_IB_MLX5DV_SET(mkc, mkc, mkey_7_0, md->mkey_tag);
1499-
UCT_IB_MLX5DV_SET64(mkc, mkc, start_addr, (intptr_t)address);
1514+
UCT_IB_MLX5DV_SET64(mkc, mkc, start_addr, (intptr_t)memh->address);
15001515
UCT_IB_MLX5DV_SET64(mkc, mkc, len, length);
15011516

15021517
ucs_assertv(memh->cross_mr == NULL, "memh %p cross_mr %p", memh,
@@ -1775,19 +1790,24 @@ static ucs_status_t uct_ib_mlx5dv_md_open(struct ibv_device *ibv_device,
17751790
md->super.ops = &uct_ib_mlx5_md_ops;
17761791
md->max_rd_atomic_dc = IBV_DEV_ATTR(dev, max_qp_rd_atom);
17771792
status = uct_ib_md_open_common(&md->super, ibv_device,
1778-
md_config,
1779-
sizeof(uct_ib_mlx5_mem_t),
1780-
sizeof(uct_ib_mlx5_mr_t));
1793+
md_config);
17811794
if (status != UCS_OK) {
17821795
goto err_md_free;
17831796
}
17841797

17851798
dev->flags |= UCT_IB_DEVICE_FLAG_MLX5_PRM;
17861799
md->super.name = UCT_IB_MD_NAME(mlx5);
17871800

1788-
uct_ib_md_parse_relaxed_order(&md->super, md_config, 0);
1801+
uct_ib_md_parse_relaxed_order(&md->super, md_config, 0,
1802+
sizeof(uct_ib_mlx5_mem_t),
1803+
sizeof(uct_ib_mlx5_mr_t));
17891804
uct_ib_md_ece_check(&md->super);
17901805

1806+
status = uct_ib_md_parse_reg_methods(&md->super, md_config);
1807+
if (status != UCS_OK) {
1808+
goto err_md_free;
1809+
}
1810+
17911811
md->super.flush_rkey = uct_ib_mlx5_flush_rkey_make();
17921812

17931813
/* cppcheck-suppress autoVariables */

0 commit comments

Comments
 (0)