diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2012-05-04 10:26:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-06 13:13:19 -0400 |
commit | 9202e31d4632d82bd713fbd7d3fd229c0cd5b9cf (patch) | |
tree | b56378a2c426de615808b32e195b77623d664b3b | |
parent | bd14b1b2e29bd6812597f896dde06eaf7c6d2f24 (diff) |
skb: Drop bad code from pskb_expand_head
The fast-path for pskb_expand_head contains a check where the size plus the
unaligned size of skb_shared_info is compared against the size of the data
buffer. This code path has two issues. First is the fact that after the
recent changes by Eric Dumazet to __alloc_skb and build_skb the shared info
is always placed in the optimal spot for a buffer size making this check
unnecessary. The second issue is the fact that the check doesn't take into
account the aligned size of shared info. As a result the code burns cycles
doing a memcpy with nothing actually being shifted.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/skbuff.c | 12 |
1 files changed, 0 insertions, 12 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index c199aa428c6d..4d085d454285 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -951,17 +951,6 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
951 | fastpath = atomic_read(&skb_shinfo(skb)->dataref) == delta; | 951 | fastpath = atomic_read(&skb_shinfo(skb)->dataref) == delta; |
952 | } | 952 | } |
953 | 953 | ||
954 | if (fastpath && !skb->head_frag && | ||
955 | size + sizeof(struct skb_shared_info) <= ksize(skb->head)) { | ||
956 | memmove(skb->head + size, skb_shinfo(skb), | ||
957 | offsetof(struct skb_shared_info, | ||
958 | frags[skb_shinfo(skb)->nr_frags])); | ||
959 | memmove(skb->head + nhead, skb->head, | ||
960 | skb_tail_pointer(skb) - skb->head); | ||
961 | off = nhead; | ||
962 | goto adjust_others; | ||
963 | } | ||
964 | |||
965 | data = kmalloc(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)), | 954 | data = kmalloc(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)), |
966 | gfp_mask); | 955 | gfp_mask); |
967 | if (!data) | 956 | if (!data) |
@@ -997,7 +986,6 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
997 | 986 | ||
998 | skb->head = data; | 987 | skb->head = data; |
999 | skb->head_frag = 0; | 988 | skb->head_frag = 0; |
1000 | adjust_others: | ||
1001 | skb->data += off; | 989 | skb->data += off; |
1002 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 990 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
1003 | skb->end = size; | 991 | skb->end = size; |