Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1293d5c5 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

radix-tree: Chain preallocated nodes through ->parent



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: default avatarMatthew Wilcox <mawilcox@microsoft.com>
parent 73bc029b
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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--;
	}
+3 −3
Original line number Diff line number Diff line
@@ -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);