Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 223185
b: refs/heads/master
c: 46bcf14
h: refs/heads/master
i:
  223183: b3c7d86
v: v3
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Dec 6, 2010
1 parent 813668c commit 4eb8c0c
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e7dfc8dbdf9a7fa1ef04c63100a71f4102b82ed3
refs/heads/master: 46bcf14f44d8f31ecfdc8b6708ec15a3b33316d9
4 changes: 3 additions & 1 deletion trunk/include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,8 @@ extern void sk_common_release(struct sock *sk);
/* Initialise core socket variables */
extern void sock_init_data(struct socket *sock, struct sock *sk);

extern void sk_filter_release_rcu(struct rcu_head *rcu);

/**
* sk_filter_release - release a socket filter
* @fp: filter to remove
Expand All @@ -1165,7 +1167,7 @@ extern void sock_init_data(struct socket *sock, struct sock *sk);
static inline void sk_filter_release(struct sk_filter *fp)
{
if (atomic_dec_and_test(&fp->refcnt))
kfree(fp);
call_rcu_bh(&fp->rcu, sk_filter_release_rcu);
}

static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
Expand Down
19 changes: 6 additions & 13 deletions trunk/net/core/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,23 +589,16 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
EXPORT_SYMBOL(sk_chk_filter);

/**
* sk_filter_rcu_release - Release a socket filter by rcu_head
* sk_filter_release_rcu - Release a socket filter by rcu_head
* @rcu: rcu_head that contains the sk_filter to free
*/
static void sk_filter_rcu_release(struct rcu_head *rcu)
void sk_filter_release_rcu(struct rcu_head *rcu)
{
struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);

sk_filter_release(fp);
}

static void sk_filter_delayed_uncharge(struct sock *sk, struct sk_filter *fp)
{
unsigned int size = sk_filter_len(fp);

atomic_sub(size, &sk->sk_omem_alloc);
call_rcu_bh(&fp->rcu, sk_filter_rcu_release);
kfree(fp);
}
EXPORT_SYMBOL(sk_filter_release_rcu);

/**
* sk_attach_filter - attach a socket filter
Expand Down Expand Up @@ -649,7 +642,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
rcu_assign_pointer(sk->sk_filter, fp);

if (old_fp)
sk_filter_delayed_uncharge(sk, old_fp);
sk_filter_uncharge(sk, old_fp);
return 0;
}
EXPORT_SYMBOL_GPL(sk_attach_filter);
Expand All @@ -663,7 +656,7 @@ int sk_detach_filter(struct sock *sk)
sock_owned_by_user(sk));
if (filter) {
rcu_assign_pointer(sk->sk_filter, NULL);
sk_filter_delayed_uncharge(sk, filter);
sk_filter_uncharge(sk, filter);
ret = 0;
}
return ret;
Expand Down

0 comments on commit 4eb8c0c

Please sign in to comment.