From 69f8c0664c581aea7b09a890b9f90f956b632998 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Mon, 3 May 2010 23:18:14 -0700 Subject: [PATCH] --- yaml --- r: 194650 b: refs/heads/master c: 93bb64eac10aad3dae6178d7da94765f207d121f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/core/datagram.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 5eb65883d646..110db25f87b4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f5460618405eec8c3300947a499011528a115acd +refs/heads/master: 93bb64eac10aad3dae6178d7da94765f207d121f diff --git a/trunk/net/core/datagram.c b/trunk/net/core/datagram.c index 95b851f3d713..e0097531417a 100644 --- a/trunk/net/core/datagram.c +++ b/trunk/net/core/datagram.c @@ -229,13 +229,18 @@ EXPORT_SYMBOL(skb_free_datagram); void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) { + if (likely(atomic_read(&skb->users) == 1)) + smp_rmb(); + else if (likely(!atomic_dec_and_test(&skb->users))) + return; + lock_sock_bh(sk); skb_orphan(skb); sk_mem_reclaim_partial(sk); unlock_sock_bh(sk); - /* skb is now orphaned, might be freed outside of locked section */ - consume_skb(skb); + /* skb is now orphaned, can be freed outside of locked section */ + __kfree_skb(skb); } EXPORT_SYMBOL(skb_free_datagram_locked);