IB/mlx5: Return failure when rts2rts_qp_counters_set_id is not supported
authorMark Zhang <markz@mellanox.com>
Sun, 26 Jan 2020 17:17:08 +0000 (19:17 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 11 Feb 2020 18:23:01 +0000 (14:23 -0400)
When binding a QP with a counter and the QP state is not RESET, return
failure if the rts2rts_qp_counters_set_id is not supported by the
device.

This is to prevent cases like manual bind for Connect-IB devices from
returning success when the feature is not supported.

Fixes: d14133dd4161 ("IB/mlx5: Support set qp counter")
Link: https://lore.kernel.org/r/20200126171708.5167-1-leon@kernel.org
Signed-off-by: Mark Zhang <markz@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/qp.c

index a4f8e70..957f3a5 100644 (file)
@@ -3441,9 +3441,6 @@ static int __mlx5_ib_qp_set_counter(struct ib_qp *qp,
        struct mlx5_ib_qp_base *base;
        u32 set_id;
 
-       if (!MLX5_CAP_GEN(dev->mdev, rts2rts_qp_counters_set_id))
-               return 0;
-
        if (counter)
                set_id = counter->id;
        else
@@ -6576,6 +6573,7 @@ void mlx5_ib_drain_rq(struct ib_qp *qp)
  */
 int mlx5_ib_qp_set_counter(struct ib_qp *qp, struct rdma_counter *counter)
 {
+       struct mlx5_ib_dev *dev = to_mdev(qp->device);
        struct mlx5_ib_qp *mqp = to_mqp(qp);
        int err = 0;
 
@@ -6585,6 +6583,11 @@ int mlx5_ib_qp_set_counter(struct ib_qp *qp, struct rdma_counter *counter)
                goto out;
        }
 
+       if (!MLX5_CAP_GEN(dev->mdev, rts2rts_qp_counters_set_id)) {
+               err = -EOPNOTSUPP;
+               goto out;
+       }
+
        if (mqp->state == IB_QPS_RTS) {
                err = __mlx5_ib_qp_set_counter(qp, counter);
                if (!err)