@@ -1883,12 +1883,20 @@ static void uct_ib_mlx5_devx_check_dp_ordering(uct_ib_mlx5_md_t *md, void *cap,
18831883 void * cap_2 ,
18841884 uct_ib_device_t * dev )
18851885{
1886- if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_rw_rc )) {
1887- md -> flags |= UCT_IB_MLX5_MD_FLAG_DP_ORDERING_OOO_RW_RC ;
1886+ if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_all_rc )) {
1887+ md -> dp_ordering_cap .rc = UCT_IB_MLX5_DP_ORDERING_OOO_ALL ;
1888+ } else if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_rw_rc )) {
1889+ md -> dp_ordering_cap .rc = UCT_IB_MLX5_DP_ORDERING_OOO_RW ;
1890+ } else {
1891+ md -> dp_ordering_cap .rc = UCT_IB_MLX5_DP_ORDERING_IBTA ;
18881892 }
18891893
1890- if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_rw_dc )) {
1891- md -> flags |= UCT_IB_MLX5_MD_FLAG_DP_ORDERING_OOO_RW_DC ;
1894+ if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_all_dc )) {
1895+ md -> dp_ordering_cap .dc = UCT_IB_MLX5_DP_ORDERING_OOO_ALL ;
1896+ } else if (UCT_IB_MLX5DV_GET (cmd_hca_cap , cap , dp_ordering_ooo_rw_dc )) {
1897+ md -> dp_ordering_cap .dc = UCT_IB_MLX5_DP_ORDERING_OOO_RW ;
1898+ } else {
1899+ md -> dp_ordering_cap .dc = UCT_IB_MLX5_DP_ORDERING_IBTA ;
18921900 }
18931901
18941902 if ((cap_2 != NULL ) &&
@@ -1899,8 +1907,7 @@ static void uct_ib_mlx5_devx_check_dp_ordering(uct_ib_mlx5_md_t *md, void *cap,
18991907 ucs_debug ("%s: dp_ordering support: force=%d ooo_rw_rc=%d ooo_rw_dc=%d" ,
19001908 uct_ib_device_name (dev ),
19011909 !!(md -> flags & UCT_IB_MLX5_MD_FLAG_DP_ORDERING_FORCE ),
1902- !!(md -> flags & UCT_IB_MLX5_MD_FLAG_DP_ORDERING_OOO_RW_RC ),
1903- !!(md -> flags & UCT_IB_MLX5_MD_FLAG_DP_ORDERING_OOO_RW_DC ));
1910+ md -> dp_ordering_cap .rc , md -> dp_ordering_cap .dc );
19041911}
19051912
19061913static void uct_ib_mlx5_devx_check_mkey_by_name (uct_ib_mlx5_md_t * md ,
@@ -3153,7 +3160,8 @@ static void uct_ib_mlx5dv_check_dc(uct_ib_device_t *dev)
31533160
31543161static uct_ib_md_ops_t uct_ib_mlx5_md_ops ;
31553162
3156- static void uct_ib_mlx5dv_query_ddp (struct ibv_context * ctx , uct_ib_mlx5_md_t * md )
3163+ static ucs_status_t
3164+ uct_ib_mlx5dv_check_ddp (struct ibv_context * ctx , uct_ib_mlx5_md_t * md )
31573165{
31583166#ifdef HAVE_OOO_RECV_WRS
31593167 struct mlx5dv_context ctx_dv = {
@@ -3164,13 +3172,21 @@ static void uct_ib_mlx5dv_query_ddp(struct ibv_context *ctx, uct_ib_mlx5_md_t *m
31643172 ret = mlx5dv_query_device (ctx , & ctx_dv );
31653173 if (ret != 0 ) {
31663174 ucs_error ("mlx5dv_query_device: Failed to query device capabilities, ret=%d\n" , ret );
3167- return ;
3175+ return UCS_ERR_NO_RESOURCE ;
31683176 }
31693177
31703178 if (ctx_dv .ooo_recv_wrs_caps .max_rc > 0 ) {
3171- md -> flags |= UCT_IB_MLX5_MD_FLAG_DDP ;
3179+ md -> dp_ordering_cap .rc = UCT_IB_MLX5_DP_ORDERING_OOO_ALL ;
3180+ }
3181+
3182+ if (ctx_dv .ooo_recv_wrs_caps .max_dct > 0 ) {
3183+ md -> dp_ordering_cap .dc = UCT_IB_MLX5_DP_ORDERING_OOO_ALL ;
31723184 }
3185+ #else
3186+ md -> dp_ordering_cap .rc = UCT_IB_MLX5_DP_ORDERING_IBTA ;
3187+ md -> dp_ordering_cap .dc = UCT_IB_MLX5_DP_ORDERING_IBTA ;
31733188#endif
3189+ return UCS_OK ;
31743190}
31753191
31763192static ucs_status_t uct_ib_mlx5dv_md_open (struct ibv_device * ibv_device ,
@@ -3208,7 +3224,10 @@ static ucs_status_t uct_ib_mlx5dv_md_open(struct ibv_device *ibv_device,
32083224 goto err_md_free ;
32093225 }
32103226
3211- uct_ib_mlx5dv_query_ddp (ctx , md );
3227+ status = uct_ib_mlx5dv_check_ddp (ctx , md );
3228+ if (status != UCS_OK ) {
3229+ goto err_md_free ;
3230+ }
32123231
32133232 if (IBV_DEVICE_ATOMIC_HCA (dev )) {
32143233 dev -> atomic_arg_sizes = sizeof (uint64_t );
0 commit comments