diff options
| -rw-r--r-- | arch/x86/mm/pat_rbtree.c | 37 | ||||
| -rw-r--r-- | include/linux/rbtree.h | 30 | ||||
| -rw-r--r-- | lib/rbtree_test.c | 34 | 
3 files changed, 34 insertions, 67 deletions
diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index 7e1515bd477..4d116959075 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c @@ -69,41 +69,8 @@ static u64 compute_subtree_max_end(struct memtype *data)  	return max_end;  } -/* Update 'subtree_max_end' for node and its parents */ -static void memtype_rb_propagate_cb(struct rb_node *node, struct rb_node *stop) -{ -	while (node != stop) { -		struct memtype *data = container_of(node, struct memtype, rb); -		u64 subtree_max_end = compute_subtree_max_end(data); -		if (data->subtree_max_end == subtree_max_end) -			break; -		data->subtree_max_end = subtree_max_end; -		node = rb_parent(&data->rb); -	} -} - -static void memtype_rb_copy_cb(struct rb_node *old, struct rb_node *new) -{ -	struct memtype *old_data = container_of(old, struct memtype, rb); -	struct memtype *new_data = container_of(new, struct memtype, rb); - -	new_data->subtree_max_end = old_data->subtree_max_end; -} - -/* Update 'subtree_max_end' after tree rotation. old and new are the - * former and current subtree roots */ -static void memtype_rb_rotate_cb(struct rb_node *old, struct rb_node *new) -{ -	struct memtype *old_data = container_of(old, struct memtype, rb); -	struct memtype *new_data = container_of(new, struct memtype, rb); - -	new_data->subtree_max_end = old_data->subtree_max_end; -	old_data->subtree_max_end = compute_subtree_max_end(old_data); -} - -static const struct rb_augment_callbacks memtype_rb_augment_cb = { -	memtype_rb_propagate_cb, memtype_rb_copy_cb, memtype_rb_rotate_cb -}; +RB_DECLARE_CALLBACKS(static, memtype_rb_augment_cb, struct memtype, rb, +		     u64, subtree_max_end, compute_subtree_max_end)  /* Find the first (lowest start addr) overlapping range from rb tree */  static struct memtype *memtype_rb_lowest_match(struct rb_root *root, diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index 4ace31b3338..8d1e83b1c87 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h @@ -79,6 +79,36 @@ rb_insert_augmented(struct rb_node *node, struct rb_root *root,  	__rb_insert_augmented(node, root, augment->rotate);  } +#define RB_DECLARE_CALLBACKS(rbstatic, rbname, rbstruct, rbfield,	      \ +			     rbtype, rbaugmented, rbcompute)		      \ +static void rbname ## _propagate(struct rb_node *rb, struct rb_node *stop)    \ +{									      \ +	while (rb != stop) {						      \ +		rbstruct *node = rb_entry(rb, rbstruct, rbfield);	      \ +		rbtype augmented = rbcompute(node);			      \ +		if (node->rbaugmented == augmented)			      \ +			break;						      \ +		node->rbaugmented = augmented;				      \ +		rb = rb_parent(&node->rbfield);				      \ +	}								      \ +}									      \ +static void rbname ## _copy(struct rb_node *rb_old, struct rb_node *rb_new)   \ +{									      \ +	rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);		      \ +	rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);		      \ +	new->rbaugmented = old->rbaugmented;				      \ +}									      \ +static void rbname ## _rotate(struct rb_node *rb_old, struct rb_node *rb_new) \ +{									      \ +	rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);		      \ +	rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);		      \ +	new->rbaugmented = old->rbaugmented;				      \ +	old->rbaugmented = rbcompute(old);				      \ +}									      \ +rbstatic const struct rb_augment_callbacks rbname = {			      \ +	rbname ## _propagate, rbname ## _copy, rbname ## _rotate	      \ +}; +  /* Find logical next and previous nodes in a tree */  extern struct rb_node *rb_next(const struct rb_node *); diff --git a/lib/rbtree_test.c b/lib/rbtree_test.c index e28345df09b..b20e99969b0 100644 --- a/lib/rbtree_test.c +++ b/lib/rbtree_test.c @@ -61,38 +61,8 @@ static inline u32 augment_recompute(struct test_node *node)  	return max;  } -static void augment_propagate(struct rb_node *rb, struct rb_node *stop) -{ -	while (rb != stop) { -		struct test_node *node = rb_entry(rb, struct test_node, rb); -		u32 augmented = augment_recompute(node); -		if (node->augmented == augmented) -			break; -		node->augmented = augmented; -		rb = rb_parent(&node->rb); -	} -} - -static void augment_copy(struct rb_node *rb_old, struct rb_node *rb_new) -{ -	struct test_node *old = rb_entry(rb_old, struct test_node, rb); -	struct test_node *new = rb_entry(rb_new, struct test_node, rb); -	new->augmented = old->augmented; -} - -static void augment_rotate(struct rb_node *rb_old, struct rb_node *rb_new) -{ -	struct test_node *old = rb_entry(rb_old, struct test_node, rb); -	struct test_node *new = rb_entry(rb_new, struct test_node, rb); - -	/* Rotation doesn't change subtree's augmented value */ -	new->augmented = old->augmented; -	old->augmented = augment_recompute(old); -} - -static const struct rb_augment_callbacks augment_callbacks = { -	augment_propagate, augment_copy, augment_rotate -}; +RB_DECLARE_CALLBACKS(static, augment_callbacks, struct test_node, rb, +		     u32, augmented, augment_recompute)  static void insert_augmented(struct test_node *node, struct rb_root *root)  {  |