Commit 21e27ac8 authored by Bob Pearson's avatar Bob Pearson Committed by Jason Gunthorpe
Browse files

RDMA/rxe: Fix missed IB reference counting in loopback

When the noted patch below extending the reference taken by
rxe_get_dev_from_net() in rxe_udp_encap_recv() until each skb is freed it
was not matched by a reference in the loopback path resulting in
underflows.

Fixes: 899aba89 ("RDMA/rxe: Fix FIXME in rxe_udp_encap_recv()")
Link: https://lore.kernel.org/r/20210304192048.2958-1-rpearson@hpe.com


Signed-off-by: default avatarBob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent cca7f12b
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -407,13 +407,21 @@ int rxe_send(struct rxe_pkt_info *pkt, struct sk_buff *skb)
	return 0;
}

/* fix up a send packet to match the packets
 * received from UDP before looping them back
 */
void rxe_loopback(struct sk_buff *skb)
{
	struct rxe_pkt_info *pkt = SKB_TO_PKT(skb);

	if (skb->protocol == htons(ETH_P_IP))
		skb_pull(skb, sizeof(struct iphdr));
	else
		skb_pull(skb, sizeof(struct ipv6hdr));

	if (WARN_ON(!ib_device_try_get(&pkt->rxe->ib_dev)))
		kfree_skb(skb);
	else
		rxe_rcv(skb);
}