aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-01-23 00:51:50 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:10:56 -0500
commitbc3c8c1e02ae89668239742fd592f21e1998fa46 (patch)
tree48f941a414c89d6e3b070f5ad3a4976a02ea9004 /net
parenta1f6f5a7689098f01d9b7b7181795ee78563ce37 (diff)
[IPV4] fib_trie: put leaf nodes in a slab cache
This improves locality for operations that touch all the leaves. Save space since these entries don't need to be hardware cache aligned. Signed-off-by: Stephen Hemminger <stephen.hemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/fib_trie.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index a52334d30cf8..9291e7c41fc7 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -162,6 +162,7 @@ static struct tnode *halve(struct trie *t, struct tnode *tn);
162static void tnode_free(struct tnode *tn); 162static void tnode_free(struct tnode *tn);
163 163
164static struct kmem_cache *fn_alias_kmem __read_mostly; 164static struct kmem_cache *fn_alias_kmem __read_mostly;
165static struct kmem_cache *trie_leaf_kmem __read_mostly;
165 166
166static inline struct tnode *node_parent(struct node *node) 167static inline struct tnode *node_parent(struct node *node)
167{ 168{
@@ -325,7 +326,8 @@ static inline void alias_free_mem_rcu(struct fib_alias *fa)
325 326
326static void __leaf_free_rcu(struct rcu_head *head) 327static void __leaf_free_rcu(struct rcu_head *head)
327{ 328{
328 kfree(container_of(head, struct leaf, rcu)); 329 struct leaf *l = container_of(head, struct leaf, rcu);
330 kmem_cache_free(trie_leaf_kmem, l);
329} 331}
330 332
331static void __leaf_info_free_rcu(struct rcu_head *head) 333static void __leaf_info_free_rcu(struct rcu_head *head)
@@ -375,7 +377,7 @@ static inline void tnode_free(struct tnode *tn)
375 377
376static struct leaf *leaf_new(void) 378static struct leaf *leaf_new(void)
377{ 379{
378 struct leaf *l = kmalloc(sizeof(struct leaf), GFP_KERNEL); 380 struct leaf *l = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
379 if (l) { 381 if (l) {
380 l->parent = T_LEAF; 382 l->parent = T_LEAF;
381 INIT_HLIST_HEAD(&l->list); 383 INIT_HLIST_HEAD(&l->list);
@@ -1938,7 +1940,12 @@ out:
1938void __init fib_hash_init(void) 1940void __init fib_hash_init(void)
1939{ 1941{
1940 fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias), 1942 fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias),
1941 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); 1943 0, SLAB_PANIC, NULL);
1944
1945 trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
1946 max(sizeof(struct leaf),
1947 sizeof(struct leaf_info)),
1948 0, SLAB_PANIC, NULL);
1942} 1949}
1943 1950
1944 1951