44
44
#include "mlx5_ib.h"
45
45
#include "umr.h"
46
46
#include "data_direct.h"
47
+ #include "dmah.h"
47
48
48
49
enum {
49
50
MAX_PENDING_REG_MR = 8 ,
@@ -57,7 +58,7 @@ create_mkey_callback(int status, struct mlx5_async_work *context);
57
58
static struct mlx5_ib_mr * reg_create (struct ib_pd * pd , struct ib_umem * umem ,
58
59
u64 iova , int access_flags ,
59
60
unsigned long page_size , bool populate ,
60
- int access_mode );
61
+ int access_mode , u16 st_index , u8 ph );
61
62
static int __mlx5_ib_dereg_mr (struct ib_mr * ibmr );
62
63
63
64
static void set_mkc_access_pd_addr_fields (void * mkc , int acc , u64 start_addr ,
@@ -256,6 +257,14 @@ static void set_cache_mkc(struct mlx5_cache_ent *ent, void *mkc)
256
257
get_mkc_octo_size (ent -> rb_key .access_mode ,
257
258
ent -> rb_key .ndescs ));
258
259
MLX5_SET (mkc , mkc , log_page_size , PAGE_SHIFT );
260
+
261
+ if (ent -> rb_key .ph != MLX5_IB_NO_PH ) {
262
+ MLX5_SET (mkc , mkc , pcie_tph_en , 1 );
263
+ MLX5_SET (mkc , mkc , pcie_tph_ph , ent -> rb_key .ph );
264
+ if (ent -> rb_key .st_index != MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX )
265
+ MLX5_SET (mkc , mkc , pcie_tph_steering_tag_index ,
266
+ ent -> rb_key .st_index );
267
+ }
259
268
}
260
269
261
270
/* Asynchronously schedule new MRs to be populated in the cache. */
@@ -641,6 +650,14 @@ static int cache_ent_key_cmp(struct mlx5r_cache_rb_key key1,
641
650
if (res )
642
651
return res ;
643
652
653
+ res = key1 .st_index - key2 .st_index ;
654
+ if (res )
655
+ return res ;
656
+
657
+ res = key1 .ph - key2 .ph ;
658
+ if (res )
659
+ return res ;
660
+
644
661
/*
645
662
* keep ndescs the last in the compare table since the find function
646
663
* searches for an exact match on all properties and only closest
@@ -712,6 +729,8 @@ mkey_cache_ent_from_rb_key(struct mlx5_ib_dev *dev,
712
729
smallest -> rb_key .access_mode == rb_key .access_mode &&
713
730
smallest -> rb_key .access_flags == rb_key .access_flags &&
714
731
smallest -> rb_key .ats == rb_key .ats &&
732
+ smallest -> rb_key .st_index == rb_key .st_index &&
733
+ smallest -> rb_key .ph == rb_key .ph &&
715
734
smallest -> rb_key .ndescs <= ndescs_limit ) ?
716
735
smallest :
717
736
NULL ;
@@ -786,7 +805,8 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
786
805
struct mlx5r_cache_rb_key rb_key = {
787
806
.ndescs = ndescs ,
788
807
.access_mode = access_mode ,
789
- .access_flags = get_unchangeable_access_flags (dev , access_flags )
808
+ .access_flags = get_unchangeable_access_flags (dev , access_flags ),
809
+ .ph = MLX5_IB_NO_PH ,
790
810
};
791
811
struct mlx5_cache_ent * ent = mkey_cache_ent_from_rb_key (dev , rb_key );
792
812
@@ -943,6 +963,7 @@ int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)
943
963
struct rb_root * root = & dev -> cache .rb_root ;
944
964
struct mlx5r_cache_rb_key rb_key = {
945
965
.access_mode = MLX5_MKC_ACCESS_MODE_MTT ,
966
+ .ph = MLX5_IB_NO_PH ,
946
967
};
947
968
struct mlx5_cache_ent * ent ;
948
969
struct rb_node * node ;
@@ -1119,7 +1140,8 @@ static unsigned int mlx5_umem_dmabuf_default_pgsz(struct ib_umem *umem,
1119
1140
1120
1141
static struct mlx5_ib_mr * alloc_cacheable_mr (struct ib_pd * pd ,
1121
1142
struct ib_umem * umem , u64 iova ,
1122
- int access_flags , int access_mode )
1143
+ int access_flags , int access_mode ,
1144
+ u16 st_index , u8 ph )
1123
1145
{
1124
1146
struct mlx5_ib_dev * dev = to_mdev (pd -> device );
1125
1147
struct mlx5r_cache_rb_key rb_key = {};
@@ -1139,14 +1161,17 @@ static struct mlx5_ib_mr *alloc_cacheable_mr(struct ib_pd *pd,
1139
1161
rb_key .ndescs = ib_umem_num_dma_blocks (umem , page_size );
1140
1162
rb_key .ats = mlx5_umem_needs_ats (dev , umem , access_flags );
1141
1163
rb_key .access_flags = get_unchangeable_access_flags (dev , access_flags );
1164
+ rb_key .st_index = st_index ;
1165
+ rb_key .ph = ph ;
1142
1166
ent = mkey_cache_ent_from_rb_key (dev , rb_key );
1143
1167
/*
1144
1168
* If the MR can't come from the cache then synchronously create an uncached
1145
1169
* one.
1146
1170
*/
1147
1171
if (!ent ) {
1148
1172
mutex_lock (& dev -> slow_path_mutex );
1149
- mr = reg_create (pd , umem , iova , access_flags , page_size , false, access_mode );
1173
+ mr = reg_create (pd , umem , iova , access_flags , page_size , false, access_mode ,
1174
+ st_index , ph );
1150
1175
mutex_unlock (& dev -> slow_path_mutex );
1151
1176
if (IS_ERR (mr ))
1152
1177
return mr ;
@@ -1231,7 +1256,7 @@ reg_create_crossing_vhca_mr(struct ib_pd *pd, u64 iova, u64 length, int access_f
1231
1256
static struct mlx5_ib_mr * reg_create (struct ib_pd * pd , struct ib_umem * umem ,
1232
1257
u64 iova , int access_flags ,
1233
1258
unsigned long page_size , bool populate ,
1234
- int access_mode )
1259
+ int access_mode , u16 st_index , u8 ph )
1235
1260
{
1236
1261
struct mlx5_ib_dev * dev = to_mdev (pd -> device );
1237
1262
struct mlx5_ib_mr * mr ;
@@ -1241,7 +1266,8 @@ static struct mlx5_ib_mr *reg_create(struct ib_pd *pd, struct ib_umem *umem,
1241
1266
u32 * in ;
1242
1267
int err ;
1243
1268
bool pg_cap = !!(MLX5_CAP_GEN (dev -> mdev , pg )) &&
1244
- (access_mode == MLX5_MKC_ACCESS_MODE_MTT );
1269
+ (access_mode == MLX5_MKC_ACCESS_MODE_MTT ) &&
1270
+ (ph == MLX5_IB_NO_PH );
1245
1271
bool ksm_mode = (access_mode == MLX5_MKC_ACCESS_MODE_KSM );
1246
1272
1247
1273
if (!page_size )
@@ -1305,6 +1331,13 @@ static struct mlx5_ib_mr *reg_create(struct ib_pd *pd, struct ib_umem *umem,
1305
1331
get_octo_len (iova , umem -> length , mr -> page_shift ));
1306
1332
}
1307
1333
1334
+ if (ph != MLX5_IB_NO_PH ) {
1335
+ MLX5_SET (mkc , mkc , pcie_tph_en , 1 );
1336
+ MLX5_SET (mkc , mkc , pcie_tph_ph , ph );
1337
+ if (st_index != MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX )
1338
+ MLX5_SET (mkc , mkc , pcie_tph_steering_tag_index , st_index );
1339
+ }
1340
+
1308
1341
err = mlx5_ib_create_mkey (dev , & mr -> mmkey , in , inlen );
1309
1342
if (err ) {
1310
1343
mlx5_ib_warn (dev , "create mkey failed\n" );
@@ -1424,24 +1457,37 @@ struct ib_mr *mlx5_ib_reg_dm_mr(struct ib_pd *pd, struct ib_dm *dm,
1424
1457
}
1425
1458
1426
1459
static struct ib_mr * create_real_mr (struct ib_pd * pd , struct ib_umem * umem ,
1427
- u64 iova , int access_flags )
1460
+ u64 iova , int access_flags ,
1461
+ struct ib_dmah * dmah )
1428
1462
{
1429
1463
struct mlx5_ib_dev * dev = to_mdev (pd -> device );
1430
1464
struct mlx5_ib_mr * mr = NULL ;
1431
1465
bool xlt_with_umr ;
1466
+ u16 st_index = MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX ;
1467
+ u8 ph = MLX5_IB_NO_PH ;
1432
1468
int err ;
1433
1469
1470
+ if (dmah ) {
1471
+ struct mlx5_ib_dmah * mdmah = to_mdmah (dmah );
1472
+
1473
+ ph = dmah -> ph ;
1474
+ if (dmah -> valid_fields & BIT (IB_DMAH_CPU_ID_EXISTS ))
1475
+ st_index = mdmah -> st_index ;
1476
+ }
1477
+
1434
1478
xlt_with_umr = mlx5r_umr_can_load_pas (dev , umem -> length );
1435
1479
if (xlt_with_umr ) {
1436
1480
mr = alloc_cacheable_mr (pd , umem , iova , access_flags ,
1437
- MLX5_MKC_ACCESS_MODE_MTT );
1481
+ MLX5_MKC_ACCESS_MODE_MTT ,
1482
+ st_index , ph );
1438
1483
} else {
1439
1484
unsigned long page_size = mlx5_umem_mkc_find_best_pgsz (
1440
1485
dev , umem , iova , MLX5_MKC_ACCESS_MODE_MTT );
1441
1486
1442
1487
mutex_lock (& dev -> slow_path_mutex );
1443
1488
mr = reg_create (pd , umem , iova , access_flags , page_size ,
1444
- true, MLX5_MKC_ACCESS_MODE_MTT );
1489
+ true, MLX5_MKC_ACCESS_MODE_MTT ,
1490
+ st_index , ph );
1445
1491
mutex_unlock (& dev -> slow_path_mutex );
1446
1492
}
1447
1493
if (IS_ERR (mr )) {
@@ -1505,7 +1551,9 @@ static struct ib_mr *create_user_odp_mr(struct ib_pd *pd, u64 start, u64 length,
1505
1551
return ERR_CAST (odp );
1506
1552
1507
1553
mr = alloc_cacheable_mr (pd , & odp -> umem , iova , access_flags ,
1508
- MLX5_MKC_ACCESS_MODE_MTT );
1554
+ MLX5_MKC_ACCESS_MODE_MTT ,
1555
+ MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX ,
1556
+ MLX5_IB_NO_PH );
1509
1557
if (IS_ERR (mr )) {
1510
1558
ib_umem_release (& odp -> umem );
1511
1559
return ERR_CAST (mr );
@@ -1536,7 +1584,8 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1536
1584
struct ib_umem * umem ;
1537
1585
int err ;
1538
1586
1539
- if (!IS_ENABLED (CONFIG_INFINIBAND_USER_MEM ) || dmah )
1587
+ if (!IS_ENABLED (CONFIG_INFINIBAND_USER_MEM ) ||
1588
+ ((access_flags & IB_ACCESS_ON_DEMAND ) && dmah ))
1540
1589
return ERR_PTR (- EOPNOTSUPP );
1541
1590
1542
1591
mlx5_ib_dbg (dev , "start 0x%llx, iova 0x%llx, length 0x%llx, access_flags 0x%x\n" ,
@@ -1552,7 +1601,7 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1552
1601
umem = ib_umem_get (& dev -> ib_dev , start , length , access_flags );
1553
1602
if (IS_ERR (umem ))
1554
1603
return ERR_CAST (umem );
1555
- return create_real_mr (pd , umem , iova , access_flags );
1604
+ return create_real_mr (pd , umem , iova , access_flags , dmah );
1556
1605
}
1557
1606
1558
1607
static void mlx5_ib_dmabuf_invalidate_cb (struct dma_buf_attachment * attach )
@@ -1577,12 +1626,15 @@ static struct dma_buf_attach_ops mlx5_ib_dmabuf_attach_ops = {
1577
1626
static struct ib_mr *
1578
1627
reg_user_mr_dmabuf (struct ib_pd * pd , struct device * dma_device ,
1579
1628
u64 offset , u64 length , u64 virt_addr ,
1580
- int fd , int access_flags , int access_mode )
1629
+ int fd , int access_flags , int access_mode ,
1630
+ struct ib_dmah * dmah )
1581
1631
{
1582
1632
bool pinned_mode = (access_mode == MLX5_MKC_ACCESS_MODE_KSM );
1583
1633
struct mlx5_ib_dev * dev = to_mdev (pd -> device );
1584
1634
struct mlx5_ib_mr * mr = NULL ;
1585
1635
struct ib_umem_dmabuf * umem_dmabuf ;
1636
+ u16 st_index = MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX ;
1637
+ u8 ph = MLX5_IB_NO_PH ;
1586
1638
int err ;
1587
1639
1588
1640
err = mlx5r_umr_resource_init (dev );
@@ -1605,8 +1657,17 @@ reg_user_mr_dmabuf(struct ib_pd *pd, struct device *dma_device,
1605
1657
return ERR_CAST (umem_dmabuf );
1606
1658
}
1607
1659
1660
+ if (dmah ) {
1661
+ struct mlx5_ib_dmah * mdmah = to_mdmah (dmah );
1662
+
1663
+ ph = dmah -> ph ;
1664
+ if (dmah -> valid_fields & BIT (IB_DMAH_CPU_ID_EXISTS ))
1665
+ st_index = mdmah -> st_index ;
1666
+ }
1667
+
1608
1668
mr = alloc_cacheable_mr (pd , & umem_dmabuf -> umem , virt_addr ,
1609
- access_flags , access_mode );
1669
+ access_flags , access_mode ,
1670
+ st_index , ph );
1610
1671
if (IS_ERR (mr )) {
1611
1672
ib_umem_release (& umem_dmabuf -> umem );
1612
1673
return ERR_CAST (mr );
@@ -1663,7 +1724,8 @@ reg_user_mr_dmabuf_by_data_direct(struct ib_pd *pd, u64 offset,
1663
1724
access_flags &= ~IB_ACCESS_RELAXED_ORDERING ;
1664
1725
crossed_mr = reg_user_mr_dmabuf (pd , & data_direct_dev -> pdev -> dev ,
1665
1726
offset , length , virt_addr , fd ,
1666
- access_flags , MLX5_MKC_ACCESS_MODE_KSM );
1727
+ access_flags , MLX5_MKC_ACCESS_MODE_KSM ,
1728
+ NULL );
1667
1729
if (IS_ERR (crossed_mr )) {
1668
1730
ret = PTR_ERR (crossed_mr );
1669
1731
goto end ;
@@ -1698,7 +1760,7 @@ struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
1698
1760
int err ;
1699
1761
1700
1762
if (!IS_ENABLED (CONFIG_INFINIBAND_USER_MEM ) ||
1701
- !IS_ENABLED (CONFIG_INFINIBAND_ON_DEMAND_PAGING ) || dmah )
1763
+ !IS_ENABLED (CONFIG_INFINIBAND_ON_DEMAND_PAGING ))
1702
1764
return ERR_PTR (- EOPNOTSUPP );
1703
1765
1704
1766
if (uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_REG_DMABUF_MR_ACCESS_FLAGS )) {
@@ -1723,7 +1785,8 @@ struct ib_mr *mlx5_ib_reg_user_mr_dmabuf(struct ib_pd *pd, u64 offset,
1723
1785
1724
1786
return reg_user_mr_dmabuf (pd , pd -> device -> dma_device ,
1725
1787
offset , length , virt_addr ,
1726
- fd , access_flags , MLX5_MKC_ACCESS_MODE_MTT );
1788
+ fd , access_flags , MLX5_MKC_ACCESS_MODE_MTT ,
1789
+ dmah );
1727
1790
}
1728
1791
1729
1792
/*
@@ -1821,7 +1884,8 @@ struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1821
1884
struct mlx5_ib_mr * mr = to_mmr (ib_mr );
1822
1885
int err ;
1823
1886
1824
- if (!IS_ENABLED (CONFIG_INFINIBAND_USER_MEM ) || mr -> data_direct )
1887
+ if (!IS_ENABLED (CONFIG_INFINIBAND_USER_MEM ) || mr -> data_direct ||
1888
+ mr -> mmkey .rb_key .ph != MLX5_IB_NO_PH )
1825
1889
return ERR_PTR (- EOPNOTSUPP );
1826
1890
1827
1891
mlx5_ib_dbg (
@@ -1865,7 +1929,7 @@ struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1865
1929
atomic_sub (ib_umem_num_pages (umem ), & dev -> mdev -> priv .reg_pages );
1866
1930
1867
1931
return create_real_mr (new_pd , umem , mr -> ibmr .iova ,
1868
- new_access_flags );
1932
+ new_access_flags , NULL );
1869
1933
}
1870
1934
1871
1935
/*
@@ -1896,7 +1960,7 @@ struct ib_mr *mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
1896
1960
}
1897
1961
return NULL ;
1898
1962
}
1899
- return create_real_mr (new_pd , new_umem , iova , new_access_flags );
1963
+ return create_real_mr (new_pd , new_umem , iova , new_access_flags , NULL );
1900
1964
}
1901
1965
1902
1966
/*
0 commit comments