net: reorganize sk_buff for faster __copy_skb_header()
authorEric Dumazet <edumazet@google.com>
Mon, 29 Sep 2014 05:18:47 +0000 (22:18 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Sep 2014 16:27:20 +0000 (12:27 -0400)
commitb1937227316417aa7568d01e6fa1f272e98fb890
tree93891f7672c803b767de6621c028f45edf242f17
parent842abe08aa6f81f1062cf9624e9f6afc117d73e4
net: reorganize sk_buff for faster __copy_skb_header()

With proliferation of bit fields in sk_buff, __copy_skb_header() became
quite expensive, showing as the most expensive function in a GSO
workload.

__copy_skb_header() performance is also critical for non GSO TCP
operations, as it is used from skb_clone()

This patch carefully moves all the fields that were not copied in a
separate zone : cloned, nohdr, fclone, peeked, head_frag, xmit_more

Then I moved all other fields and all other copied fields in a section
delimited by headers_start[0]/headers_end[0] section so that we
can use a single memcpy() call, inlined by compiler using long
word load/stores.

I also tried to make all copies in the natural orders of sk_buff,
to help hardware prefetching.

I made sure sk_buff size did not change.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/core/skbuff.c