@@ -28,6 +28,7 @@ struct sk_filter {
struct rcu_head rcu;
unsigned int (*run_filter)(const struct sk_buff *skb,
const struct sock_filter *filter);
+ void (*release_rcu)(struct rcu_head *rcu);
union {
struct sock_filter insns[0];
struct work_struct work;
@@ -1616,8 +1616,6 @@ void sk_common_release(struct sock *sk);
/* Initialise core socket variables */
void sock_init_data(struct socket *sock, struct sock *sk);
-void sk_filter_release_rcu(struct rcu_head *rcu);
-
/**
* sk_filter_release - release a socket filter
* @fp: filter to remove
@@ -1628,7 +1626,7 @@ void sk_filter_release_rcu(struct rcu_head *rcu);
static inline void sk_filter_release(struct sk_filter *fp)
{
if (atomic_dec_and_test(&fp->refcnt))
- call_rcu(&fp->rcu, sk_filter_release_rcu);
+ call_rcu(&fp->rcu, fp->release_rcu);
}
static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
@@ -633,19 +633,19 @@ EXPORT_SYMBOL(sk_chk_filter);
* sk_filter_release_rcu - Release a socket filter by rcu_head
* @rcu: rcu_head that contains the sk_filter to free
*/
-void sk_filter_release_rcu(struct rcu_head *rcu)
+static void sk_filter_release_rcu(struct rcu_head *rcu)
{
struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);
bpf_jit_free(fp);
}
-EXPORT_SYMBOL(sk_filter_release_rcu);
static int __sk_prepare_filter(struct sk_filter *fp)
{
int err;
fp->run_filter = sk_run_filter;
+ fp->release_rcu = sk_filter_release_rcu;
err = sk_chk_filter(fp->insns, sk_bpf_flen(fp));
if (err)
This patch adds generic a new callback function to release bytecode area which depends on the socket filter type. This change prepares the implementation of new socket filtering approaches. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> --- include/linux/filter.h | 1 + include/net/sock.h | 4 +--- net/core/filter.c | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-)