Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b28ba726 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

IPoIB: fix skb truesize underestimatiom



Or Gerlitz reported triggering of WARN_ON_ONCE(delta < len); in
skb_try_coalesce()
This warning tracks drivers that incorrectly set skb->truesize

IPoIB indeed allocates a full page to store a fragment, but only
accounts in skb->truesize the used part of the page (frame length)

This patch fixes skb truesize underestimation, and
also fixes a performance issue, because RX skbs have not enough tailroom
to allow IP and TCP stacks to pull their header in skb linear part
without an expensive call to pskb_expand_head()

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Cc: Erez Shitrit <erezsh@mellanox.com>
Cc: Shlomo Pongartz <shlomop@mellanox.com>
Cc: Roland Dreier <roland@purestorage.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent efc73f4b
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ static void ipoib_ud_skb_put_frags(struct ipoib_dev_priv *priv,

		skb_frag_size_set(frag, size);
		skb->data_len += size;
		skb->truesize += size;
		skb->truesize += PAGE_SIZE;
	} else
		skb_put(skb, length);

@@ -156,14 +156,18 @@ static struct sk_buff *ipoib_alloc_rx_skb(struct net_device *dev, int id)
	struct ipoib_dev_priv *priv = netdev_priv(dev);
	struct sk_buff *skb;
	int buf_size;
	int tailroom;
	u64 *mapping;

	if (ipoib_ud_need_sg(priv->max_ib_mtu))
	if (ipoib_ud_need_sg(priv->max_ib_mtu)) {
		buf_size = IPOIB_UD_HEAD_SIZE;
	else
		tailroom = 128; /* reserve some tailroom for IP/TCP headers */
	} else {
		buf_size = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
		tailroom = 0;
	}

	skb = dev_alloc_skb(buf_size + 4);
	skb = dev_alloc_skb(buf_size + tailroom + 4);
	if (unlikely(!skb))
		return NULL;