]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
IB/mlx5: Don't hold spin lock while checking device state
authorParav Pandit <parav@mellanox.com>
Tue, 28 Aug 2018 11:45:29 +0000 (14:45 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 6 Sep 2018 19:35:15 +0000 (13:35 -0600)
mdev->state device state is not protected by the QP for which WRs are
being processed. Therefore, there is no need to hold spin lock while
checking mdev state.

Given that device fatal error is unlikely situation, wrap the condition
check with unlikely().

Additionally, kernel QP1 is also a kernel ULP for which soft CQEs needs
to be generated. Therefore, check for device fatal error before
processing QP1 work requests.

Fixes: 89ea94a7b6c4 ("IB/mlx5: Reset flow support for IB kernel ULPs")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Daniel Jurgens <danielj@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 e060499146ad6529ffe6656600a2aa749074e15a..a2073ee7a16f747dac9e187f268ffe52b00988eb 100644 (file)
@@ -4400,6 +4400,12 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
        u8 next_fence = 0;
        u8 fence;
 
+       if (unlikely(mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR &&
+                    !drain)) {
+               *bad_wr = wr;
+               return -EIO;
+       }
+
        if (unlikely(ibqp->qp_type == IB_QPT_GSI))
                return mlx5_ib_gsi_post_send(ibqp, wr, bad_wr);
 
@@ -4409,13 +4415,6 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
 
        spin_lock_irqsave(&qp->sq.lock, flags);
 
-       if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && !drain) {
-               err = -EIO;
-               *bad_wr = wr;
-               nreq = 0;
-               goto out;
-       }
-
        for (nreq = 0; wr; nreq++, wr = wr->next) {
                if (unlikely(wr->opcode >= ARRAY_SIZE(mlx5_ib_opcode))) {
                        mlx5_ib_warn(dev, "\n");
@@ -4729,18 +4728,17 @@ static int _mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
        int ind;
        int i;
 
+       if (unlikely(mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR &&
+                    !drain)) {
+               *bad_wr = wr;
+               return -EIO;
+       }
+
        if (unlikely(ibqp->qp_type == IB_QPT_GSI))
                return mlx5_ib_gsi_post_recv(ibqp, wr, bad_wr);
 
        spin_lock_irqsave(&qp->rq.lock, flags);
 
-       if (mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR && !drain) {
-               err = -EIO;
-               *bad_wr = wr;
-               nreq = 0;
-               goto out;
-       }
-
        ind = qp->rq.head & (qp->rq.wqe_cnt - 1);
 
        for (nreq = 0; wr; nreq++, wr = wr->next) {