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

Commit cb18978c authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller
Browse files

gro: Open-code final pskb_may_pull



As we know the only packets which need the final pskb_may_pull
are completely non-linear, and have all the required bits in
frag0, we can perform a straight memcpy instead of going through
pskb_may_pull and doing skb_copy_bits.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1075f3f6
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -2452,10 +2452,25 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
	ret = GRO_HELD;

pull:
	if (unlikely(!pskb_may_pull(skb, skb_gro_offset(skb)))) {
		if (napi->gro_list == skb)
			napi->gro_list = skb->next;
		ret = GRO_DROP;
	if (skb_headlen(skb) < skb_gro_offset(skb)) {
		int grow = skb_gro_offset(skb) - skb_headlen(skb);

		BUG_ON(skb->end - skb->tail < grow);

		memcpy(skb_tail_pointer(skb), NAPI_GRO_CB(skb)->frag0, grow);

		skb->tail += grow;
		skb->data_len -= grow;

		skb_shinfo(skb)->frags[0].page_offset += grow;
		skb_shinfo(skb)->frags[0].size -= grow;

		if (unlikely(!skb_shinfo(skb)->frags[0].size)) {
			put_page(skb_shinfo(skb)->frags[0].page);
			memmove(skb_shinfo(skb)->frags,
				skb_shinfo(skb)->frags + 1,
				--skb_shinfo(skb)->nr_frags);
		}
	}

ok: