]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
radix-tree: Chain preallocated nodes through ->parent
authorMatthew Wilcox <mawilcox@microsoft.com>
Mon, 16 Jan 2017 21:41:29 +0000 (16:41 -0500)
committerMatthew Wilcox <mawilcox@microsoft.com>
Tue, 14 Feb 2017 02:44:04 +0000 (21:44 -0500)
Chaining through the ->private_data member means we have to zero
->private_data after removing preallocated nodes from the list.
We're about to initialise ->parent anyway, so we can avoid zeroing it.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
lib/radix-tree.c
tools/testing/radix-tree/linux.c

index 14130ab197c09f8ad7f5181ce09455df0b4a49e9..66c71312c381e8acac14bdaf94ecaff30ae320fb 100644 (file)
@@ -82,7 +82,7 @@ static struct kmem_cache *radix_tree_node_cachep;
  */
 struct radix_tree_preload {
        unsigned nr;
-       /* nodes->private_data points to next preallocated node */
+       /* nodes->parent points to next preallocated node */
        struct radix_tree_node *nodes;
 };
 static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, };
@@ -405,8 +405,7 @@ radix_tree_node_alloc(gfp_t gfp_mask, struct radix_tree_node *parent,
                rtp = this_cpu_ptr(&radix_tree_preloads);
                if (rtp->nr) {
                        ret = rtp->nodes;
-                       rtp->nodes = ret->private_data;
-                       ret->private_data = NULL;
+                       rtp->nodes = ret->parent;
                        rtp->nr--;
                }
                /*
@@ -483,7 +482,7 @@ static int __radix_tree_preload(gfp_t gfp_mask, unsigned nr)
                preempt_disable();
                rtp = this_cpu_ptr(&radix_tree_preloads);
                if (rtp->nr < nr) {
-                       node->private_data = rtp->nodes;
+                       node->parent = rtp->nodes;
                        rtp->nodes = node;
                        rtp->nr++;
                } else {
@@ -2260,7 +2259,7 @@ static int radix_tree_cpu_dead(unsigned int cpu)
        rtp = &per_cpu(radix_tree_preloads, cpu);
        while (rtp->nr) {
                node = rtp->nodes;
-               rtp->nodes = node->private_data;
+               rtp->nodes = node->parent;
                kmem_cache_free(radix_tree_node_cachep, node);
                rtp->nr--;
        }
index 94bcdb992bbf68585d6efe0b6ebd8fad99d1fc90..cf48c8473f4869a8205a9eaa94b6f423079b9be5 100644 (file)
@@ -35,9 +35,9 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
        if (cachep->nr_objs) {
                cachep->nr_objs--;
                node = cachep->objs;
-               cachep->objs = node->private_data;
+               cachep->objs = node->parent;
                pthread_mutex_unlock(&cachep->lock);
-               node->private_data = NULL;
+               node->parent = NULL;
        } else {
                pthread_mutex_unlock(&cachep->lock);
                node = malloc(cachep->size);
@@ -64,7 +64,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
        } else {
                struct radix_tree_node *node = objp;
                cachep->nr_objs++;
-               node->private_data = cachep->objs;
+               node->parent = cachep->objs;
                cachep->objs = node;
        }
        pthread_mutex_unlock(&cachep->lock);