@@ -4502,6 +4502,40 @@ static bool mlx5_ib_modify_qp_allowed(struct mlx5_ib_dev *dev,
4502
4502
return false;
4503
4503
}
4504
4504
4505
+ static int validate_rd_atomic (struct mlx5_ib_dev * dev , struct ib_qp_attr * attr ,
4506
+ int attr_mask , enum ib_qp_type qp_type )
4507
+ {
4508
+ int log_max_ra_res ;
4509
+ int log_max_ra_req ;
4510
+
4511
+ if (qp_type == MLX5_IB_QPT_DCI ) {
4512
+ log_max_ra_res = 1 << MLX5_CAP_GEN (dev -> mdev ,
4513
+ log_max_ra_res_dc );
4514
+ log_max_ra_req = 1 << MLX5_CAP_GEN (dev -> mdev ,
4515
+ log_max_ra_req_dc );
4516
+ } else {
4517
+ log_max_ra_res = 1 << MLX5_CAP_GEN (dev -> mdev ,
4518
+ log_max_ra_res_qp );
4519
+ log_max_ra_req = 1 << MLX5_CAP_GEN (dev -> mdev ,
4520
+ log_max_ra_req_qp );
4521
+ }
4522
+
4523
+ if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC &&
4524
+ attr -> max_rd_atomic > log_max_ra_res ) {
4525
+ mlx5_ib_dbg (dev , "invalid max_rd_atomic value %d\n" ,
4526
+ attr -> max_rd_atomic );
4527
+ return false;
4528
+ }
4529
+
4530
+ if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC &&
4531
+ attr -> max_dest_rd_atomic > log_max_ra_req ) {
4532
+ mlx5_ib_dbg (dev , "invalid max_dest_rd_atomic value %d\n" ,
4533
+ attr -> max_dest_rd_atomic );
4534
+ return false;
4535
+ }
4536
+ return true;
4537
+ }
4538
+
4505
4539
int mlx5_ib_modify_qp (struct ib_qp * ibqp , struct ib_qp_attr * attr ,
4506
4540
int attr_mask , struct ib_udata * udata )
4507
4541
{
@@ -4589,21 +4623,8 @@ int mlx5_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
4589
4623
goto out ;
4590
4624
}
4591
4625
4592
- if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC &&
4593
- attr -> max_rd_atomic >
4594
- (1 << MLX5_CAP_GEN (dev -> mdev , log_max_ra_res_qp ))) {
4595
- mlx5_ib_dbg (dev , "invalid max_rd_atomic value %d\n" ,
4596
- attr -> max_rd_atomic );
4597
- goto out ;
4598
- }
4599
-
4600
- if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC &&
4601
- attr -> max_dest_rd_atomic >
4602
- (1 << MLX5_CAP_GEN (dev -> mdev , log_max_ra_req_qp ))) {
4603
- mlx5_ib_dbg (dev , "invalid max_dest_rd_atomic value %d\n" ,
4604
- attr -> max_dest_rd_atomic );
4626
+ if (!validate_rd_atomic (dev , attr , attr_mask , qp_type ))
4605
4627
goto out ;
4606
- }
4607
4628
4608
4629
if (cur_state == new_state && cur_state == IB_QPS_RESET ) {
4609
4630
err = 0 ;
0 commit comments