aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-01-15 02:14:20 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:02:15 -0500
commit7f9b80529b8a2ad8b3273b15fb444a0e34b760a9 (patch)
treeba6e38934797952a472970ee97d2131a6a6f29bb
parentd717a9a62049a03e85c3c2dd3399416eeb34a8be (diff)
[IPV4]: fib hash|trie initialization
Initialization of the slab cache's should be done when IP is initialized to make sure of available memory, and that code can be marked __init. Signed-off-by: Stephen Hemminger <stephen.hemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/ip_fib.h5
-rw-r--r--net/ipv4/fib_frontend.c9
-rw-r--r--net/ipv4/fib_hash.c24
-rw-r--r--net/ipv4/fib_trie.c16
4 files changed, 28 insertions, 26 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 025b225181e1..f580542f08ed 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -231,8 +231,9 @@ extern int fib_sync_down(__be32 local, struct net_device *dev, int force);
231extern int fib_sync_up(struct net_device *dev); 231extern int fib_sync_up(struct net_device *dev);
232extern __be32 __fib_res_prefsrc(struct fib_result *res); 232extern __be32 __fib_res_prefsrc(struct fib_result *res);
233 233
234/* Exported by fib_hash.c */ 234/* Exported by fib_{hash|trie}.c */
235extern struct fib_table *fib_hash_init(u32 id); 235extern void fib_hash_init(void);
236extern struct fib_table *fib_hash_table(u32 id);
236 237
237static inline void fib_combine_itag(u32 *itag, struct fib_result *res) 238static inline void fib_combine_itag(u32 *itag, struct fib_result *res)
238{ 239{
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 02b5ff73357f..8ddcd3f91a17 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -53,11 +53,11 @@ static int __net_init fib4_rules_init(struct net *net)
53{ 53{
54 struct fib_table *local_table, *main_table; 54 struct fib_table *local_table, *main_table;
55 55
56 local_table = fib_hash_init(RT_TABLE_LOCAL); 56 local_table = fib_hash_table(RT_TABLE_LOCAL);
57 if (local_table == NULL) 57 if (local_table == NULL)
58 return -ENOMEM; 58 return -ENOMEM;
59 59
60 main_table = fib_hash_init(RT_TABLE_MAIN); 60 main_table = fib_hash_table(RT_TABLE_MAIN);
61 if (main_table == NULL) 61 if (main_table == NULL)
62 goto fail; 62 goto fail;
63 63
@@ -83,7 +83,8 @@ struct fib_table *fib_new_table(struct net *net, u32 id)
83 tb = fib_get_table(net, id); 83 tb = fib_get_table(net, id);
84 if (tb) 84 if (tb)
85 return tb; 85 return tb;
86 tb = fib_hash_init(id); 86
87 tb = fib_hash_table(id);
87 if (!tb) 88 if (!tb)
88 return NULL; 89 return NULL;
89 h = id & (FIB_TABLE_HASHSZ - 1); 90 h = id & (FIB_TABLE_HASHSZ - 1);
@@ -1042,6 +1043,8 @@ void __init ip_fib_init(void)
1042 register_pernet_subsys(&fib_net_ops); 1043 register_pernet_subsys(&fib_net_ops);
1043 register_netdevice_notifier(&fib_netdev_notifier); 1044 register_netdevice_notifier(&fib_netdev_notifier);
1044 register_inetaddr_notifier(&fib_inetaddr_notifier); 1045 register_inetaddr_notifier(&fib_inetaddr_notifier);
1046
1047 fib_hash_init();
1045} 1048}
1046 1049
1047EXPORT_SYMBOL(inet_addr_type); 1050EXPORT_SYMBOL(inet_addr_type);
diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c
index 258214f57fba..499522f3b305 100644
--- a/net/ipv4/fib_hash.c
+++ b/net/ipv4/fib_hash.c
@@ -747,21 +747,19 @@ static int fn_hash_dump(struct fib_table *tb, struct sk_buff *skb, struct netlin
747 return skb->len; 747 return skb->len;
748} 748}
749 749
750struct fib_table *fib_hash_init(u32 id) 750void __init fib_hash_init(void)
751{ 751{
752 struct fib_table *tb; 752 fn_hash_kmem = kmem_cache_create("ip_fib_hash", sizeof(struct fib_node),
753 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
754
755 fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias),
756 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
757
758}
753 759
754 if (fn_hash_kmem == NULL) 760struct fib_table *fib_hash_table(u32 id)
755 fn_hash_kmem = kmem_cache_create("ip_fib_hash", 761{
756 sizeof(struct fib_node), 762 struct fib_table *tb;
757 0, SLAB_HWCACHE_ALIGN,
758 NULL);
759
760 if (fn_alias_kmem == NULL)
761 fn_alias_kmem = kmem_cache_create("ip_fib_alias",
762 sizeof(struct fib_alias),
763 0, SLAB_HWCACHE_ALIGN,
764 NULL);
765 763
766 tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash), 764 tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash),
767 GFP_KERNEL); 765 GFP_KERNEL);
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index a15cb0d2e113..fbc80d15827b 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -1926,19 +1926,19 @@ out:
1926 return -1; 1926 return -1;
1927} 1927}
1928 1928
1929/* Fix more generic FIB names for init later */ 1929void __init fib_hash_init(void)
1930{
1931 fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias),
1932 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1933}
1930 1934
1931struct fib_table *fib_hash_init(u32 id) 1935
1936/* Fix more generic FIB names for init later */
1937struct fib_table *fib_hash_table(u32 id)
1932{ 1938{
1933 struct fib_table *tb; 1939 struct fib_table *tb;
1934 struct trie *t; 1940 struct trie *t;
1935 1941
1936 if (fn_alias_kmem == NULL)
1937 fn_alias_kmem = kmem_cache_create("ip_fib_alias",
1938 sizeof(struct fib_alias),
1939 0, SLAB_HWCACHE_ALIGN,
1940 NULL);
1941
1942 tb = kmalloc(sizeof(struct fib_table) + sizeof(struct trie), 1942 tb = kmalloc(sizeof(struct fib_table) + sizeof(struct trie),
1943 GFP_KERNEL); 1943 GFP_KERNEL);
1944 if (tb == NULL) 1944 if (tb == NULL)