skbuff: fix ftrace handling in skb_unshare
authorAlexander Aring <alex.aring@gmail.com>
Fri, 10 Oct 2014 21:10:47 +0000 (23:10 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Oct 2014 17:10:31 +0000 (13:10 -0400)
If the skb is not dropped afterwards we should run consume_skb instead
kfree_skb. Inside of function skb_unshare we do always a kfree_skb,
doesn't depend if skb_copy failed or was successful.

This patch switch this behaviour like skb_share_check, if allocation of
sk_buff failed we use kfree_skb otherwise consume_skb.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h

index 3ab0749d6875c5032b12d3188b8420ac97797c8e..a59d9343c25bdc9575eefa1ac361732599db9ddf 100644 (file)
@@ -1203,7 +1203,12 @@ static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
        might_sleep_if(pri & __GFP_WAIT);
        if (skb_cloned(skb)) {
                struct sk_buff *nskb = skb_copy(skb, pri);
-               kfree_skb(skb); /* Free our shared copy */
+
+               /* Free our shared copy */
+               if (likely(nskb))
+                       consume_skb(skb);
+               else
+                       kfree_skb(skb);
                skb = nskb;
        }
        return skb;