Skip to contentSkip to conversation

regmap: rbtree: When adding a reg do a bsearch for target node

PATCH In review Nikesh Oswal 2 participants 2 messages Oct 21, 2015 – Oct 22, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 regmap: rbtree: When adding a reg do a bsearch for target node

From: Nikesh Oswal <[email protected]>

A binary search is much more efficient rather than iterating over the rbtree in ascending order which the current code is doing.

During initialisation the reg defaults are written to the cache in a large chunk and these are always sorted in the ascending order so for this situation ideally we should have iterated the rbtree in descending order.

But at runtime the drivers may write into the cache in any random order so this patch selects to use a bsearch to give an optimal runtime performance and also at initialisation time when reg defaults are written the performance of binary search would be much better than iterating in ascending order which the current code was doing.

---
 drivers/base/regmap/regcache-rbtree.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/base/regmap/regcache-rbtree.c +7 -2
index 56486d9..353f602 100644
@@ -413,8 +413,8 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
 		max = reg + max_dist;
 
 		/* look for an adjacent register to the one we are about to add */
-		for (node = rb_first(&rbtree_ctx->root); node;
-		     node = rb_next(node)) {
+		node = rbtree_ctx->root.rb_node;
+		while (node) {
 			rbnode_tmp = rb_entry(node, struct regcache_rbtree_node,
 					      node);
 
@@ -425,6 +425,11 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
 				new_base_reg = min(reg, base_reg);
 				new_top_reg = max(reg, top_reg);
 			} else {
+				if (max < base_reg)
+					node = node->rb_left;
+				else
+					node = node->rb_right;
+
 				continue;
 			}
 
Signature · 1 line
1.7.9.5
Reviewed-by on v1 1/1
#1 lore raw
Quoted 1 line · Nikesh Oswal

From: Nikesh Oswal <[email protected]>

If you are going to use your non-opensource email, might as well use the cirrus one here.

Quoted 17 lines

A binary search is much more efficient rather than iterating over the rbtree in ascending order which the current code is doing.

During initialisation the reg defaults are written to the cache in a large chunk and these are always sorted in the ascending order so for this situation ideally we should have iterated the rbtree in descending order.

But at runtime the drivers may write into the cache in any random order so this patch selects to use a bsearch to give an optimal runtime performance and also at initialisation time when reg defaults are written the performance of binary search would be much better than iterating in ascending order which the current code was doing.

Quoted 2 lines

---

Patch looks fine to me though:

Thanks,
Charles