diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/skbuff.h | 14 | ||||
| -rw-r--r-- | include/linux/sysctl.h | 1 | ||||
| -rw-r--r-- | include/net/dst.h | 1 |
3 files changed, 7 insertions, 9 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index a6b744bccdc8..23e0b48b79a4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -353,15 +353,11 @@ static inline struct sk_buff *skb_get(struct sk_buff *skb) */ static inline void kfree_skb(struct sk_buff *skb) { - if (atomic_read(&skb->users) == 1 || atomic_dec_and_test(&skb->users)) - __kfree_skb(skb); -} - -/* Use this if you didn't touch the skb state [for fast switching] */ -static inline void kfree_skb_fast(struct sk_buff *skb) -{ - if (atomic_read(&skb->users) == 1 || atomic_dec_and_test(&skb->users)) - kfree_skbmem(skb); + if (likely(atomic_read(&skb->users) == 1)) + smp_rmb(); + else if (likely(!atomic_dec_and_test(&skb->users))) + return; + __kfree_skb(skb); } /** diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 86488d26260a..06bdf80154fb 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -365,6 +365,7 @@ enum { NET_IPV4_ROUTE_MIN_PMTU=16, NET_IPV4_ROUTE_MIN_ADVMSS=17, NET_IPV4_ROUTE_SECRET_INTERVAL=18, + NET_IPV4_ROUTE_GC_MIN_INTERVAL_MS=19, }; enum diff --git a/include/net/dst.h b/include/net/dst.h index 7ffb470d0e9a..d214a5781c17 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -147,6 +147,7 @@ void dst_release(struct dst_entry * dst) { if (dst) { WARN_ON(atomic_read(&dst->__refcnt) < 1); + smp_mb__before_atomic_dec(); atomic_dec(&dst->__refcnt); } } |
