--- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1850,12 +1850,15 @@ static inline int skb_clone_writable(con static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom, int cloned) { + unsigned int alloc_headroom = headroom; int delta = 0; if (headroom < NET_SKB_PAD) - headroom = NET_SKB_PAD; - if (headroom > skb_headroom(skb)) - delta = headroom - skb_headroom(skb); + alloc_headroom = NET_SKB_PAD; + if (headroom > skb_headroom(skb) || + (cloned && alloc_headroom > skb_headroom(skb))) { + delta = alloc_headroom - skb_headroom(skb); + } if (delta || cloned) return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0,