Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Kernel v2.6.25-rc7 /lib/radix-tree.c

Filename:/lib/radix-tree.c
Lines Added:11
Lines Deleted:4
Also changed in: (Previous) 2.6.25-rc6  2.6.25-rc5  2.6.25-rc4  2.6.25-rc3  2.6.25-rc2  2.6.25-rc1 
(Following) 2.6.25-rc8  2.6.25-rc9  2.6.25  2.6.25-git12  2.6.25-git13  2.6.25-git14 

Location
[  2.6.25-rc7
  [  lib
     o  radix-tree.c

Patch

diff --git a/lib/radix-tree.c b/lib/radix-tree.c
index 48c250f..65f0e75 100644
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -95,14 +95,17 @@ static inline gfp_t root_gfp_mask(struct radix_tree_root *root)
 static struct radix_tree_node *
 radix_tree_node_alloc(struct radix_tree_root *root)
 {
-   struct radix_tree_node *ret;
+   struct radix_tree_node *ret = NULL;
    gfp_t gfp_mask = root_gfp_mask(root);
 
-   ret = kmem_cache_alloc(radix_tree_node_cachep,
-            set_migrateflags(gfp_mask, __GFP_RECLAIMABLE));
-   if (ret == NULL && !(gfp_mask & __GFP_WAIT)) {
+   if (!(gfp_mask & __GFP_WAIT)) {
       struct radix_tree_preload *rtp;
 
+      /*
+       * Provided the caller has preloaded here, we will always
+       * succeed in getting a node here (and never reach
+       * kmem_cache_alloc)
+       */
       rtp = &__get_cpu_var(radix_tree_preloads);
       if (rtp->nr) {
          ret = rtp->nodes[rtp->nr - 1];
@@ -110,6 +113,10 @@ radix_tree_node_alloc(struct radix_tree_root *root)
          rtp->nr--;
       }
    }
+   if (ret == NULL)
+      ret = kmem_cache_alloc(radix_tree_node_cachep,
+            set_migrateflags(gfp_mask, __GFP_RECLAIMABLE));
+
    BUG_ON(radix_tree_is_indirect_ptr(ret));
    return ret;
 }


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.