netfilter: ecache: remove nf_exp_event_notifier structure
authorFlorian Westphal <fw@strlen.de>
Mon, 16 Aug 2021 15:16:26 +0000 (17:16 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 25 Aug 2021 10:50:38 +0000 (12:50 +0200)
Reuse the conntrack event notofier struct, this allows to remove the
extra register/unregister functions and avoids a pointer in struct net.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nf_conntrack_ecache.h
include/net/netns/conntrack.h
net/netfilter/nf_conntrack_ecache.c
net/netfilter/nf_conntrack_netlink.c

index 061a93a03b82d0f5ab038e9548a43010b67eed5c..d932e22edcb4c1e719bf3a64966d717a3a6b220d 100644 (file)
@@ -72,8 +72,15 @@ struct nf_ct_event {
        int report;
 };
 
+struct nf_exp_event {
+       struct nf_conntrack_expect *exp;
+       u32 portid;
+       int report;
+};
+
 struct nf_ct_event_notifier {
        int (*ct_event)(unsigned int events, const struct nf_ct_event *item);
+       int (*exp_event)(unsigned int events, const struct nf_exp_event *item);
 };
 
 void nf_conntrack_register_notifier(struct net *net,
@@ -150,22 +157,6 @@ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
 }
 
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
-
-struct nf_exp_event {
-       struct nf_conntrack_expect *exp;
-       u32 portid;
-       int report;
-};
-
-struct nf_exp_event_notifier {
-       int (*exp_event)(unsigned int events, struct nf_exp_event *item);
-};
-
-int nf_ct_expect_register_notifier(struct net *net,
-                                  struct nf_exp_event_notifier *nb);
-void nf_ct_expect_unregister_notifier(struct net *net,
-                                     struct nf_exp_event_notifier *nb);
-
 void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
                               struct nf_conntrack_expect *exp,
                               u32 portid, int report);
index fefd38db95b3e6828c4248f4285e109fcc9ab497..0294f3d473af85da7c4f6116eceedc68c7840d1d 100644 (file)
@@ -113,7 +113,6 @@ struct netns_ct {
        struct ct_pcpu __percpu *pcpu_lists;
        struct ip_conntrack_stat __percpu *stat;
        struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
-       struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
        struct nf_ip_net        nf_ct_proto;
 #if defined(CONFIG_NF_CONNTRACK_LABELS)
        unsigned int            labels_used;
index d92f78e4bc7c34d675e663a71777d866e34c5832..41768ff19464b2bf65e2ea1c3812155a7821cc22 100644 (file)
@@ -240,11 +240,11 @@ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
 
 {
        struct net *net = nf_ct_exp_net(exp);
-       struct nf_exp_event_notifier *notify;
+       struct nf_ct_event_notifier *notify;
        struct nf_conntrack_ecache *e;
 
        rcu_read_lock();
-       notify = rcu_dereference(net->ct.nf_expect_event_cb);
+       notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
        if (!notify)
                goto out_unlock;
 
@@ -283,47 +283,10 @@ void nf_conntrack_unregister_notifier(struct net *net)
        mutex_lock(&nf_ct_ecache_mutex);
        RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
        mutex_unlock(&nf_ct_ecache_mutex);
-       /* synchronize_rcu() is called from ctnetlink_exit. */
+       /* synchronize_rcu() is called after netns pre_exit */
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
 
-int nf_ct_expect_register_notifier(struct net *net,
-                                  struct nf_exp_event_notifier *new)
-{
-       int ret;
-       struct nf_exp_event_notifier *notify;
-
-       mutex_lock(&nf_ct_ecache_mutex);
-       notify = rcu_dereference_protected(net->ct.nf_expect_event_cb,
-                                          lockdep_is_held(&nf_ct_ecache_mutex));
-       if (notify != NULL) {
-               ret = -EBUSY;
-               goto out_unlock;
-       }
-       rcu_assign_pointer(net->ct.nf_expect_event_cb, new);
-       ret = 0;
-
-out_unlock:
-       mutex_unlock(&nf_ct_ecache_mutex);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier);
-
-void nf_ct_expect_unregister_notifier(struct net *net,
-                                     struct nf_exp_event_notifier *new)
-{
-       struct nf_exp_event_notifier *notify;
-
-       mutex_lock(&nf_ct_ecache_mutex);
-       notify = rcu_dereference_protected(net->ct.nf_expect_event_cb,
-                                          lockdep_is_held(&nf_ct_ecache_mutex));
-       BUG_ON(notify != new);
-       RCU_INIT_POINTER(net->ct.nf_expect_event_cb, NULL);
-       mutex_unlock(&nf_ct_ecache_mutex);
-       /* synchronize_rcu() is called from ctnetlink_exit. */
-}
-EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);
-
 void nf_conntrack_ecache_work(struct net *net, enum nf_ct_ecache_state state)
 {
        struct nf_conntrack_net *cnet = nf_ct_pernet(net);
index 6d6f7cd70753d6546ced0900385ad45403d8f850..5008fa0891b3093a1ca3d58f4dd71f8390a43f60 100644 (file)
@@ -3104,7 +3104,7 @@ nla_put_failure:
 
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
 static int
-ctnetlink_expect_event(unsigned int events, struct nf_exp_event *item)
+ctnetlink_expect_event(unsigned int events, const struct nf_exp_event *item)
 {
        struct nf_conntrack_expect *exp = item->exp;
        struct net *net = nf_ct_exp_net(exp);
@@ -3756,9 +3756,6 @@ static int ctnetlink_stat_exp_cpu(struct sk_buff *skb,
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
 static struct nf_ct_event_notifier ctnl_notifier = {
        .ct_event = ctnetlink_conntrack_event,
-};
-
-static struct nf_exp_event_notifier ctnl_notifier_exp = {
        .exp_event = ctnetlink_expect_event,
 };
 #endif
@@ -3852,42 +3849,21 @@ MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_CTNETLINK_EXP);
 static int __net_init ctnetlink_net_init(struct net *net)
 {
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
-       int ret;
-
        nf_conntrack_register_notifier(net, &ctnl_notifier);
-
-       ret = nf_ct_expect_register_notifier(net, &ctnl_notifier_exp);
-       if (ret < 0) {
-               pr_err("ctnetlink_init: cannot expect register notifier.\n");
-               nf_conntrack_unregister_notifier(net);
-               return ret;
-       }
 #endif
        return 0;
 }
 
-static void ctnetlink_net_exit(struct net *net)
+static void ctnetlink_net_pre_exit(struct net *net)
 {
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
-       nf_ct_expect_unregister_notifier(net, &ctnl_notifier_exp);
        nf_conntrack_unregister_notifier(net);
 #endif
 }
 
-static void __net_exit ctnetlink_net_exit_batch(struct list_head *net_exit_list)
-{
-       struct net *net;
-
-       list_for_each_entry(net, net_exit_list, exit_list)
-               ctnetlink_net_exit(net);
-
-       /* wait for other cpus until they are done with ctnl_notifiers */
-       synchronize_rcu();
-}
-
 static struct pernet_operations ctnetlink_net_ops = {
        .init           = ctnetlink_net_init,
-       .exit_batch     = ctnetlink_net_exit_batch,
+       .pre_exit       = ctnetlink_net_pre_exit,
 };
 
 static int __init ctnetlink_init(void)