RDMA/rxe: Skip dgid check in loopback mode
Subsystems (2)
PATCH 1/1 RDMA/rxe: Skip dgid check in loopback mode
From: Zhu Yanjun <[email protected]>
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")
Signed-off-by Zhu Yanjun <[email protected]>
Signed-off-by Leon Romanovsky <[email protected]>
--- drivers/infiniband/sw/rxe/rxe_recv.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/infiniband/sw/rxe/rxe_recv.c +5 -1
@@ -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.26.2
Quoted 24 lines · Leon Romanovsky
From: Zhu Yanjun <[email protected]>
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_dgidwill fail randomly.To fix this call trace which appear in the loopback tests, skip check of the dgid.
Quoted 6 lines
Fixes 8700e3e7c485 ("Soft RoCE driver")Signed-off-by Zhu Yanjun <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>--- drivers/infiniband/sw/rxe/rxe_recv.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Applied to for-next, thanks
Jason