@@ -1765,27 +1765,34 @@ uct_ib_mlx5_devx_query_lag(uct_ib_mlx5_md_t *md, uint8_t *state)
1765
1765
return UCS_OK ;
1766
1766
}
1767
1767
1768
- static struct ibv_context *
1769
- uct_ib_mlx5_devx_open_device (struct ibv_device * ibv_device )
1768
+ struct ibv_context * uct_ib_mlx5_devx_open_device (struct ibv_device * ibv_device )
1770
1769
{
1771
- struct mlx5dv_context_attr dv_attr = {};
1772
- struct mlx5dv_devx_event_channel * event_channel ;
1770
+ struct mlx5dv_context_attr dv_attr = {
1771
+ .flags = MLX5DV_CONTEXT_FLAGS_DEVX
1772
+ };
1773
1773
struct ibv_context * ctx ;
1774
- struct ibv_cq * cq ;
1775
1774
1776
- dv_attr .flags |= MLX5DV_CONTEXT_FLAGS_DEVX ;
1777
1775
ctx = mlx5dv_open_device (ibv_device , & dv_attr );
1778
1776
if (ctx == NULL ) {
1779
1777
ucs_debug ("mlx5dv_open_device(%s) failed: %m" ,
1780
1778
ibv_get_device_name (ibv_device ));
1781
1779
return NULL ;
1782
1780
}
1783
1781
1782
+ return ctx ;
1783
+ }
1784
+
1785
+ static ucs_status_t
1786
+ uct_ib_mlx5_devx_check_event_channel (struct ibv_context * ctx )
1787
+ {
1788
+ struct mlx5dv_devx_event_channel * event_channel ;
1789
+ struct ibv_cq * cq ;
1790
+
1784
1791
cq = ibv_create_cq (ctx , 1 , NULL , NULL , 0 );
1785
1792
if (cq == NULL ) {
1786
1793
uct_ib_check_memlock_limit_msg (ctx , UCS_LOG_LEVEL_DEBUG ,
1787
1794
"ibv_create_cq()" );
1788
- goto close_ctx ;
1795
+ return UCS_ERR_UNSUPPORTED ;
1789
1796
}
1790
1797
1791
1798
ibv_destroy_cq (cq );
@@ -1794,17 +1801,12 @@ uct_ib_mlx5_devx_open_device(struct ibv_device *ibv_device)
1794
1801
ctx , MLX5_IB_UAPI_DEVX_CR_EV_CH_FLAGS_OMIT_DATA );
1795
1802
if (event_channel == NULL ) {
1796
1803
ucs_diag ("mlx5dv_devx_create_event_channel(%s) failed: %m" ,
1797
- ibv_get_device_name (ibv_device ));
1798
- goto close_ctx ;
1804
+ ibv_get_device_name (ctx -> device ));
1805
+ return UCS_ERR_UNSUPPORTED ;
1799
1806
}
1800
1807
1801
1808
mlx5dv_devx_destroy_event_channel (event_channel );
1802
-
1803
- return ctx ;
1804
-
1805
- close_ctx :
1806
- ibv_close_device (ctx );
1807
- return NULL ;
1809
+ return UCS_OK ;
1808
1810
}
1809
1811
1810
1812
static uct_ib_md_ops_t uct_ib_mlx5_devx_md_ops ;
@@ -1851,8 +1853,21 @@ static void uct_ib_mlx5_devx_init_flush_mr(uct_ib_mlx5_md_t *md)
1851
1853
md -> super .flush_rkey = uct_ib_mlx5_flush_rkey_make ();
1852
1854
}
1853
1855
1854
- static ucs_status_t
1855
- uct_ib_mlx5_devx_query_cap_2 (struct ibv_context * ctx , void * out , size_t size )
1856
+ ucs_status_t uct_ib_mlx5_devx_query_cap (struct ibv_context * ctx , uint32_t opmod ,
1857
+ void * out , size_t size , char * msg_arg ,
1858
+ int silent )
1859
+ {
1860
+ char in [UCT_IB_MLX5DV_ST_SZ_BYTES (query_hca_cap_in )] = {};
1861
+
1862
+ UCT_IB_MLX5DV_SET (query_hca_cap_in , in , opcode ,
1863
+ UCT_IB_MLX5_CMD_OP_QUERY_HCA_CAP );
1864
+ UCT_IB_MLX5DV_SET (query_hca_cap_in , in , op_mod , opmod );
1865
+ return uct_ib_mlx5_devx_general_cmd (ctx , in , ucs_static_array_size (in ),
1866
+ out , size , msg_arg , silent );
1867
+ }
1868
+
1869
+ ucs_status_t uct_ib_mlx5_devx_query_cap_2 (struct ibv_context * ctx ,
1870
+ void * out , size_t size )
1856
1871
{
1857
1872
char in [UCT_IB_MLX5DV_ST_SZ_BYTES (query_hca_cap_in )] = {};
1858
1873
@@ -1866,8 +1881,7 @@ uct_ib_mlx5_devx_query_cap_2(struct ibv_context *ctx, void *out, size_t size)
1866
1881
"QUERY_HCA_CAP, CAP2" , 1 );
1867
1882
}
1868
1883
1869
- static void uct_ib_mlx5_devx_check_xgvmi (uct_ib_mlx5_md_t * md , void * cap_2 ,
1870
- uct_ib_device_t * dev )
1884
+ int uct_ib_mlx5_devx_check_xgvmi (void * cap_2 , const char * dev_name )
1871
1885
{
1872
1886
uint64_t object_for_other_vhca ;
1873
1887
uint32_t object_to_object ;
@@ -1881,13 +1895,11 @@ static void uct_ib_mlx5_devx_check_xgvmi(uct_ib_mlx5_md_t *md, void *cap_2,
1881
1895
UCT_IB_MLX5_HCA_CAPS_2_CROSS_VHCA_OBJ_TO_OBJ_LOCAL_MKEY_TO_REMOTE_MKEY ) &&
1882
1896
(object_for_other_vhca &
1883
1897
UCT_IB_MLX5_HCA_CAPS_2_ALLOWED_OBJ_FOR_OTHER_VHCA_ACCESS_MKEY )) {
1884
- md -> flags |= UCT_IB_MLX5_MD_FLAG_INDIRECT_XGVMI ;
1885
- md -> super .cap_flags |= UCT_MD_FLAG_EXPORTED_MKEY ;
1886
- ucs_debug ("%s: cross gvmi alias mkey is supported" ,
1887
- uct_ib_device_name (dev ));
1898
+ ucs_debug ("%s: cross gvmi alias mkey is supported" , dev_name );
1899
+ return 1 ;
1888
1900
} else {
1889
- ucs_debug ("%s: crossing_vhca_mkey is not supported" ,
1890
- uct_ib_device_name ( dev )) ;
1901
+ ucs_debug ("%s: crossing_vhca_mkey is not supported" , dev_name );
1902
+ return 0 ;
1891
1903
}
1892
1904
}
1893
1905
@@ -2157,22 +2169,18 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2157
2169
const uct_ib_md_config_t * md_config ,
2158
2170
uct_ib_md_t * * p_md )
2159
2171
{
2160
- size_t out_len = UCT_IB_MLX5DV_ST_SZ_BYTES (query_hca_cap_out );
2161
- size_t in_len = UCT_IB_MLX5DV_ST_SZ_BYTES (query_hca_cap_in );
2162
- size_t total_len = (2 * out_len ) + in_len ;
2163
- char * buf , * out , * in , * cap_2_out ;
2172
+ uint8_t lag_state = 0 ;
2173
+ size_t out_len = UCT_IB_MLX5DV_ST_SZ_BYTES (query_hca_cap_out );
2174
+ size_t total_len = 2 * out_len ;
2175
+ char * buf , * out , * cap_2_out ;
2176
+ void * cap , * cap_2 ;
2164
2177
ucs_status_t status ;
2165
- void * cap_2 ;
2166
- uint8_t lag_state = 0 ;
2167
2178
uint8_t log_max_qp ;
2168
2179
uint16_t vhca_id ;
2169
2180
struct ibv_context * ctx ;
2170
2181
uct_ib_device_t * dev ;
2171
2182
uct_ib_mlx5_md_t * md ;
2172
2183
unsigned max_rd_atomic_dc ;
2173
- void * cap ;
2174
- int ret ;
2175
- ucs_log_level_t log_level ;
2176
2184
ucs_mpool_params_t mp_params ;
2177
2185
int ksm_atomic ;
2178
2186
@@ -2184,8 +2192,7 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2184
2192
}
2185
2193
2186
2194
out = buf ;
2187
- in = UCS_PTR_BYTE_OFFSET (out , out_len );
2188
- cap_2_out = UCS_PTR_BYTE_OFFSET (in , in_len );
2195
+ cap_2_out = UCS_PTR_BYTE_OFFSET (out , out_len );
2189
2196
2190
2197
if (!mlx5dv_is_supported (ibv_device )) {
2191
2198
status = UCS_ERR_UNSUPPORTED ;
@@ -2203,6 +2210,11 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2203
2210
goto err_free_buffer ;
2204
2211
}
2205
2212
2213
+ status = uct_ib_mlx5_devx_check_event_channel (ctx );
2214
+ if (status != UCS_OK ) {
2215
+ goto err_free_context ;
2216
+ }
2217
+
2206
2218
md = ucs_derived_of (uct_ib_md_alloc (sizeof (* md ), "ib_mlx5_devx_md" , ctx ),
2207
2219
uct_ib_mlx5_md_t );
2208
2220
if (md == NULL ) {
@@ -2224,24 +2236,12 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2224
2236
goto err_lru_cleanup ;
2225
2237
}
2226
2238
2227
- cap = UCT_IB_MLX5DV_ADDR_OF (query_hca_cap_out , out , capability );
2228
- UCT_IB_MLX5DV_SET (query_hca_cap_in , in , opcode , UCT_IB_MLX5_CMD_OP_QUERY_HCA_CAP );
2229
- UCT_IB_MLX5DV_SET (query_hca_cap_in , in , op_mod , UCT_IB_MLX5_HCA_CAP_OPMOD_GET_CUR |
2230
- (UCT_IB_MLX5_CAP_GENERAL << 1 ));
2231
- ret = mlx5dv_devx_general_cmd (ctx , in , in_len , out , out_len );
2232
- if (ret != 0 ) {
2233
- if ((errno == EPERM ) || (errno == EPROTONOSUPPORT ) ||
2234
- (errno == EOPNOTSUPP )) {
2235
- status = UCS_ERR_UNSUPPORTED ;
2236
- log_level = UCS_LOG_LEVEL_DEBUG ;
2237
- } else {
2238
- status = UCS_ERR_IO_ERROR ;
2239
- log_level = UCS_LOG_LEVEL_ERROR ;
2240
- }
2241
- ucs_log (log_level ,
2242
- "mlx5dv_devx_general_cmd(QUERY_HCA_CAP) failed,"
2243
- " syndrome 0x%x: %m" ,
2244
- UCT_IB_MLX5DV_GET (query_hca_cap_out , out , syndrome ));
2239
+ cap = UCT_IB_MLX5DV_ADDR_OF (query_hca_cap_out , out , capability );
2240
+ status = uct_ib_mlx5_devx_query_cap (ctx ,
2241
+ UCT_IB_MLX5_HCA_CAP_OPMOD_GET_CUR |
2242
+ (UCT_IB_MLX5_CAP_GENERAL << 1 ),
2243
+ out , out_len , "QUERY_HCA_CAP" , 0 );
2244
+ if (status != UCS_OK ) {
2245
2245
goto err_lru_cleanup ;
2246
2246
}
2247
2247
@@ -2350,8 +2350,11 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2350
2350
status = uct_ib_mlx5_devx_query_cap_2 (ctx , cap_2_out , out_len );
2351
2351
if (status == UCS_OK ) {
2352
2352
cap_2 = UCT_IB_MLX5DV_ADDR_OF (query_hca_cap_out , cap_2_out , capability );
2353
+ if (uct_ib_mlx5_devx_check_xgvmi (cap_2 , uct_ib_device_name (dev ))) {
2354
+ md -> flags |= UCT_IB_MLX5_MD_FLAG_INDIRECT_XGVMI ;
2355
+ md -> super .cap_flags |= UCT_MD_FLAG_EXPORTED_MKEY ;
2356
+ }
2353
2357
2354
- uct_ib_mlx5_devx_check_xgvmi (md , cap_2 , dev );
2355
2358
uct_ib_mlx5_devx_check_mkey_by_name (md , cap_2 , dev );
2356
2359
} else {
2357
2360
cap_2 = NULL ;
@@ -2367,10 +2370,11 @@ ucs_status_t uct_ib_mlx5_devx_md_open(struct ibv_device *ibv_device,
2367
2370
uint8_t arg_size ;
2368
2371
int cap_ops , mode8b ;
2369
2372
2370
- UCT_IB_MLX5DV_SET (query_hca_cap_in , in , op_mod , UCT_IB_MLX5_HCA_CAP_OPMOD_GET_CUR |
2371
- (UCT_IB_MLX5_CAP_ATOMIC << 1 ));
2372
- status = uct_ib_mlx5_devx_general_cmd (ctx , in , in_len , out , out_len ,
2373
- "QUERY_HCA_CAP, ATOMIC" , 0 );
2373
+ status = uct_ib_mlx5_devx_query_cap (ctx ,
2374
+ UCT_IB_MLX5_HCA_CAP_OPMOD_GET_CUR |
2375
+ (UCT_IB_MLX5_CAP_ATOMIC << 1 ),
2376
+ out , out_len ,
2377
+ "QUERY_HCA_CAP, ATOMIC" , 0 );
2374
2378
if (status != UCS_OK ) {
2375
2379
goto err_lru_cleanup ;
2376
2380
}
0 commit comments