| From d7acc40394cdbf6ce303cd3b279156281cff57d1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 4 Apr 2022 11:58:05 +0300 |
| Subject: IB/cm: Cancel mad on the DREQ event when the state is MRA_REP_RCVD |
| |
| From: Mark Zhang <markzhang@nvidia.com> |
| |
| [ Upstream commit 107dd7beba403a363adfeb3ffe3734fe38a05cce ] |
| |
| On the passive side when the disconnectReq event comes, if the current |
| state is MRA_REP_RCVD, it needs to cancel the MAD before entering the |
| DREQ_RCVD and TIMEWAIT states, otherwise the destroy_id may block until |
| this mad will reach timeout. |
| |
| Fixes: a977049dacde ("[PATCH] IB: Add the kernel CM implementation") |
| Link: https://lore.kernel.org/r/75261c00c1d82128b1d981af9ff46e994186e621.1649062436.git.leonro@nvidia.com |
| Signed-off-by: Mark Zhang <markzhang@nvidia.com> |
| Reviewed-by: Maor Gottlieb <maorg@nvidia.com> |
| Signed-off-by: Leon Romanovsky <leonro@nvidia.com> |
| Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/core/cm.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c |
| index 35f0d5e7533d..1c107d6d03b9 100644 |
| --- a/drivers/infiniband/core/cm.c |
| +++ b/drivers/infiniband/core/cm.c |
| @@ -2824,6 +2824,7 @@ static int cm_dreq_handler(struct cm_work *work) |
| switch (cm_id_priv->id.state) { |
| case IB_CM_REP_SENT: |
| case IB_CM_DREQ_SENT: |
| + case IB_CM_MRA_REP_RCVD: |
| ib_cancel_mad(cm_id_priv->msg); |
| break; |
| case IB_CM_ESTABLISHED: |
| @@ -2831,8 +2832,6 @@ static int cm_dreq_handler(struct cm_work *work) |
| cm_id_priv->id.lap_state == IB_CM_MRA_LAP_RCVD) |
| ib_cancel_mad(cm_id_priv->msg); |
| break; |
| - case IB_CM_MRA_REP_RCVD: |
| - break; |
| case IB_CM_TIMEWAIT: |
| atomic_long_inc(&work->port->counters[CM_RECV_DUPLICATES] |
| [CM_DREQ_COUNTER]); |
| -- |
| 2.35.1 |
| |