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

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

net: pskb_expand_head() optimization



Move frags[] at the end of struct skb_shared_info, and make
pskb_expand_head() copy only the used part of it instead of whole array.

This should avoid kmemcheck warnings and speedup pskb_expand_head() as
well, avoiding a lot of cache misses.

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c1f79426
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -202,10 +202,11 @@ struct skb_shared_info {
	 */
	 */
	atomic_t	dataref;
	atomic_t	dataref;


	skb_frag_t	frags[MAX_SKB_FRAGS];
	/* Intermediate layers must ensure that destructor_arg
	/* Intermediate layers must ensure that destructor_arg
	 * remains valid until skb destructor */
	 * remains valid until skb destructor */
	void *		destructor_arg;
	void *		destructor_arg;
	/* must be last field, see pskb_expand_head() */
	skb_frag_t	frags[MAX_SKB_FRAGS];
};
};


/* We divide dataref into two halves.  The higher 16 bits hold references
/* We divide dataref into two halves.  The higher 16 bits hold references
+1 −1
Original line number Original line Diff line number Diff line
@@ -817,7 +817,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
	memcpy(data + nhead, skb->head, skb->tail - skb->head);
	memcpy(data + nhead, skb->head, skb->tail - skb->head);
#endif
#endif
	memcpy(data + size, skb_end_pointer(skb),
	memcpy(data + size, skb_end_pointer(skb),
	       sizeof(struct skb_shared_info));
	       offsetof(struct skb_shared_info, frags[skb_shinfo(skb)->nr_frags]));


	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
		get_page(skb_shinfo(skb)->frags[i].page);
		get_page(skb_shinfo(skb)->frags[i].page);