| From dfc2c790e4d5e5738063df921d7cbb8508537ea1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 22 Jun 2021 16:13:27 +0200 |
| Subject: RDMA/cma: Fix incorrect Packet Lifetime calculation |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Håkon Bugge <haakon.bugge@oracle.com> |
| |
| [ Upstream commit e84045eab69c625bc0b0bf24d8e05bc65da1eed1 ] |
| |
| An approximation for the PacketLifeTime is half the local ACK timeout. |
| The encoding for both timers are logarithmic. |
| |
| If the local ACK timeout is set, but zero, it means the timer is |
| disabled. In this case, we choose the CMA_IBOE_PACKET_LIFETIME value, |
| since 50% of infinite makes no sense. |
| |
| Before this commit, the PacketLifeTime became 255 if local ACK |
| timeout was zero (not running). |
| |
| Fixed by explicitly testing for timeout being zero. |
| |
| Fixes: e1ee1e62bec4 ("RDMA/cma: Use ACK timeout for RoCE packetLifeTime") |
| Link: https://lore.kernel.org/r/1624371207-26710-1-git-send-email-haakon.bugge@oracle.com |
| Signed-off-by: Håkon Bugge <haakon.bugge@oracle.com> |
| Reviewed-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/cma.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
| index f2fd4bc2fbec..be4e447134b3 100644 |
| --- a/drivers/infiniband/core/cma.c |
| +++ b/drivers/infiniband/core/cma.c |
| @@ -3060,8 +3060,10 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv) |
| * as a reasonable approximation for RoCE networks. |
| */ |
| mutex_lock(&id_priv->qp_mutex); |
| - route->path_rec->packet_life_time = id_priv->timeout_set ? |
| - id_priv->timeout - 1 : CMA_IBOE_PACKET_LIFETIME; |
| + if (id_priv->timeout_set && id_priv->timeout) |
| + route->path_rec->packet_life_time = id_priv->timeout - 1; |
| + else |
| + route->path_rec->packet_life_time = CMA_IBOE_PACKET_LIFETIME; |
| mutex_unlock(&id_priv->qp_mutex); |
| |
| if (!route->path_rec->mtu) { |
| -- |
| 2.30.2 |
| |