| From 4d9b9b2793c0943f5c493e6403389896e60c632f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 30 Jun 2020 15:36:05 +0300 |
| Subject: RDMA/rxe: Skip dgid check in loopback mode |
| |
| From: Zhu Yanjun <yanjunz@mellanox.com> |
| |
| [ Upstream commit 5c99274be8864519328aa74bc550ba410095bc1c ] |
| |
| In the loopback tests, the following call trace occurs. |
| |
| Call Trace: |
| __rxe_do_task+0x1a/0x30 [rdma_rxe] |
| rxe_qp_destroy+0x61/0xa0 [rdma_rxe] |
| rxe_destroy_qp+0x20/0x60 [rdma_rxe] |
| ib_destroy_qp_user+0xcc/0x220 [ib_core] |
| uverbs_free_qp+0x3c/0xc0 [ib_uverbs] |
| destroy_hw_idr_uobject+0x24/0x70 [ib_uverbs] |
| uverbs_destroy_uobject+0x43/0x1b0 [ib_uverbs] |
| uobj_destroy+0x41/0x70 [ib_uverbs] |
| __uobj_get_destroy+0x39/0x70 [ib_uverbs] |
| ib_uverbs_destroy_qp+0x88/0xc0 [ib_uverbs] |
| ib_uverbs_handler_UVERBS_METHOD_INVOKE_WRITE+0xb9/0xf0 [ib_uverbs] |
| ib_uverbs_cmd_verbs+0xb16/0xc30 [ib_uverbs] |
| |
| The root cause is that the actual RDMA connection is not created in the |
| loopback tests and the rxe_match_dgid will fail randomly. |
| |
| To fix this call trace which appear in the loopback tests, skip check of |
| the dgid. |
| |
| Fixes: 8700e3e7c485 ("Soft RoCE driver") |
| Link: https://lore.kernel.org/r/20200630123605.446959-1-leon@kernel.org |
| Signed-off-by: Zhu Yanjun <yanjunz@mellanox.com> |
| Signed-off-by: Leon Romanovsky <leonro@mellanox.com> |
| Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/sw/rxe/rxe_recv.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c |
| index 831ad578a7b29..46e111c218fd4 100644 |
| --- a/drivers/infiniband/sw/rxe/rxe_recv.c |
| +++ b/drivers/infiniband/sw/rxe/rxe_recv.c |
| @@ -330,10 +330,14 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) |
| |
| static int rxe_match_dgid(struct rxe_dev *rxe, struct sk_buff *skb) |
| { |
| + struct rxe_pkt_info *pkt = SKB_TO_PKT(skb); |
| const struct ib_gid_attr *gid_attr; |
| union ib_gid dgid; |
| union ib_gid *pdgid; |
| |
| + if (pkt->mask & RXE_LOOPBACK_MASK) |
| + return 0; |
| + |
| if (skb->protocol == htons(ETH_P_IP)) { |
| ipv6_addr_set_v4mapped(ip_hdr(skb)->daddr, |
| (struct in6_addr *)&dgid); |
| @@ -366,7 +370,7 @@ void rxe_rcv(struct sk_buff *skb) |
| if (unlikely(skb->len < pkt->offset + RXE_BTH_BYTES)) |
| goto drop; |
| |
| - if (unlikely(rxe_match_dgid(rxe, skb) < 0)) { |
| + if (rxe_match_dgid(rxe, skb) < 0) { |
| pr_warn_ratelimited("failed matching dgid\n"); |
| goto drop; |
| } |
| -- |
| 2.25.1 |
| |