ipmr, ip6mr: Unite creation of new mr_table
authorYuval Mintz <yuvalm@mellanox.com>
Wed, 28 Feb 2018 21:29:33 +0000 (23:29 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 1 Mar 2018 18:13:23 +0000 (13:13 -0500)
Now that both ipmr and ip6mr are using the same mr_table structure,
we can have a common function to allocate & initialize a new instance.

Signed-off-by: Yuval Mintz <yuvalm@mellanox.com>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/mroute_base.h
net/ipv4/ipmr.c
net/ipv4/ipmr_base.c
net/ipv6/ip6mr.c

index 1cc944a..8053057 100644 (file)
@@ -85,6 +85,13 @@ void vif_device_init(struct vif_device *v,
                     unsigned char threshold,
                     unsigned short flags,
                     unsigned short get_iflink_mask);
+
+struct mr_table *
+mr_table_alloc(struct net *net, u32 id,
+              const struct rhashtable_params *rht_params,
+              void (*expire_func)(struct timer_list *t),
+              void (*table_set)(struct mr_table *mrt,
+                                struct net *net));
 #else
 static inline void vif_device_init(struct vif_device *v,
                                   struct net_device *dev,
@@ -94,5 +101,15 @@ static inline void vif_device_init(struct vif_device *v,
                                   unsigned short get_iflink_mask)
 {
 }
+
+static inline struct mr_table *
+mr_table_alloc(struct net *net, u32 id,
+              const struct rhashtable_params *rht_params,
+              void (*expire_func)(struct timer_list *t),
+              void (*table_set)(struct mr_table *mrt,
+                                struct net *net))
+{
+       return NULL;
+}
 #endif
 #endif
index a1bf002..f213933 100644 (file)
@@ -352,6 +352,14 @@ static const struct rhashtable_params ipmr_rht_params = {
        .automatic_shrinking = true,
 };
 
+static void ipmr_new_table_set(struct mr_table *mrt,
+                              struct net *net)
+{
+#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
+       list_add_tail_rcu(&mrt->list, &net->ipv4.mr_tables);
+#endif
+}
+
 static struct mr_table *ipmr_new_table(struct net *net, u32 id)
 {
        struct mr_table *mrt;
@@ -364,23 +372,8 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
        if (mrt)
                return mrt;
 
-       mrt = kzalloc(sizeof(*mrt), GFP_KERNEL);
-       if (!mrt)
-               return ERR_PTR(-ENOMEM);
-       write_pnet(&mrt->net, net);
-       mrt->id = id;
-
-       rhltable_init(&mrt->mfc_hash, &ipmr_rht_params);
-       INIT_LIST_HEAD(&mrt->mfc_cache_list);
-       INIT_LIST_HEAD(&mrt->mfc_unres_queue);
-
-       timer_setup(&mrt->ipmr_expire_timer, ipmr_expire_process, 0);
-
-       mrt->mroute_reg_vif_num = -1;
-#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
-       list_add_tail_rcu(&mrt->list, &net->ipv4.mr_tables);
-#endif
-       return mrt;
+       return mr_table_alloc(net, id, &ipmr_rht_params,
+                             ipmr_expire_process, ipmr_new_table_set);
 }
 
 static void ipmr_free_table(struct mr_table *mrt)
index 22758f8..3e21a58 100644 (file)
@@ -26,3 +26,30 @@ void vif_device_init(struct vif_device *v,
                v->link = dev->ifindex;
 }
 EXPORT_SYMBOL(vif_device_init);
+
+struct mr_table *
+mr_table_alloc(struct net *net, u32 id,
+              const struct rhashtable_params *rht_params,
+              void (*expire_func)(struct timer_list *t),
+              void (*table_set)(struct mr_table *mrt,
+                                struct net *net))
+{
+       struct mr_table *mrt;
+
+       mrt = kzalloc(sizeof(*mrt), GFP_KERNEL);
+       if (!mrt)
+               return NULL;
+       mrt->id = id;
+       write_pnet(&mrt->net, net);
+
+       rhltable_init(&mrt->mfc_hash, rht_params);
+       INIT_LIST_HEAD(&mrt->mfc_cache_list);
+       INIT_LIST_HEAD(&mrt->mfc_unres_queue);
+
+       timer_setup(&mrt->ipmr_expire_timer, expire_func, 0);
+
+       mrt->mroute_reg_vif_num = -1;
+       table_set(mrt, net);
+       return mrt;
+}
+EXPORT_SYMBOL(mr_table_alloc);
index adbb826..d508528 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/init.h>
-#include <linux/slab.h>
 #include <linux/compat.h>
 #include <net/protocol.h>
 #include <linux/skbuff.h>
@@ -295,6 +294,14 @@ static const struct rhashtable_params ip6mr_rht_params = {
        .automatic_shrinking = true,
 };
 
+static void ip6mr_new_table_set(struct mr_table *mrt,
+                               struct net *net)
+{
+#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
+       list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables);
+#endif
+}
+
 static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
 {
        struct mr_table *mrt;
@@ -303,25 +310,8 @@ static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
        if (mrt)
                return mrt;
 
-       mrt = kzalloc(sizeof(*mrt), GFP_KERNEL);
-       if (!mrt)
-               return NULL;
-       mrt->id = id;
-       write_pnet(&mrt->net, net);
-
-       rhltable_init(&mrt->mfc_hash, &ip6mr_rht_params);
-       INIT_LIST_HEAD(&mrt->mfc_cache_list);
-       INIT_LIST_HEAD(&mrt->mfc_unres_queue);
-
-       timer_setup(&mrt->ipmr_expire_timer, ipmr_expire_process, 0);
-
-#ifdef CONFIG_IPV6_PIMSM_V2
-       mrt->mroute_reg_vif_num = -1;
-#endif
-#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
-       list_add_tail_rcu(&mrt->list, &net->ipv6.mr6_tables);
-#endif
-       return mrt;
+       return mr_table_alloc(net, id, &ip6mr_rht_params,
+                             ipmr_expire_process, ip6mr_new_table_set);
 }
 
 static void ip6mr_free_table(struct mr_table *mrt)