From 7908210684423d84554ea4a768ca9facd8093a81 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 17 Oct 2007 21:21:51 -0700 Subject: [PATCH] --- yaml --- r: 71278 b: refs/heads/master c: 309dd5fc872448e35634d510049642312ebc170d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/net/sock.h | 12 ++++++++---- trunk/net/core/filter.c | 4 ++-- trunk/net/core/sock.c | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index a3dcece48422..9a7da8e6b799 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 55b333253d5bcafbe187b50474e40789301c53c6 +refs/heads/master: 309dd5fc872448e35634d510049642312ebc170d diff --git a/trunk/include/net/sock.h b/trunk/include/net/sock.h index 453c79d0915b..b9cfe125c9e6 100644 --- a/trunk/include/net/sock.h +++ b/trunk/include/net/sock.h @@ -922,14 +922,18 @@ static inline void sk_filter_rcu_free(struct rcu_head *rcu) * Remove a filter from a socket and release its resources. */ -static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) +static inline void sk_filter_release(struct sk_filter *fp) +{ + if (atomic_dec_and_test(&fp->refcnt)) + call_rcu_bh(&fp->rcu, sk_filter_rcu_free); +} + +static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) { unsigned int size = sk_filter_len(fp); atomic_sub(size, &sk->sk_omem_alloc); - - if (atomic_dec_and_test(&fp->refcnt)) - call_rcu_bh(&fp->rcu, sk_filter_rcu_free); + sk_filter_release(fp); } static inline void sk_filter_charge(struct sock *sk, struct sk_filter *fp) diff --git a/trunk/net/core/filter.c b/trunk/net/core/filter.c index fd607581ab50..2be1830d3c35 100644 --- a/trunk/net/core/filter.c +++ b/trunk/net/core/filter.c @@ -429,7 +429,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) } if (fp) - sk_filter_release(sk, fp); + sk_filter_uncharge(sk, fp); return err; } @@ -442,7 +442,7 @@ int sk_detach_filter(struct sock *sk) filter = rcu_dereference(sk->sk_filter); if (filter) { rcu_assign_pointer(sk->sk_filter, NULL); - sk_filter_release(sk, filter); + sk_filter_uncharge(sk, filter); ret = 0; } rcu_read_unlock_bh(); diff --git a/trunk/net/core/sock.c b/trunk/net/core/sock.c index 07101381b8b7..d292b4113d6e 100644 --- a/trunk/net/core/sock.c +++ b/trunk/net/core/sock.c @@ -915,7 +915,7 @@ void sk_free(struct sock *sk) filter = rcu_dereference(sk->sk_filter); if (filter) { - sk_filter_release(sk, filter); + sk_filter_uncharge(sk, filter); rcu_assign_pointer(sk->sk_filter, NULL); }