tree 6d22dd7c129beef6616dc5a0301249ed4cbc4e3b
parent 93e266f600f4048fe7a2e8803abb9f8baff84aa7
author Patrick McHardy <[EMAIL PROTECTED]> Wed, 06 Jul 2005 04:44:55 -0700
committer David S. Miller <[EMAIL PROTECTED]> Wed, 06 Jul 2005 04:44:55 -0700

[IPV4]: Handle large allocations in fib_trie

Inflating a node a couple of times makes it exceed the 128k kmalloc limit.
Use __get_free_pages for allocations > PAGE_SIZE, as in fib_hash.

Signed-off-by: Patrick McHardy <[EMAIL PROTECTED]>
Acked-by: Robert Olsson <[EMAIL PROTECTED]>
Signed-off-by: David S. Miller <[EMAIL PROTECTED]>

 net/ipv4/fib_trie.c |   25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -358,11 +358,32 @@ static inline void free_leaf_info(struct
        kfree(li);
 }
 
+static struct tnode *tnode_alloc(unsigned int size)
+{
+       if (size <= PAGE_SIZE) {
+               return kmalloc(size, GFP_KERNEL);
+       } else {
+               return (struct tnode *)
+                      __get_free_pages(GFP_KERNEL, get_order(size));
+       }
+}
+
+static void __tnode_free(struct tnode *tn)
+{
+       unsigned int size = sizeof(struct tnode) +
+                           (1<<tn->bits) * sizeof(struct node *);
+
+       if (size <= PAGE_SIZE)
+               kfree(tn);
+       else
+               free_pages((unsigned long)tn, get_order(size));
+}
+
 static struct tnode* tnode_new(t_key key, int pos, int bits)
 {
        int nchildren = 1<<bits;
        int sz = sizeof(struct tnode) + nchildren * sizeof(struct node *);
-       struct tnode *tn = kmalloc(sz,  GFP_KERNEL);
+       struct tnode *tn = tnode_alloc(sz);
 
        if(tn)  {
                memset(tn, 0, sz);
@@ -390,7 +411,7 @@ static void tnode_free(struct tnode *tn)
                        printk("FL %p \n", tn);
        }
        else if(IS_TNODE(tn)) { 
-               kfree(tn);
+               __tnode_free(tn);
                if(trie_debug > 0 ) 
                        printk("FT %p \n", tn);
        }
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to