diff mbox series

[3/4] persistent-data: simplify struct ro_spine

Message ID alpine.LRH.2.02.2210100836190.25650@file01.intranet.prod.int.rdu2.redhat.com (mailing list archive)
State New, archived
Headers show
Series dm-thin: reduce lock contention when walking the btree | expand

Commit Message

Mikulas Patocka Oct. 10, 2022, 12:36 p.m. UTC
The struct ro_spine holds pointers to two last blocks when doing read-only
btree walk. The second block is never accessed (note that the function
ro_pop is never called), so we can simplify the code so that it holds
pointer to just one block.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/persistent-data/dm-btree-internal.h |    4 --
 drivers/md/persistent-data/dm-btree-spine.c    |   41 +++++--------------------
 2 files changed, 10 insertions(+), 35 deletions(-)


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel
diff mbox series

Patch

Index: linux-2.6/drivers/md/persistent-data/dm-btree-internal.h
===================================================================
--- linux-2.6.orig/drivers/md/persistent-data/dm-btree-internal.h	2022-10-10 11:20:17.000000000 +0200
+++ linux-2.6/drivers/md/persistent-data/dm-btree-internal.h	2022-10-10 11:20:55.000000000 +0200
@@ -63,14 +63,12 @@  void unlock_block(struct dm_btree_info *
 struct ro_spine {
 	struct dm_btree_info *info;
 
-	int count;
-	struct dm_block *nodes[2];
+	struct dm_block *node;
 };
 
 void init_ro_spine(struct ro_spine *s, struct dm_btree_info *info);
 void exit_ro_spine(struct ro_spine *s);
 int ro_step(struct ro_spine *s, dm_block_t new_child);
-void ro_pop(struct ro_spine *s);
 struct btree_node *ro_node(struct ro_spine *s);
 
 struct shadow_spine {
Index: linux-2.6/drivers/md/persistent-data/dm-btree-spine.c
===================================================================
--- linux-2.6.orig/drivers/md/persistent-data/dm-btree-spine.c	2022-10-10 11:20:17.000000000 +0200
+++ linux-2.6/drivers/md/persistent-data/dm-btree-spine.c	2022-10-10 11:20:42.000000000 +0200
@@ -123,52 +123,29 @@  void unlock_block(struct dm_btree_info *
 void init_ro_spine(struct ro_spine *s, struct dm_btree_info *info)
 {
 	s->info = info;
-	s->count = 0;
-	s->nodes[0] = NULL;
-	s->nodes[1] = NULL;
+	s->node = NULL;
 }
 
 void exit_ro_spine(struct ro_spine *s)
 {
-	int i;
-
-	for (i = 0; i < s->count; i++) {
-		unlock_block(s->info, s->nodes[i]);
-	}
+	if (s->node)
+		unlock_block(s->info, s->node);
 }
 
 int ro_step(struct ro_spine *s, dm_block_t new_child)
 {
-	int r;
-
-	if (s->count == 2) {
-		unlock_block(s->info, s->nodes[0]);
-		s->nodes[0] = s->nodes[1];
-		s->count--;
+	if (s->node) {
+		unlock_block(s->info, s->node);
+		s->node = NULL;
 	}
 
-	r = bn_read_lock(s->info, new_child, s->nodes + s->count);
-	if (!r)
-		s->count++;
-
-	return r;
-}
-
-void ro_pop(struct ro_spine *s)
-{
-	BUG_ON(!s->count);
-	--s->count;
-	unlock_block(s->info, s->nodes[s->count]);
+	return bn_read_lock(s->info, new_child, &s->node);
 }
 
 struct btree_node *ro_node(struct ro_spine *s)
 {
-	struct dm_block *block;
-
-	BUG_ON(!s->count);
-	block = s->nodes[s->count - 1];
-
-	return dm_block_data(block);
+	BUG_ON(!s->node);
+	return dm_block_data(s->node);
 }
 
 /*----------------------------------------------------------------*/