Patch from Szabolcs Berecz With the following patch maxindex is taken from an array instead of recalculating it all the time. radix-tree.c | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) diff -puN lib/radix-tree.c~radix_tree_maxindex-cleanup lib/radix-tree.c --- 25/lib/radix-tree.c~radix_tree_maxindex-cleanup 2003-02-14 18:24:13.000000000 -0800 +++ 25-akpm/lib/radix-tree.c 2003-02-14 18:24:13.000000000 -0800 @@ -46,6 +46,8 @@ struct radix_tree_path { #define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) #define RADIX_TREE_MAX_PATH (RADIX_TREE_INDEX_BITS/RADIX_TREE_MAP_SHIFT + 2) +static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH]; + /* * Radix tree node cache. */ @@ -126,12 +128,7 @@ out: */ static inline unsigned long radix_tree_maxindex(unsigned int height) { - unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; - unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; - - if (tmp >= RADIX_TREE_INDEX_BITS) - index = ~0UL; - return index; + return height_to_maxindex[height]; } /* @@ -401,6 +398,24 @@ radix_tree_node_ctor(void *node, kmem_ca memset(node, 0, sizeof(struct radix_tree_node)); } +static __init unsigned long __maxindex(unsigned int height) +{ + unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; + unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; + + if (tmp >= RADIX_TREE_INDEX_BITS) + index = ~0UL; + return index; +} + +static __init void radix_tree_init_maxindex(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++) + height_to_maxindex[i] = __maxindex(i); +} + void __init radix_tree_init(void) { radix_tree_node_cachep = kmem_cache_create("radix_tree_node", @@ -408,4 +423,5 @@ void __init radix_tree_init(void) 0, radix_tree_node_ctor, NULL); if (!radix_tree_node_cachep) panic ("Failed to create radix_tree_node cache\n"); + radix_tree_init_maxindex(); } _