* [PATCHi 0/6] reduce boilerplate code within btrfs
@ 2024-12-08 22:37 Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
` (9 more replies)
0 siblings, 10 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:37 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
The goal of this patch series is to reduce boilerplate code
within btrfs. To accomplish this rb_find_add_cached() was added
to linux/include/rbtree.h. Any replaceable functions were then
replaced within btrfs.
Roger L. Beckermeyer III (6):
rbtree: add rb_find_add_cached() to rbtree.h
btrfs: edit btrfs_add_block_group_cache() to use rb helper
btrfs: edit prelim_ref_insert() to use rb helpers
btrfs: edit __btrfs_add_delayed_item() to use rb helper
btrfs: edit btrfs_add_chunk_map() to use rb helpers
btrfs: edits tree_insert() to use rb helpers
fs/btrfs/backref.c | 71 ++++++++++++++++++++--------------------
fs/btrfs/block-group.c | 40 ++++++++++------------
fs/btrfs/delayed-inode.c | 40 +++++++++-------------
fs/btrfs/delayed-ref.c | 43 ++++++++++++------------
fs/btrfs/volumes.c | 39 ++++++++++------------
include/linux/rbtree.h | 37 +++++++++++++++++++++
6 files changed, 145 insertions(+), 125 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
` (8 subsequent siblings)
9 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III, Josef Bacik
Adds rb_find_add_cached() as a helper function for use with
red-black trees. This will be used in btrfs to reduce boilerplate code.
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index 7c173aa64e1e..0d4444c0cfb3 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
rb_insert_color(node, tree);
}
+/**
+ * rb_find_add_cached() - find equivalent @node in @tree, or add @node
+ * @node: node to look-for / insert
+ * @tree: tree to search / modify
+ * @cmp: operator defining the node order
+ *
+ * Returns the rb_node matching @node, or NULL when no match is found and @node
+ * is inserted.
+ */
+static __always_inline struct rb_node *
+rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
+ int (*cmp)(struct rb_node *, const struct rb_node *))
+{
+ bool leftmost = true;
+ struct rb_node **link = &tree->rb_root.rb_node;
+ struct rb_node *parent = NULL;
+ int c;
+
+ while (*link) {
+ parent = *link;
+ c = cmp(node, parent);
+
+ if (c < 0) {
+ link = &parent->rb_left;
+ } else if (c > 0) {
+ link = &parent->rb_right;
+ leftmost = false;
+ } else {
+ return parent;
+ }
+ }
+
+ rb_link_node(node, parent, link);
+ rb_insert_color_cached(node, tree, leftmost);
+ return NULL;
+}
+
/**
* rb_find_add() - find equivalent @node in @tree, or add @node
* @node: node to look-for / insert
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-09 5:05 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
` (7 subsequent siblings)
9 siblings, 1 reply; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III, Josef Bacik
Edits fs/btrfs/block-group.c to use rb_find_add_cached(),
also adds a comparison function, btrfs_add_block_blkgrp_cmp(),
for use with rb_find_add_cached().
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/block-group.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 5be029734cfa..ccff051de43a 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
}
}
+static int btrfs_add_blkgrp_cmp(struct rb_node *new, const struct rb_node *exist)
+{
+ struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node);
+ struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node);
+
+ if (cmp1->start < cmp2->start)
+ return -1;
+ if (cmp1->start > cmp2->start)
+ return 1;
+ return 0;
+}
+
/*
* This adds the block group to the fs_info rb tree for the block group cache
*/
static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
struct btrfs_block_group *block_group)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- struct btrfs_block_group *cache;
- bool leftmost = true;
+ struct rb_node *exist;
ASSERT(block_group->length != 0);
write_lock(&info->block_group_cache_lock);
- p = &info->block_group_cache_tree.rb_root.rb_node;
-
- while (*p) {
- parent = *p;
- cache = rb_entry(parent, struct btrfs_block_group, cache_node);
- if (block_group->start < cache->start) {
- p = &(*p)->rb_left;
- } else if (block_group->start > cache->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&info->block_group_cache_lock);
- return -EEXIST;
- }
- }
-
- rb_link_node(&block_group->cache_node, parent, p);
- rb_insert_color_cached(&block_group->cache_node,
- &info->block_group_cache_tree, leftmost);
+ exist = rb_find_add_cached(&block_group->cache_node,
+ &info->block_group_cache_tree, btrfs_add_blkgrp_cmp);
+ if (exist != NULL)
+ return -EEXIST;
write_unlock(&info->block_group_cache_lock);
return 0;
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-09 5:02 ` kernel test robot
2024-12-09 5:06 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
` (6 subsequent siblings)
9 siblings, 2 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
This commit edits prelim_ref_insert() in fs/btrfs/backref.c to use
rb_find_add_cached(). It also adds a comparison function for use with
rb_find_add_cached().
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/backref.c | 71 +++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 35 deletions(-)
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index 6d9f39c1d89c..fcbcfce0f93a 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -250,6 +250,17 @@ static int prelim_ref_compare(const struct prelim_ref *ref1,
return 0;
}
+static int prelim_ref_cmp(struct rb_node *node, const struct rb_node *exist)
+{
+ int result;
+ struct prelim_ref *ref1 = rb_entry(node, struct prelim_ref, rbnode);
+ struct prelim_ref *ref2 = rb_entry(exist, struct prelim_ref, rbnode);
+
+ result = prelim_ref_compare(ref1, ref2);
+
+ return result;
+}
+
static void update_share_count(struct share_check *sc, int oldcount,
int newcount, const struct prelim_ref *newref)
{
@@ -281,52 +292,42 @@ static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
struct rb_node **p;
struct rb_node *parent = NULL;
struct prelim_ref *ref;
- int result;
- bool leftmost = true;
+ struct rb_node *exist;
root = &preftree->root;
p = &root->rb_root.rb_node;
+ parent = *p;
+ ref = rb_entry(parent, struct prelim_ref, rbnode);
- while (*p) {
- parent = *p;
- ref = rb_entry(parent, struct prelim_ref, rbnode);
- result = prelim_ref_compare(ref, newref);
- if (result < 0) {
- p = &(*p)->rb_left;
- } else if (result > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- /* Identical refs, merge them and free @newref */
- struct extent_inode_elem *eie = ref->inode_list;
+ exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
+ if (exist != NULL) {
+ /* Identical refs, merge them and free @newref */
+ struct extent_inode_elem *eie = ref->inode_list;
- while (eie && eie->next)
- eie = eie->next;
+ while (eie && eie->next)
+ eie = eie->next;
- if (!eie)
- ref->inode_list = newref->inode_list;
- else
- eie->next = newref->inode_list;
- trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
- preftree->count);
- /*
- * A delayed ref can have newref->count < 0.
- * The ref->count is updated to follow any
- * BTRFS_[ADD|DROP]_DELAYED_REF actions.
- */
- update_share_count(sc, ref->count,
- ref->count + newref->count, newref);
- ref->count += newref->count;
- free_pref(newref);
- return;
- }
+ if (!eie)
+ ref->inode_list = newref->inode_list;
+ else
+ eie->next = newref->inode_list;
+ trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
+ preftree->count);
+ /*
+ * A delayed ref can have newref->count < 0.
+ * The ref->count is updated to follow any
+ * BTRFS_[ADD|DROP]_DELAYED_REF actions.
+ */
+ update_share_count(sc, ref->count,
+ ref->count + newref->count, newref);
+ ref->count += newref->count;
+ free_pref(newref);
+ return;
}
update_share_count(sc, 0, newref->count, newref);
preftree->count++;
trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
- rb_link_node(&newref->rbnode, parent, p);
- rb_insert_color_cached(&newref->rbnode, root, leftmost);
}
/*
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (2 preceding siblings ...)
2024-12-08 22:38 ` [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-09 5:00 ` kernel test robot
` (2 more replies)
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
` (5 subsequent siblings)
9 siblings, 3 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
This commit edits __btrfs_add_delayed_item() to use rb_find_add_cached().
It also adds a helper function to use with rb_find_add_cached().
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-inode.c | 40 ++++++++++++++++------------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 508bdbae29a0..7d62224bc49c 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -366,40 +366,32 @@ static struct btrfs_delayed_item *__btrfs_lookup_delayed_item(
return NULL;
}
+static int btrfs_add_delayed_item_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_delayed_item *item = rb_entry(rb_node, struct btrfs_delayed_item, rb_node);
+ struct btrfs_delayed_item *exist = rb_entry(exist_node, struct btrfs_delayed_item, rb_node);
+
+ if (item->index < exist->index)
+ return -1;
+ if (item->index > exist->index)
+ return 1;
+ return 0;
+}
+
static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
struct btrfs_delayed_item *ins)
{
- struct rb_node **p, *node;
- struct rb_node *parent_node = NULL;
struct rb_root_cached *root;
- struct btrfs_delayed_item *item;
- bool leftmost = true;
+ struct rb_node *exist;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
root = &delayed_node->ins_root;
else
root = &delayed_node->del_root;
- p = &root->rb_root.rb_node;
- node = &ins->rb_node;
-
- while (*p) {
- parent_node = *p;
- item = rb_entry(parent_node, struct btrfs_delayed_item,
- rb_node);
-
- if (item->index < ins->index) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else if (item->index > ins->index) {
- p = &(*p)->rb_left;
- } else {
- return -EEXIST;
- }
- }
-
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
+ if (exist != NULL)
+ return -EEXIST;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
ins->index >= delayed_node->index_cnt)
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (3 preceding siblings ...)
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-09 5:05 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
` (4 subsequent siblings)
9 siblings, 2 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
Edits btrfs_add_chunk_map() to use rb_find_add_cached(). Also adds a
comparison function to use with rb_find_add_cached().
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/volumes.c | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 1cccaf9c2b0d..4837761a56c9 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -5513,33 +5513,30 @@ void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_ma
btrfs_free_chunk_map(map);
}
+static int btrfs_chunk_map_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_chunk_map *map = rb_entry(rb_node, struct btrfs_chunk_map, rb_node);
+ struct btrfs_chunk_map *exist = rb_entry(exist_node, struct btrfs_chunk_map, rb_node);
+
+ if (map->start == exist->start)
+ return 0;
+ if (map->start < exist->start)
+ return -1;
+ return 1;
+}
+
EXPORT_FOR_TESTS
int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- bool leftmost = true;
+ struct rb_node *exist;
write_lock(&fs_info->mapping_tree_lock);
- p = &fs_info->mapping_tree.rb_root.rb_node;
- while (*p) {
- struct btrfs_chunk_map *entry;
-
- parent = *p;
- entry = rb_entry(parent, struct btrfs_chunk_map, rb_node);
-
- if (map->start < entry->start) {
- p = &(*p)->rb_left;
- } else if (map->start > entry->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&fs_info->mapping_tree_lock);
- return -EEXIST;
- }
+ exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
+
+ if (exist != NULL) {
+ write_unlock(&fs_info->mapping_tree_lock);
+ return -EEXIST;
}
- rb_link_node(&map->rb_node, parent, p);
- rb_insert_color_cached(&map->rb_node, &fs_info->mapping_tree, leftmost);
chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
write_unlock(&fs_info->mapping_tree_lock);
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (4 preceding siblings ...)
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-08 22:38 ` Roger L. Beckermeyer III
2024-12-09 5:04 ` kernel test robot
` (4 more replies)
2024-12-09 6:10 ` [PATCHi 0/6] reduce boilerplate code within btrfs Qu Wenruo
` (3 subsequent siblings)
9 siblings, 5 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-08 22:38 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
Edits tree_insert() to use rb_find_add_cached(). Also adds a
comparison function for use in rb_find_add_cached() to compare.
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-ref.c | 43 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 22 deletions(-)
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
index 30f7079fa28e..d77ac8d05b2a 100644
--- a/fs/btrfs/delayed-ref.c
+++ b/fs/btrfs/delayed-ref.c
@@ -317,34 +317,33 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
return 0;
}
+static int comp_refs_node(struct rb_node *node, const struct rb_node *node2)
+{
+ struct btrfs_delayed_ref_node *ref1;
+ struct btrfs_delayed_ref_node *ref2;
+
+ ref1 = rb_entry(node, struct btrfs_delayed_ref_node, ref_node);
+ ref2 = rb_entry(node2, struct btrfs_delayed_ref_node, ref_node);
+
+ bool check_seq = true;
+ int ret;
+
+ ret = comp_refs(ref1, ref2, check_seq);
+ return ret;
+}
+
static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
struct btrfs_delayed_ref_node *ins)
{
- struct rb_node **p = &root->rb_root.rb_node;
struct rb_node *node = &ins->ref_node;
- struct rb_node *parent_node = NULL;
+ struct rb_node *exist;
struct btrfs_delayed_ref_node *entry;
- bool leftmost = true;
-
- while (*p) {
- int comp;
-
- parent_node = *p;
- entry = rb_entry(parent_node, struct btrfs_delayed_ref_node,
- ref_node);
- comp = comp_refs(ins, entry, true);
- if (comp < 0) {
- p = &(*p)->rb_left;
- } else if (comp > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- return entry;
- }
- }
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(node, root, comp_refs_node);
+ if (exist != NULL) {
+ entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
+ return entry;
+ }
return NULL;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
@ 2024-12-09 5:00 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
2024-12-12 1:18 ` kernel test robot
2 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:00 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-__btrfs_add_delayed_item-to-use-rb-helper/20241209-064154
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/9b85bdbc269d20886590f0a70de66c602d72aa9d.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
config: arc-randconfig-002-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090921.E0n0Ioce-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090921.E0n0Ioce-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090921.E0n0Ioce-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/btrfs/delayed-inode.c: In function '__btrfs_add_delayed_item':
>> fs/btrfs/delayed-inode.c:392:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
392 | exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
>> fs/btrfs/delayed-inode.c:392:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
392 | exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
| ^
cc1: some warnings being treated as errors
vim +392 fs/btrfs/delayed-inode.c
380
381 static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
382 struct btrfs_delayed_item *ins)
383 {
384 struct rb_root_cached *root;
385 struct rb_node *exist;
386
387 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
388 root = &delayed_node->ins_root;
389 else
390 root = &delayed_node->del_root;
391
> 392 exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
393 if (exist != NULL)
394 return -EEXIST;
395
396 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
397 ins->index >= delayed_node->index_cnt)
398 delayed_node->index_cnt = ins->index + 1;
399
400 delayed_node->count++;
401 atomic_inc(&delayed_node->root->fs_info->delayed_root->items);
402 return 0;
403 }
404
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-09 5:02 ` kernel test robot
2024-12-09 5:06 ` kernel test robot
1 sibling, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:02 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-prelim_ref_insert-to-use-rb-helpers/20241209-064043
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/8201f6ae724c5dbc7c82f2ed294d457db208b2fa.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers
config: arc-randconfig-002-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090922.Cg7LuOhS-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090922.Cg7LuOhS-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.Cg7LuOhS-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/btrfs/backref.c: In function 'prelim_ref_insert':
>> fs/btrfs/backref.c:302:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
302 | exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
>> fs/btrfs/backref.c:302:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
302 | exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
| ^
cc1: some warnings being treated as errors
vim +302 fs/btrfs/backref.c
280
281 /*
282 * Add @newref to the @root rbtree, merging identical refs.
283 *
284 * Callers should assume that newref has been freed after calling.
285 */
286 static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
287 struct preftree *preftree,
288 struct prelim_ref *newref,
289 struct share_check *sc)
290 {
291 struct rb_root_cached *root;
292 struct rb_node **p;
293 struct rb_node *parent = NULL;
294 struct prelim_ref *ref;
295 struct rb_node *exist;
296
297 root = &preftree->root;
298 p = &root->rb_root.rb_node;
299 parent = *p;
300 ref = rb_entry(parent, struct prelim_ref, rbnode);
301
> 302 exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
303 if (exist != NULL) {
304 /* Identical refs, merge them and free @newref */
305 struct extent_inode_elem *eie = ref->inode_list;
306
307 while (eie && eie->next)
308 eie = eie->next;
309
310 if (!eie)
311 ref->inode_list = newref->inode_list;
312 else
313 eie->next = newref->inode_list;
314 trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
315 preftree->count);
316 /*
317 * A delayed ref can have newref->count < 0.
318 * The ref->count is updated to follow any
319 * BTRFS_[ADD|DROP]_DELAYED_REF actions.
320 */
321 update_share_count(sc, ref->count,
322 ref->count + newref->count, newref);
323 ref->count += newref->count;
324 free_pref(newref);
325 return;
326 }
327
328 update_share_count(sc, 0, newref->count, newref);
329 preftree->count++;
330 trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
331 }
332
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
@ 2024-12-09 5:04 ` kernel test robot
2024-12-09 5:08 ` kernel test robot
` (3 subsequent siblings)
4 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:04 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edits-tree_insert-to-use-rb-helpers/20241209-064230
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/5e023dcf8f086296da987f8ba2b43be0aca15b86.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edits tree_insert() to use rb helpers
config: arc-randconfig-002-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090944.g3jpT1Cz-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090944.g3jpT1Cz-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090944.g3jpT1Cz-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/btrfs/delayed-ref.c: In function 'tree_insert':
>> fs/btrfs/delayed-ref.c:342:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
>> fs/btrfs/delayed-ref.c:342:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^
cc1: some warnings being treated as errors
vim +342 fs/btrfs/delayed-ref.c
334
335 static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
336 struct btrfs_delayed_ref_node *ins)
337 {
338 struct rb_node *node = &ins->ref_node;
339 struct rb_node *exist;
340 struct btrfs_delayed_ref_node *entry;
341
> 342 exist = rb_find_add_cached(node, root, comp_refs_node);
343 if (exist != NULL) {
344 entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
345 return entry;
346 }
347 return NULL;
348 }
349
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-09 5:05 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
1 sibling, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:05 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-btrfs_add_chunk_map-to-use-rb-helpers/20241209-064330
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/3d4e17f44bafeb7e83d2fdfb50ac4e0c3ce2d23e.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers
config: arm-randconfig-001-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090922.LHCgRc17-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090922.LHCgRc17-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.LHCgRc17-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/btrfs/volumes.c:16:
In file included from fs/btrfs/ctree.h:10:
In file included from include/linux/pagemap.h:8:
In file included from include/linux/mm.h:2223:
include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> fs/btrfs/volumes.c:5534:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
5534 | exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
| ^
>> fs/btrfs/volumes.c:5534:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
5534 | exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 2 errors generated.
vim +/rb_find_add_cached +5534 fs/btrfs/volumes.c
5527
5528 EXPORT_FOR_TESTS
5529 int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
5530 {
5531 struct rb_node *exist;
5532
5533 write_lock(&fs_info->mapping_tree_lock);
> 5534 exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
5535
5536 if (exist != NULL) {
5537 write_unlock(&fs_info->mapping_tree_lock);
5538 return -EEXIST;
5539 }
5540 chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
5541 chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
5542 write_unlock(&fs_info->mapping_tree_lock);
5543
5544 return 0;
5545 }
5546
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
@ 2024-12-09 5:05 ` kernel test robot
0 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:05 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III, Josef Bacik
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-btrfs_add_block_group_cache-to-use-rb-helper/20241209-064300
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/4d8d468cc1240adf03fd23fd4b80582f57a5b28f.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper
config: arc-randconfig-002-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090910.F5gin2Tv-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090910.F5gin2Tv-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090910.F5gin2Tv-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/btrfs/block-group.c: In function 'btrfs_add_block_group_cache':
>> fs/btrfs/block-group.c:200:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
200 | exist = rb_find_add_cached(&block_group->cache_node,
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
>> fs/btrfs/block-group.c:200:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
200 | exist = rb_find_add_cached(&block_group->cache_node,
| ^
cc1: some warnings being treated as errors
vim +200 fs/btrfs/block-group.c
187
188 /*
189 * This adds the block group to the fs_info rb tree for the block group cache
190 */
191 static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
192 struct btrfs_block_group *block_group)
193 {
194 struct rb_node *exist;
195
196 ASSERT(block_group->length != 0);
197
198 write_lock(&info->block_group_cache_lock);
199
> 200 exist = rb_find_add_cached(&block_group->cache_node,
201 &info->block_group_cache_tree, btrfs_add_blkgrp_cmp);
202 if (exist != NULL)
203 return -EEXIST;
204 write_unlock(&info->block_group_cache_lock);
205
206 return 0;
207 }
208
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
2024-12-09 5:02 ` kernel test robot
@ 2024-12-09 5:06 ` kernel test robot
1 sibling, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:06 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-prelim_ref_insert-to-use-rb-helpers/20241209-064043
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/8201f6ae724c5dbc7c82f2ed294d457db208b2fa.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers
config: arm-randconfig-001-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090958.CtUdYRwP-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090958.CtUdYRwP-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090958.CtUdYRwP-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/btrfs/backref.c:6:
In file included from include/linux/mm.h:2223:
include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> fs/btrfs/backref.c:302:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
302 | exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
| ^
>> fs/btrfs/backref.c:302:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
302 | exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 2 errors generated.
vim +/rb_find_add_cached +302 fs/btrfs/backref.c
280
281 /*
282 * Add @newref to the @root rbtree, merging identical refs.
283 *
284 * Callers should assume that newref has been freed after calling.
285 */
286 static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
287 struct preftree *preftree,
288 struct prelim_ref *newref,
289 struct share_check *sc)
290 {
291 struct rb_root_cached *root;
292 struct rb_node **p;
293 struct rb_node *parent = NULL;
294 struct prelim_ref *ref;
295 struct rb_node *exist;
296
297 root = &preftree->root;
298 p = &root->rb_root.rb_node;
299 parent = *p;
300 ref = rb_entry(parent, struct prelim_ref, rbnode);
301
> 302 exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
303 if (exist != NULL) {
304 /* Identical refs, merge them and free @newref */
305 struct extent_inode_elem *eie = ref->inode_list;
306
307 while (eie && eie->next)
308 eie = eie->next;
309
310 if (!eie)
311 ref->inode_list = newref->inode_list;
312 else
313 eie->next = newref->inode_list;
314 trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
315 preftree->count);
316 /*
317 * A delayed ref can have newref->count < 0.
318 * The ref->count is updated to follow any
319 * BTRFS_[ADD|DROP]_DELAYED_REF actions.
320 */
321 update_share_count(sc, ref->count,
322 ref->count + newref->count, newref);
323 ref->count += newref->count;
324 free_pref(newref);
325 return;
326 }
327
328 update_share_count(sc, 0, newref->count, newref);
329 preftree->count++;
330 trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
331 }
332
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
2024-12-09 5:05 ` kernel test robot
@ 2024-12-09 5:07 ` kernel test robot
1 sibling, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:07 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-btrfs_add_chunk_map-to-use-rb-helpers/20241209-064330
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/3d4e17f44bafeb7e83d2fdfb50ac4e0c3ce2d23e.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers
config: arc-randconfig-002-20241209 (https://download.01.org/0day-ci/archive/20241209/202412090919.RdI1OMQg-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412090919.RdI1OMQg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412090919.RdI1OMQg-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/btrfs/volumes.c: In function 'btrfs_add_chunk_map':
>> fs/btrfs/volumes.c:5534:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
5534 | exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
>> fs/btrfs/volumes.c:5534:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
5534 | exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
| ^
cc1: some warnings being treated as errors
vim +5534 fs/btrfs/volumes.c
5527
5528 EXPORT_FOR_TESTS
5529 int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
5530 {
5531 struct rb_node *exist;
5532
5533 write_lock(&fs_info->mapping_tree_lock);
> 5534 exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
5535
5536 if (exist != NULL) {
5537 write_unlock(&fs_info->mapping_tree_lock);
5538 return -EEXIST;
5539 }
5540 chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
5541 chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
5542 write_unlock(&fs_info->mapping_tree_lock);
5543
5544 return 0;
5545 }
5546
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
2024-12-09 5:00 ` kernel test robot
@ 2024-12-09 5:07 ` kernel test robot
2024-12-12 1:18 ` kernel test robot
2 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:07 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-__btrfs_add_delayed_item-to-use-rb-helper/20241209-064154
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/9b85bdbc269d20886590f0a70de66c602d72aa9d.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
config: arm-randconfig-001-20241209 (https://download.01.org/0day-ci/archive/20241209/202412091036.JGaCqbvL-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412091036.JGaCqbvL-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412091036.JGaCqbvL-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/btrfs/delayed-inode.c:9:
In file included from fs/btrfs/ctree.h:10:
In file included from include/linux/pagemap.h:8:
In file included from include/linux/mm.h:2223:
include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> fs/btrfs/delayed-inode.c:392:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
392 | exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
| ^
>> fs/btrfs/delayed-inode.c:392:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
392 | exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 2 errors generated.
vim +/rb_find_add_cached +392 fs/btrfs/delayed-inode.c
380
381 static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
382 struct btrfs_delayed_item *ins)
383 {
384 struct rb_root_cached *root;
385 struct rb_node *exist;
386
387 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
388 root = &delayed_node->ins_root;
389 else
390 root = &delayed_node->del_root;
391
> 392 exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
393 if (exist != NULL)
394 return -EEXIST;
395
396 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
397 ins->index >= delayed_node->index_cnt)
398 delayed_node->index_cnt = ins->index + 1;
399
400 delayed_node->count++;
401 atomic_inc(&delayed_node->root->fs_info->delayed_root->items);
402 return 0;
403 }
404
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
2024-12-09 5:04 ` kernel test robot
@ 2024-12-09 5:08 ` kernel test robot
2024-12-09 12:36 ` kernel test robot
` (2 subsequent siblings)
4 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 5:08 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edits-tree_insert-to-use-rb-helpers/20241209-064230
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/5e023dcf8f086296da987f8ba2b43be0aca15b86.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edits tree_insert() to use rb helpers
config: i386-buildonly-randconfig-003-20241209 (https://download.01.org/0day-ci/archive/20241209/202412091004.4vQ7P5Kl-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412091004.4vQ7P5Kl-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412091004.4vQ7P5Kl-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/btrfs/delayed-ref.c:10:
In file included from fs/btrfs/ctree.h:10:
In file included from include/linux/pagemap.h:8:
In file included from include/linux/mm.h:2223:
include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> fs/btrfs/delayed-ref.c:342:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^
>> fs/btrfs/delayed-ref.c:342:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 2 errors generated.
vim +/rb_find_add_cached +342 fs/btrfs/delayed-ref.c
334
335 static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
336 struct btrfs_delayed_ref_node *ins)
337 {
338 struct rb_node *node = &ins->ref_node;
339 struct rb_node *exist;
340 struct btrfs_delayed_ref_node *entry;
341
> 342 exist = rb_find_add_cached(node, root, comp_refs_node);
343 if (exist != NULL) {
344 entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
345 return entry;
346 }
347 return NULL;
348 }
349
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCHi 0/6] reduce boilerplate code within btrfs
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (5 preceding siblings ...)
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
@ 2024-12-09 6:10 ` Qu Wenruo
2024-12-09 14:05 ` Josef Bacik
` (2 subsequent siblings)
9 siblings, 0 replies; 54+ messages in thread
From: Qu Wenruo @ 2024-12-09 6:10 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
在 2024/12/9 09:07, Roger L. Beckermeyer III 写道:
> The goal of this patch series is to reduce boilerplate code
> within btrfs. To accomplish this rb_find_add_cached() was added
> to linux/include/rbtree.h. Any replaceable functions were then
> replaced within btrfs.
Please format the patchset into a series.
By default git-format-patch will make them into a series.
Your current way makes every patch into a dedicate one without proper
sequence, thus LKP is reporting tons of errors.
And I'm not sure if you're the one submitting PR in the btrfs/linux project.
If so, please do not, currently the PR is mostly for CI purposes.
Please check the btrfs workflow project to get familiar with the btrfs
workflow:
https://github.com/btrfs/btrfs-workflow
Finally, if you're the author, please drop your self-reviewed-by, it
makes no sense, nor the tested-by tags.
Every patch submitted to the ML should be at least tested with a fstests
run.
Thanks,
Qu
>
> Roger L. Beckermeyer III (6):
> rbtree: add rb_find_add_cached() to rbtree.h
> btrfs: edit btrfs_add_block_group_cache() to use rb helper
> btrfs: edit prelim_ref_insert() to use rb helpers
> btrfs: edit __btrfs_add_delayed_item() to use rb helper
> btrfs: edit btrfs_add_chunk_map() to use rb helpers
> btrfs: edits tree_insert() to use rb helpers
>
> fs/btrfs/backref.c | 71 ++++++++++++++++++++--------------------
> fs/btrfs/block-group.c | 40 ++++++++++------------
> fs/btrfs/delayed-inode.c | 40 +++++++++-------------
> fs/btrfs/delayed-ref.c | 43 ++++++++++++------------
> fs/btrfs/volumes.c | 39 ++++++++++------------
> include/linux/rbtree.h | 37 +++++++++++++++++++++
> 6 files changed, 145 insertions(+), 125 deletions(-)
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
2024-12-09 5:04 ` kernel test robot
2024-12-09 5:08 ` kernel test robot
@ 2024-12-09 12:36 ` kernel test robot
2024-12-09 12:46 ` Filipe Manana
2024-12-11 22:17 ` kernel test robot
4 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-09 12:36 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241209]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edits-tree_insert-to-use-rb-helpers/20241209-104108
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/5e023dcf8f086296da987f8ba2b43be0aca15b86.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edits tree_insert() to use rb helpers
config: x86_64-buildonly-randconfig-001-20241209 (https://download.01.org/0day-ci/archive/20241209/202412092033.josUXvY4-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241209/202412092033.josUXvY4-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412092033.josUXvY4-lkp@intel.com/
All errors (new ones prefixed by >>):
fs/btrfs/delayed-ref.c: In function 'tree_insert':
>> fs/btrfs/delayed-ref.c:342:17: error: implicit declaration of function 'rb_find_add_cached'; did you mean 'rb_find_add_rcu'? [-Werror=implicit-function-declaration]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^~~~~~~~~~~~~~~~~~
| rb_find_add_rcu
fs/btrfs/delayed-ref.c:342:15: warning: assignment to 'struct rb_node *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
342 | exist = rb_find_add_cached(node, root, comp_refs_node);
| ^
cc1: some warnings being treated as errors
vim +342 fs/btrfs/delayed-ref.c
334
335 static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
336 struct btrfs_delayed_ref_node *ins)
337 {
338 struct rb_node *node = &ins->ref_node;
339 struct rb_node *exist;
340 struct btrfs_delayed_ref_node *entry;
341
> 342 exist = rb_find_add_cached(node, root, comp_refs_node);
343 if (exist != NULL) {
344 entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
345 return entry;
346 }
347 return NULL;
348 }
349
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
` (2 preceding siblings ...)
2024-12-09 12:36 ` kernel test robot
@ 2024-12-09 12:46 ` Filipe Manana
2024-12-11 22:17 ` kernel test robot
4 siblings, 0 replies; 54+ messages in thread
From: Filipe Manana @ 2024-12-09 12:46 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs
On Sun, Dec 8, 2024 at 10:39 PM Roger L. Beckermeyer III
<beckerlee3@gmail.com> wrote:
>
> Edits tree_insert() to use rb_find_add_cached(). Also adds a
> comparison function for use in rb_find_add_cached() to compare.
>
> Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> Tested-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> fs/btrfs/delayed-ref.c | 43 +++++++++++++++++++++---------------------
> 1 file changed, 21 insertions(+), 22 deletions(-)
>
> diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
> index 30f7079fa28e..d77ac8d05b2a 100644
> --- a/fs/btrfs/delayed-ref.c
> +++ b/fs/btrfs/delayed-ref.c
> @@ -317,34 +317,33 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
> return 0;
> }
>
> +static int comp_refs_node(struct rb_node *node, const struct rb_node *node2)
> +{
> + struct btrfs_delayed_ref_node *ref1;
> + struct btrfs_delayed_ref_node *ref2;
> +
> + ref1 = rb_entry(node, struct btrfs_delayed_ref_node, ref_node);
> + ref2 = rb_entry(node2, struct btrfs_delayed_ref_node, ref_node);
> +
> + bool check_seq = true;
> + int ret;
Please don't use this style of declaring variables in the middle of the code.
The style we use is to declare them at the top of a scope.
> +
> + ret = comp_refs(ref1, ref2, check_seq);
> + return ret;
For this just do:
return comp_refs(ref1, ref2, check_seq);
> +}
> +
> static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
> struct btrfs_delayed_ref_node *ins)
> {
> - struct rb_node **p = &root->rb_root.rb_node;
> struct rb_node *node = &ins->ref_node;
> - struct rb_node *parent_node = NULL;
> + struct rb_node *exist;
> struct btrfs_delayed_ref_node *entry;
> - bool leftmost = true;
> -
> - while (*p) {
> - int comp;
> -
> - parent_node = *p;
> - entry = rb_entry(parent_node, struct btrfs_delayed_ref_node,
> - ref_node);
> - comp = comp_refs(ins, entry, true);
> - if (comp < 0) {
> - p = &(*p)->rb_left;
> - } else if (comp > 0) {
> - p = &(*p)->rb_right;
> - leftmost = false;
> - } else {
> - return entry;
> - }
> - }
>
> - rb_link_node(node, parent_node, p);
> - rb_insert_color_cached(node, root, leftmost);
> + exist = rb_find_add_cached(node, root, comp_refs_node);
> + if (exist != NULL) {
> + entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
> + return entry;
return rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
Thanks.
> + }
> return NULL;
> }
>
> --
> 2.45.2
>
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCHi 0/6] reduce boilerplate code within btrfs
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (6 preceding siblings ...)
2024-12-09 6:10 ` [PATCHi 0/6] reduce boilerplate code within btrfs Qu Wenruo
@ 2024-12-09 14:05 ` Josef Bacik
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
9 siblings, 0 replies; 54+ messages in thread
From: Josef Bacik @ 2024-12-09 14:05 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs
On Sun, Dec 08, 2024 at 04:37:59PM -0600, Roger L. Beckermeyer III wrote:
> The goal of this patch series is to reduce boilerplate code
> within btrfs. To accomplish this rb_find_add_cached() was added
> to linux/include/rbtree.h. Any replaceable functions were then
> replaced within btrfs.
>
Just a few overall comments on the whole series:
1) Make sure you fix up all the kbuilder test bot things.
2) Don't add "Reviewed-by" or "Tested-by" tags to your own patches, that's for
other people to do. Generally we use "Tested-by" for people who have tested
a specific bug fix.
Thanks,
Josef
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH 0/6] reduce boilerplate code within btrfs
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (7 preceding siblings ...)
2024-12-09 14:05 ` Josef Bacik
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
` (5 more replies)
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
9 siblings, 6 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
The goal of this patch series is to reduce boilerplate code
within btrfs. To accomplish this rb_find_add_cached() was added
to linux/include/rbtree.h. Any replaceable functions were then
replaced within btrfs.
Roger L. Beckermeyer III (6):
rbtree: add rb_find_add_cached() to rbtree.h
btrfs: edit btrfs_add_block_group_cache() to use rb helper
btrfs: edit prelim_ref_insert() to use rb helpers
btrfs: edit __btrfs_add_delayed_item() to use rb helper
btrfs: edit btrfs_add_chunk_map() to use rb helpers
btrfs: edit tree_insert() to use rb helpers
fs/btrfs/backref.c | 71 ++++++++++++++++++++--------------------
fs/btrfs/block-group.c | 40 ++++++++++------------
fs/btrfs/delayed-inode.c | 40 +++++++++-------------
fs/btrfs/delayed-ref.c | 39 +++++++++-------------
fs/btrfs/volumes.c | 39 ++++++++++------------
include/linux/rbtree.h | 37 +++++++++++++++++++++
6 files changed, 140 insertions(+), 126 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-10 19:58 ` Johannes Thumshirn
` (5 more replies)
2024-12-10 19:06 ` [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
` (4 subsequent siblings)
5 siblings, 6 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III, kernel test robot, Josef Bacik
Adds rb_find_add_cached() as a helper function for use with
red-black trees. Used in btrfs to reduce boilerplate code.
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202412092033.josUXvY4-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412091004.4vQ7P5Kl-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090944.g3jpT1Cz-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090919.RdI1OMQg-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.LHCgRc17-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412091036.JGaCqbvL-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090921.E0n0Ioce-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090958.CtUdYRwP-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.Cg7LuOhS-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202412090910.F5gin2Tv-lkp@intel.com/
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index 7c173aa64e1e..0d4444c0cfb3 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
rb_insert_color(node, tree);
}
+/**
+ * rb_find_add_cached() - find equivalent @node in @tree, or add @node
+ * @node: node to look-for / insert
+ * @tree: tree to search / modify
+ * @cmp: operator defining the node order
+ *
+ * Returns the rb_node matching @node, or NULL when no match is found and @node
+ * is inserted.
+ */
+static __always_inline struct rb_node *
+rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
+ int (*cmp)(struct rb_node *, const struct rb_node *))
+{
+ bool leftmost = true;
+ struct rb_node **link = &tree->rb_root.rb_node;
+ struct rb_node *parent = NULL;
+ int c;
+
+ while (*link) {
+ parent = *link;
+ c = cmp(node, parent);
+
+ if (c < 0) {
+ link = &parent->rb_left;
+ } else if (c > 0) {
+ link = &parent->rb_right;
+ leftmost = false;
+ } else {
+ return parent;
+ }
+ }
+
+ rb_link_node(node, parent, link);
+ rb_insert_color_cached(node, tree, leftmost);
+ return NULL;
+}
+
/**
* rb_find_add() - find equivalent @node in @tree, or add @node
* @node: node to look-for / insert
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-11 18:45 ` David Sterba
2024-12-11 18:49 ` David Sterba
2024-12-10 19:06 ` [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
` (3 subsequent siblings)
5 siblings, 2 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III, Josef Bacik
Edits fs/btrfs/block-group.c to use rb_find_add_cached(),
also adds a comparison function, btrfs_add_block_blkgrp_cmp(),
for use with rb_find_add_cached().
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/block-group.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 5be029734cfa..ccff051de43a 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
}
}
+static int btrfs_add_blkgrp_cmp(struct rb_node *new, const struct rb_node *exist)
+{
+ struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node);
+ struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node);
+
+ if (cmp1->start < cmp2->start)
+ return -1;
+ if (cmp1->start > cmp2->start)
+ return 1;
+ return 0;
+}
+
/*
* This adds the block group to the fs_info rb tree for the block group cache
*/
static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
struct btrfs_block_group *block_group)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- struct btrfs_block_group *cache;
- bool leftmost = true;
+ struct rb_node *exist;
ASSERT(block_group->length != 0);
write_lock(&info->block_group_cache_lock);
- p = &info->block_group_cache_tree.rb_root.rb_node;
-
- while (*p) {
- parent = *p;
- cache = rb_entry(parent, struct btrfs_block_group, cache_node);
- if (block_group->start < cache->start) {
- p = &(*p)->rb_left;
- } else if (block_group->start > cache->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&info->block_group_cache_lock);
- return -EEXIST;
- }
- }
-
- rb_link_node(&block_group->cache_node, parent, p);
- rb_insert_color_cached(&block_group->cache_node,
- &info->block_group_cache_tree, leftmost);
+ exist = rb_find_add_cached(&block_group->cache_node,
+ &info->block_group_cache_tree, btrfs_add_blkgrp_cmp);
+ if (exist != NULL)
+ return -EEXIST;
write_unlock(&info->block_group_cache_lock);
return 0;
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-11 18:47 ` David Sterba
2024-12-10 19:06 ` [PATCH 4/6] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
` (2 subsequent siblings)
5 siblings, 1 reply; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
This commit edits prelim_ref_insert() in fs/btrfs/backref.c to use
rb_find_add_cached(). It also adds a comparison function for use with
rb_find_add_cached().
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/backref.c | 71 +++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 35 deletions(-)
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index 6d9f39c1d89c..fcbcfce0f93a 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -250,6 +250,17 @@ static int prelim_ref_compare(const struct prelim_ref *ref1,
return 0;
}
+static int prelim_ref_cmp(struct rb_node *node, const struct rb_node *exist)
+{
+ int result;
+ struct prelim_ref *ref1 = rb_entry(node, struct prelim_ref, rbnode);
+ struct prelim_ref *ref2 = rb_entry(exist, struct prelim_ref, rbnode);
+
+ result = prelim_ref_compare(ref1, ref2);
+
+ return result;
+}
+
static void update_share_count(struct share_check *sc, int oldcount,
int newcount, const struct prelim_ref *newref)
{
@@ -281,52 +292,42 @@ static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
struct rb_node **p;
struct rb_node *parent = NULL;
struct prelim_ref *ref;
- int result;
- bool leftmost = true;
+ struct rb_node *exist;
root = &preftree->root;
p = &root->rb_root.rb_node;
+ parent = *p;
+ ref = rb_entry(parent, struct prelim_ref, rbnode);
- while (*p) {
- parent = *p;
- ref = rb_entry(parent, struct prelim_ref, rbnode);
- result = prelim_ref_compare(ref, newref);
- if (result < 0) {
- p = &(*p)->rb_left;
- } else if (result > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- /* Identical refs, merge them and free @newref */
- struct extent_inode_elem *eie = ref->inode_list;
+ exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
+ if (exist != NULL) {
+ /* Identical refs, merge them and free @newref */
+ struct extent_inode_elem *eie = ref->inode_list;
- while (eie && eie->next)
- eie = eie->next;
+ while (eie && eie->next)
+ eie = eie->next;
- if (!eie)
- ref->inode_list = newref->inode_list;
- else
- eie->next = newref->inode_list;
- trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
- preftree->count);
- /*
- * A delayed ref can have newref->count < 0.
- * The ref->count is updated to follow any
- * BTRFS_[ADD|DROP]_DELAYED_REF actions.
- */
- update_share_count(sc, ref->count,
- ref->count + newref->count, newref);
- ref->count += newref->count;
- free_pref(newref);
- return;
- }
+ if (!eie)
+ ref->inode_list = newref->inode_list;
+ else
+ eie->next = newref->inode_list;
+ trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
+ preftree->count);
+ /*
+ * A delayed ref can have newref->count < 0.
+ * The ref->count is updated to follow any
+ * BTRFS_[ADD|DROP]_DELAYED_REF actions.
+ */
+ update_share_count(sc, ref->count,
+ ref->count + newref->count, newref);
+ ref->count += newref->count;
+ free_pref(newref);
+ return;
}
update_share_count(sc, 0, newref->count, newref);
preftree->count++;
trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
- rb_link_node(&newref->rbnode, parent, p);
- rb_insert_color_cached(&newref->rbnode, root, leftmost);
}
/*
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 4/6] btrfs: edit __btrfs_add_delayed_item() to use rb helper
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
` (2 preceding siblings ...)
2024-12-10 19:06 ` [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 5/6] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 6/6] btrfs: edit tree_insert() " Roger L. Beckermeyer III
5 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
This commit edits __btrfs_add_delayed_item() to use rb_find_add_cached().
It also adds a helper function to use with rb_find_add_cached().
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-inode.c | 40 ++++++++++++++++------------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 508bdbae29a0..7d62224bc49c 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -366,40 +366,32 @@ static struct btrfs_delayed_item *__btrfs_lookup_delayed_item(
return NULL;
}
+static int btrfs_add_delayed_item_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_delayed_item *item = rb_entry(rb_node, struct btrfs_delayed_item, rb_node);
+ struct btrfs_delayed_item *exist = rb_entry(exist_node, struct btrfs_delayed_item, rb_node);
+
+ if (item->index < exist->index)
+ return -1;
+ if (item->index > exist->index)
+ return 1;
+ return 0;
+}
+
static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
struct btrfs_delayed_item *ins)
{
- struct rb_node **p, *node;
- struct rb_node *parent_node = NULL;
struct rb_root_cached *root;
- struct btrfs_delayed_item *item;
- bool leftmost = true;
+ struct rb_node *exist;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
root = &delayed_node->ins_root;
else
root = &delayed_node->del_root;
- p = &root->rb_root.rb_node;
- node = &ins->rb_node;
-
- while (*p) {
- parent_node = *p;
- item = rb_entry(parent_node, struct btrfs_delayed_item,
- rb_node);
-
- if (item->index < ins->index) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else if (item->index > ins->index) {
- p = &(*p)->rb_left;
- } else {
- return -EEXIST;
- }
- }
-
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
+ if (exist != NULL)
+ return -EEXIST;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
ins->index >= delayed_node->index_cnt)
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 5/6] btrfs: edit btrfs_add_chunk_map() to use rb helpers
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
` (3 preceding siblings ...)
2024-12-10 19:06 ` [PATCH 4/6] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 6/6] btrfs: edit tree_insert() " Roger L. Beckermeyer III
5 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
Edits btrfs_add_chunk_map() to use rb_find_add_cached(). Also adds a
comparison function to use with rb_find_add_cached().
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/volumes.c | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 1cccaf9c2b0d..4837761a56c9 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -5513,33 +5513,30 @@ void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_ma
btrfs_free_chunk_map(map);
}
+static int btrfs_chunk_map_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_chunk_map *map = rb_entry(rb_node, struct btrfs_chunk_map, rb_node);
+ struct btrfs_chunk_map *exist = rb_entry(exist_node, struct btrfs_chunk_map, rb_node);
+
+ if (map->start == exist->start)
+ return 0;
+ if (map->start < exist->start)
+ return -1;
+ return 1;
+}
+
EXPORT_FOR_TESTS
int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- bool leftmost = true;
+ struct rb_node *exist;
write_lock(&fs_info->mapping_tree_lock);
- p = &fs_info->mapping_tree.rb_root.rb_node;
- while (*p) {
- struct btrfs_chunk_map *entry;
-
- parent = *p;
- entry = rb_entry(parent, struct btrfs_chunk_map, rb_node);
-
- if (map->start < entry->start) {
- p = &(*p)->rb_left;
- } else if (map->start > entry->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&fs_info->mapping_tree_lock);
- return -EEXIST;
- }
+ exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
+
+ if (exist != NULL) {
+ write_unlock(&fs_info->mapping_tree_lock);
+ return -EEXIST;
}
- rb_link_node(&map->rb_node, parent, p);
- rb_insert_color_cached(&map->rb_node, &fs_info->mapping_tree, leftmost);
chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
write_unlock(&fs_info->mapping_tree_lock);
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 6/6] btrfs: edit tree_insert() to use rb helpers
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
` (4 preceding siblings ...)
2024-12-10 19:06 ` [PATCH 5/6] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-10 19:06 ` Roger L. Beckermeyer III
5 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-10 19:06 UTC (permalink / raw)
To: linux-btrfs; +Cc: Roger L. Beckermeyer III
Edits tree_insert() to use rb_find_add_cached(). Also adds a
comparison function for use in rb_find_add_cached() to compare.
V2: incorporated changes from Filipe Manana
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-ref.c | 39 ++++++++++++++++-----------------------
1 file changed, 16 insertions(+), 23 deletions(-)
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
index 30f7079fa28e..e288058f5c3c 100644
--- a/fs/btrfs/delayed-ref.c
+++ b/fs/btrfs/delayed-ref.c
@@ -317,34 +317,27 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
return 0;
}
+static int comp_refs_node(struct rb_node *node, const struct rb_node *node2)
+{
+ struct btrfs_delayed_ref_node *ref1;
+ struct btrfs_delayed_ref_node *ref2;
+ bool check_seq = true;
+
+ ref1 = rb_entry(node, struct btrfs_delayed_ref_node, ref_node);
+ ref2 = rb_entry(node2, struct btrfs_delayed_ref_node, ref_node);
+
+ return comp_refs(ref1, ref2, check_seq);
+}
+
static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
struct btrfs_delayed_ref_node *ins)
{
- struct rb_node **p = &root->rb_root.rb_node;
struct rb_node *node = &ins->ref_node;
- struct rb_node *parent_node = NULL;
- struct btrfs_delayed_ref_node *entry;
- bool leftmost = true;
-
- while (*p) {
- int comp;
-
- parent_node = *p;
- entry = rb_entry(parent_node, struct btrfs_delayed_ref_node,
- ref_node);
- comp = comp_refs(ins, entry, true);
- if (comp < 0) {
- p = &(*p)->rb_left;
- } else if (comp > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- return entry;
- }
- }
+ struct rb_node *exist;
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(node, root, comp_refs_node);
+ if (exist != NULL)
+ return rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
return NULL;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
@ 2024-12-10 19:58 ` Johannes Thumshirn
2024-12-11 17:47 ` Roger L. Beckermeyer III
` (4 subsequent siblings)
5 siblings, 0 replies; 54+ messages in thread
From: Johannes Thumshirn @ 2024-12-10 19:58 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs@vger.kernel.org
Cc: kernel test robot, Josef Bacik
On 10.12.24 20:07, Roger L. Beckermeyer III wrote:
> Adds rb_find_add_cached() as a helper function for use with
> red-black trees. Used in btrfs to reduce boilerplate code.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202412092033.josUXvY4-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412091004.4vQ7P5Kl-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090944.g3jpT1Cz-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090919.RdI1OMQg-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.LHCgRc17-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412091036.JGaCqbvL-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090921.E0n0Ioce-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090958.CtUdYRwP-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.Cg7LuOhS-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090910.F5gin2Tv-lkp@intel.com/
Don't add the Closes: tag here. It's a change between v1 and v2 which
does not need to go to the git history.
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-10 19:58 ` Johannes Thumshirn
@ 2024-12-11 17:47 ` Roger L. Beckermeyer III
2024-12-11 18:41 ` David Sterba
` (3 subsequent siblings)
5 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-11 17:47 UTC (permalink / raw)
To: lkp; +Cc: beckerlee3, linux-btrfs, llvm, oe-kbuild-all, Josef Bacik
Adds rb_find_add_cached() as a helper function for use with
red-black trees. Used in btrfs to reduce boilerplate code.
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index 7c173aa64e1e..0d4444c0cfb3 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
rb_insert_color(node, tree);
}
+/**
+ * rb_find_add_cached() - find equivalent @node in @tree, or add @node
+ * @node: node to look-for / insert
+ * @tree: tree to search / modify
+ * @cmp: operator defining the node order
+ *
+ * Returns the rb_node matching @node, or NULL when no match is found and @node
+ * is inserted.
+ */
+static __always_inline struct rb_node *
+rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
+ int (*cmp)(struct rb_node *, const struct rb_node *))
+{
+ bool leftmost = true;
+ struct rb_node **link = &tree->rb_root.rb_node;
+ struct rb_node *parent = NULL;
+ int c;
+
+ while (*link) {
+ parent = *link;
+ c = cmp(node, parent);
+
+ if (c < 0) {
+ link = &parent->rb_left;
+ } else if (c > 0) {
+ link = &parent->rb_right;
+ leftmost = false;
+ } else {
+ return parent;
+ }
+ }
+
+ rb_link_node(node, parent, link);
+ rb_insert_color_cached(node, tree, leftmost);
+ return NULL;
+}
+
/**
* rb_find_add() - find equivalent @node in @tree, or add @node
* @node: node to look-for / insert
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-10 19:58 ` Johannes Thumshirn
2024-12-11 17:47 ` Roger L. Beckermeyer III
@ 2024-12-11 18:41 ` David Sterba
2024-12-12 16:46 ` Roger L. Beckermeyer III
` (2 subsequent siblings)
5 siblings, 0 replies; 54+ messages in thread
From: David Sterba @ 2024-12-11 18:41 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs, kernel test robot, Josef Bacik
On Tue, Dec 10, 2024 at 01:06:07PM -0600, Roger L. Beckermeyer III wrote:
> Adds rb_find_add_cached() as a helper function for use with
> red-black trees. Used in btrfs to reduce boilerplate code.
>
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202412092033.josUXvY4-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412091004.4vQ7P5Kl-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090944.g3jpT1Cz-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090919.RdI1OMQg-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.LHCgRc17-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412091036.JGaCqbvL-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090921.E0n0Ioce-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090958.CtUdYRwP-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090922.Cg7LuOhS-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202412090910.F5gin2Tv-lkp@intel.com/
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
This is generic code and you need to CC the right people to get their
ack and reviewed-by. Alternatively we can have our own copy in
fs/btrfs/misc.h and then move it to the generic code.
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper
2024-12-10 19:06 ` [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
@ 2024-12-11 18:45 ` David Sterba
2024-12-11 18:49 ` David Sterba
1 sibling, 0 replies; 54+ messages in thread
From: David Sterba @ 2024-12-11 18:45 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs, Josef Bacik
On Tue, Dec 10, 2024 at 01:06:08PM -0600, Roger L. Beckermeyer III wrote:
> Edits fs/btrfs/block-group.c to use rb_find_add_cached(),
Please don't use 'edit' for changelogs, 'update to use' or 'use'
describes it better.
> also adds a comparison function, btrfs_add_block_blkgrp_cmp(),
> for use with rb_find_add_cached().
>
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Reviewed-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> fs/btrfs/block-group.c | 40 +++++++++++++++++-----------------------
> 1 file changed, 17 insertions(+), 23 deletions(-)
>
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index 5be029734cfa..ccff051de43a 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
> }
> }
>
> +static int btrfs_add_blkgrp_cmp(struct rb_node *new, const struct rb_node *exist)
This is a comparator so 'add' is confusing here, so 'btrfs_bg_start_cmp'
for exmample.
> +{
> + struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node);
> + struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node);
The types don't match, 'exist' is const.
> +
> + if (cmp1->start < cmp2->start)
> + return -1;
> + if (cmp1->start > cmp2->start)
> + return 1;
> + return 0;
> +}
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers
2024-12-10 19:06 ` [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-11 18:47 ` David Sterba
0 siblings, 0 replies; 54+ messages in thread
From: David Sterba @ 2024-12-11 18:47 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs
On Tue, Dec 10, 2024 at 01:06:09PM -0600, Roger L. Beckermeyer III wrote:
> This commit edits prelim_ref_insert() in fs/btrfs/backref.c to use
> rb_find_add_cached(). It also adds a comparison function for use with
> rb_find_add_cached().
>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> fs/btrfs/backref.c | 71 +++++++++++++++++++++++-----------------------
> 1 file changed, 36 insertions(+), 35 deletions(-)
>
> diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
> index 6d9f39c1d89c..fcbcfce0f93a 100644
> --- a/fs/btrfs/backref.c
> +++ b/fs/btrfs/backref.c
> @@ -250,6 +250,17 @@ static int prelim_ref_compare(const struct prelim_ref *ref1,
> return 0;
> }
>
> +static int prelim_ref_cmp(struct rb_node *node, const struct rb_node *exist)
> +{
> + int result;
> + struct prelim_ref *ref1 = rb_entry(node, struct prelim_ref, rbnode);
> + struct prelim_ref *ref2 = rb_entry(exist, struct prelim_ref, rbnode);
Same type mismatch, missing const.
> +
> + result = prelim_ref_compare(ref1, ref2);
You don't need the temporary variable 'result'.
> +
> + return result;
> +}
> +
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper
2024-12-10 19:06 ` [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
2024-12-11 18:45 ` David Sterba
@ 2024-12-11 18:49 ` David Sterba
1 sibling, 0 replies; 54+ messages in thread
From: David Sterba @ 2024-12-11 18:49 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs, Josef Bacik
On Tue, Dec 10, 2024 at 01:06:08PM -0600, Roger L. Beckermeyer III wrote:
> + exist = rb_find_add_cached(&block_group->cache_node,
> + &info->block_group_cache_tree, btrfs_add_blkgrp_cmp);
> + if (exist != NULL)
For pointer checks you can use the shorter form 'if (exist)'
> + return -EEXIST;
> write_unlock(&info->block_group_cache_lock);
>
> return 0;
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edits tree_insert() to use rb helpers
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
` (3 preceding siblings ...)
2024-12-09 12:46 ` Filipe Manana
@ 2024-12-11 22:17 ` kernel test robot
4 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-11 22:17 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241211]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edits-tree_insert-to-use-rb-helpers/20241209-104108
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/5e023dcf8f086296da987f8ba2b43be0aca15b86.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edits tree_insert() to use rb helpers
config: s390-defconfig (https://download.01.org/0day-ci/archive/20241212/202412120640.485KsaTz-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241212/202412120640.485KsaTz-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412120640.485KsaTz-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/btrfs/delayed-ref.c:342:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Werror,-Wimplicit-function-declaration]
exist = rb_find_add_cached(node, root, comp_refs_node);
^
fs/btrfs/delayed-ref.c:342:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
exist = rb_find_add_cached(node, root, comp_refs_node);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
vim +/rb_find_add_cached +342 fs/btrfs/delayed-ref.c
334
335 static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
336 struct btrfs_delayed_ref_node *ins)
337 {
338 struct rb_node *node = &ins->ref_node;
339 struct rb_node *exist;
340 struct btrfs_delayed_ref_node *entry;
341
> 342 exist = rb_find_add_cached(node, root, comp_refs_node);
343 if (exist != NULL) {
344 entry = rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
345 return entry;
346 }
347 return NULL;
348 }
349
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
2024-12-09 5:00 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
@ 2024-12-12 1:18 ` kernel test robot
2 siblings, 0 replies; 54+ messages in thread
From: kernel test robot @ 2024-12-12 1:18 UTC (permalink / raw)
To: Roger L. Beckermeyer III, linux-btrfs
Cc: llvm, oe-kbuild-all, Roger L. Beckermeyer III
Hi Roger,
kernel test robot noticed the following build errors:
[auto build test ERROR on kdave/for-next]
[also build test ERROR on linus/master v6.13-rc2 next-20241211]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Roger-L-Beckermeyer-III/btrfs-edit-__btrfs_add_delayed_item-to-use-rb-helper/20241209-104443
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/9b85bdbc269d20886590f0a70de66c602d72aa9d.1733695544.git.beckerlee3%40gmail.com
patch subject: [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper
config: s390-defconfig (https://download.01.org/0day-ci/archive/20241212/202412120959.0utuK69J-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241212/202412120959.0utuK69J-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412120959.0utuK69J-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/btrfs/delayed-inode.c:392:10: error: call to undeclared function 'rb_find_add_cached'; ISO C99 and later do not support implicit function declarations [-Werror,-Wimplicit-function-declaration]
exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
^
fs/btrfs/delayed-inode.c:392:8: error: incompatible integer to pointer conversion assigning to 'struct rb_node *' from 'int' [-Wint-conversion]
exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
vim +/rb_find_add_cached +392 fs/btrfs/delayed-inode.c
380
381 static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
382 struct btrfs_delayed_item *ins)
383 {
384 struct rb_root_cached *root;
385 struct rb_node *exist;
386
387 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
388 root = &delayed_node->ins_root;
389 else
390 root = &delayed_node->del_root;
391
> 392 exist = rb_find_add_cached(&ins->rb_node, root, btrfs_add_delayed_item_cmp);
393 if (exist != NULL)
394 return -EEXIST;
395
396 if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
397 ins->index >= delayed_node->index_cnt)
398 delayed_node->index_cnt = ins->index + 1;
399
400 delayed_node->count++;
401 atomic_inc(&delayed_node->root->fs_info->delayed_root->items);
402 return 0;
403 }
404
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
` (2 preceding siblings ...)
2024-12-11 18:41 ` David Sterba
@ 2024-12-12 16:46 ` Roger L. Beckermeyer III
2024-12-13 7:21 ` Qu Wenruo
2024-12-13 9:06 ` Peter Zijlstra
5 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 16:46 UTC (permalink / raw)
To: dsterba, peterz, oleg, mhiramat, linux-kernel
Cc: beckerlee3, josef, linux-btrfs, lkp
Adds rb_find_add_cached() as a helper function for use with
red-black trees. Used in btrfs to reduce boilerplate code.
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index 7c173aa64e1e..0d4444c0cfb3 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
rb_insert_color(node, tree);
}
+/**
+ * rb_find_add_cached() - find equivalent @node in @tree, or add @node
+ * @node: node to look-for / insert
+ * @tree: tree to search / modify
+ * @cmp: operator defining the node order
+ *
+ * Returns the rb_node matching @node, or NULL when no match is found and @node
+ * is inserted.
+ */
+static __always_inline struct rb_node *
+rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
+ int (*cmp)(struct rb_node *, const struct rb_node *))
+{
+ bool leftmost = true;
+ struct rb_node **link = &tree->rb_root.rb_node;
+ struct rb_node *parent = NULL;
+ int c;
+
+ while (*link) {
+ parent = *link;
+ c = cmp(node, parent);
+
+ if (c < 0) {
+ link = &parent->rb_left;
+ } else if (c > 0) {
+ link = &parent->rb_right;
+ leftmost = false;
+ } else {
+ return parent;
+ }
+ }
+
+ rb_link_node(node, parent, link);
+ rb_insert_color_cached(node, tree, leftmost);
+ return NULL;
+}
+
/**
* rb_find_add() - find equivalent @node in @tree, or add @node
* @node: node to look-for / insert
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 0/6] reduce boilerplate code within btrfs
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (8 preceding siblings ...)
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers Roger L. Beckermeyer III
` (4 more replies)
9 siblings, 5 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs
The goal of this patch series is to reduce boilerplate code
within btrfs. To accomplish this rb_find_add_cached() was added
to linux/include/rbtree.h. Any replaceable functions were then
replaced within btrfs.
Roger L. Beckermeyer III (6):
rbtree: add rb_find_add_cached() to rbtree.h
btrfs: update btrfs_add_block_group_cache() to use rb helpers
btrfs: update prelim_ref_insert() to use rb helpers
btrfs: update __btrfs_add_delayed_item() to use rb helpers
btrfs: update btrfs_add_chunk_map() to use rb helpers
btrfs: update tree_insert() to use rb helpers
fs/btrfs/backref.c | 71 ++++++++++++++++++++--------------------
fs/btrfs/block-group.c | 40 ++++++++++------------
fs/btrfs/delayed-inode.c | 40 +++++++++-------------
fs/btrfs/delayed-ref.c | 39 +++++++++-------------
fs/btrfs/volumes.c | 39 ++++++++++------------
include/linux/rbtree.h | 37 +++++++++++++++++++++
6 files changed, 140 insertions(+), 126 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 54+ messages in thread
* [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-13 7:19 ` Qu Wenruo
2024-12-12 20:29 ` [PATCH 3/6] btrfs: update prelim_ref_insert() " Roger L. Beckermeyer III
` (3 subsequent siblings)
4 siblings, 1 reply; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs, Josef Bacik
update fs/btrfs/block-group.c to use rb_find_add_cached()
implement btrfs_bg_start_cmp() for use with rb_find_add_cached().
Suggested-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/block-group.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 5be029734cfa..6001b78e9ea9 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
}
}
+static int btrfs_bg_start_cmp(struct rb_node *new, const struct rb_node *exist)
+{
+ struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node);
+ const struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node);
+
+ if (cmp1->start < cmp2->start)
+ return -1;
+ if (cmp1->start > cmp2->start)
+ return 1;
+ return 0;
+}
+
/*
* This adds the block group to the fs_info rb tree for the block group cache
*/
static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
struct btrfs_block_group *block_group)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- struct btrfs_block_group *cache;
- bool leftmost = true;
+ struct rb_node *exist;
ASSERT(block_group->length != 0);
write_lock(&info->block_group_cache_lock);
- p = &info->block_group_cache_tree.rb_root.rb_node;
-
- while (*p) {
- parent = *p;
- cache = rb_entry(parent, struct btrfs_block_group, cache_node);
- if (block_group->start < cache->start) {
- p = &(*p)->rb_left;
- } else if (block_group->start > cache->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&info->block_group_cache_lock);
- return -EEXIST;
- }
- }
-
- rb_link_node(&block_group->cache_node, parent, p);
- rb_insert_color_cached(&block_group->cache_node,
- &info->block_group_cache_tree, leftmost);
+ exist = rb_find_add_cached(&block_group->cache_node,
+ &info->block_group_cache_tree, btrfs_bg_start_cmp);
+ if (exist != NULL)
+ return -EEXIST;
write_unlock(&info->block_group_cache_lock);
return 0;
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 3/6] btrfs: update prelim_ref_insert() to use rb helpers
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 4/6] btrfs: update __btrfs_add_delayed_item() " Roger L. Beckermeyer III
` (2 subsequent siblings)
4 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs
update prelim_ref_insert() to use rb_find_add_cached()
adds prelim_ref_cmp for use with rb_find_add_cached()
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/backref.c | 71 +++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 35 deletions(-)
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index 6d9f39c1d89c..fcbcfce0f93a 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -250,6 +250,17 @@ static int prelim_ref_compare(const struct prelim_ref *ref1,
return 0;
}
+static int prelim_ref_cmp(struct rb_node *node, const struct rb_node *exist)
+{
+ int result;
+ struct prelim_ref *ref1 = rb_entry(node, struct prelim_ref, rbnode);
+ struct prelim_ref *ref2 = rb_entry(exist, struct prelim_ref, rbnode);
+
+ result = prelim_ref_compare(ref1, ref2);
+
+ return result;
+}
+
static void update_share_count(struct share_check *sc, int oldcount,
int newcount, const struct prelim_ref *newref)
{
@@ -281,52 +292,42 @@ static void prelim_ref_insert(const struct btrfs_fs_info *fs_info,
struct rb_node **p;
struct rb_node *parent = NULL;
struct prelim_ref *ref;
- int result;
- bool leftmost = true;
+ struct rb_node *exist;
root = &preftree->root;
p = &root->rb_root.rb_node;
+ parent = *p;
+ ref = rb_entry(parent, struct prelim_ref, rbnode);
- while (*p) {
- parent = *p;
- ref = rb_entry(parent, struct prelim_ref, rbnode);
- result = prelim_ref_compare(ref, newref);
- if (result < 0) {
- p = &(*p)->rb_left;
- } else if (result > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- /* Identical refs, merge them and free @newref */
- struct extent_inode_elem *eie = ref->inode_list;
+ exist = rb_find_add_cached(&newref->rbnode, root, prelim_ref_cmp);
+ if (exist != NULL) {
+ /* Identical refs, merge them and free @newref */
+ struct extent_inode_elem *eie = ref->inode_list;
- while (eie && eie->next)
- eie = eie->next;
+ while (eie && eie->next)
+ eie = eie->next;
- if (!eie)
- ref->inode_list = newref->inode_list;
- else
- eie->next = newref->inode_list;
- trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
- preftree->count);
- /*
- * A delayed ref can have newref->count < 0.
- * The ref->count is updated to follow any
- * BTRFS_[ADD|DROP]_DELAYED_REF actions.
- */
- update_share_count(sc, ref->count,
- ref->count + newref->count, newref);
- ref->count += newref->count;
- free_pref(newref);
- return;
- }
+ if (!eie)
+ ref->inode_list = newref->inode_list;
+ else
+ eie->next = newref->inode_list;
+ trace_btrfs_prelim_ref_merge(fs_info, ref, newref,
+ preftree->count);
+ /*
+ * A delayed ref can have newref->count < 0.
+ * The ref->count is updated to follow any
+ * BTRFS_[ADD|DROP]_DELAYED_REF actions.
+ */
+ update_share_count(sc, ref->count,
+ ref->count + newref->count, newref);
+ ref->count += newref->count;
+ free_pref(newref);
+ return;
}
update_share_count(sc, 0, newref->count, newref);
preftree->count++;
trace_btrfs_prelim_ref_insert(fs_info, newref, NULL, preftree->count);
- rb_link_node(&newref->rbnode, parent, p);
- rb_insert_color_cached(&newref->rbnode, root, leftmost);
}
/*
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 4/6] btrfs: update __btrfs_add_delayed_item() to use rb helpers
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 3/6] btrfs: update prelim_ref_insert() " Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 5/6] btrfs: update btrfs_add_chunk_map() " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 6/6] btrfs: update tree_insert() " Roger L. Beckermeyer III
4 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs
update __btrfs_add_delayed_item() to use rb_find_add_cached()
add btrfs_delayed_item_cmp() to use with rb_find_add_cached()
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-inode.c | 40 ++++++++++++++++------------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 508bdbae29a0..d705049fb381 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -366,40 +366,32 @@ static struct btrfs_delayed_item *__btrfs_lookup_delayed_item(
return NULL;
}
+static int btrfs_delayed_item_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_delayed_item *item = rb_entry(rb_node, struct btrfs_delayed_item, rb_node);
+ const struct btrfs_delayed_item *exist = rb_entry(exist_node, struct btrfs_delayed_item, rb_node);
+
+ if (item->index < exist->index)
+ return -1;
+ if (item->index > exist->index)
+ return 1;
+ return 0;
+}
+
static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
struct btrfs_delayed_item *ins)
{
- struct rb_node **p, *node;
- struct rb_node *parent_node = NULL;
struct rb_root_cached *root;
- struct btrfs_delayed_item *item;
- bool leftmost = true;
+ struct rb_node *exist;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM)
root = &delayed_node->ins_root;
else
root = &delayed_node->del_root;
- p = &root->rb_root.rb_node;
- node = &ins->rb_node;
-
- while (*p) {
- parent_node = *p;
- item = rb_entry(parent_node, struct btrfs_delayed_item,
- rb_node);
-
- if (item->index < ins->index) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else if (item->index > ins->index) {
- p = &(*p)->rb_left;
- } else {
- return -EEXIST;
- }
- }
-
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(&ins->rb_node, root, btrfs_delayed_item_cmp);
+ if (exist != NULL)
+ return -EEXIST;
if (ins->type == BTRFS_DELAYED_INSERTION_ITEM &&
ins->index >= delayed_node->index_cnt)
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 5/6] btrfs: update btrfs_add_chunk_map() to use rb helpers
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (2 preceding siblings ...)
2024-12-12 20:29 ` [PATCH 4/6] btrfs: update __btrfs_add_delayed_item() " Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 6/6] btrfs: update tree_insert() " Roger L. Beckermeyer III
4 siblings, 0 replies; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs
update btrfs_add_chunk_map() to use rb_find_add_cached(). add
btrfs_chunk_map_cmp to use with rb_find_add_cached().
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/volumes.c | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 1cccaf9c2b0d..b39723a95f26 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -5513,33 +5513,30 @@ void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_ma
btrfs_free_chunk_map(map);
}
+static int btrfs_chunk_map_cmp(struct rb_node *rb_node, const struct rb_node *exist_node)
+{
+ struct btrfs_chunk_map *map = rb_entry(rb_node, struct btrfs_chunk_map, rb_node);
+ const struct btrfs_chunk_map *exist = rb_entry(exist_node, struct btrfs_chunk_map, rb_node);
+
+ if (map->start == exist->start)
+ return 0;
+ if (map->start < exist->start)
+ return -1;
+ return 1;
+}
+
EXPORT_FOR_TESTS
int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
{
- struct rb_node **p;
- struct rb_node *parent = NULL;
- bool leftmost = true;
+ struct rb_node *exist;
write_lock(&fs_info->mapping_tree_lock);
- p = &fs_info->mapping_tree.rb_root.rb_node;
- while (*p) {
- struct btrfs_chunk_map *entry;
-
- parent = *p;
- entry = rb_entry(parent, struct btrfs_chunk_map, rb_node);
-
- if (map->start < entry->start) {
- p = &(*p)->rb_left;
- } else if (map->start > entry->start) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- write_unlock(&fs_info->mapping_tree_lock);
- return -EEXIST;
- }
+ exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree, btrfs_chunk_map_cmp);
+
+ if (exist != NULL) {
+ write_unlock(&fs_info->mapping_tree_lock);
+ return -EEXIST;
}
- rb_link_node(&map->rb_node, parent, p);
- rb_insert_color_cached(&map->rb_node, &fs_info->mapping_tree, leftmost);
chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
write_unlock(&fs_info->mapping_tree_lock);
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
` (3 preceding siblings ...)
2024-12-12 20:29 ` [PATCH 5/6] btrfs: update btrfs_add_chunk_map() " Roger L. Beckermeyer III
@ 2024-12-12 20:29 ` Roger L. Beckermeyer III
2024-12-13 6:19 ` Qu Wenruo
4 siblings, 1 reply; 54+ messages in thread
From: Roger L. Beckermeyer III @ 2024-12-12 20:29 UTC (permalink / raw)
To: beckerlee3; +Cc: linux-btrfs
update tree_insert() to use rb_find_add_cached().
add cmp_refs_node in rb_find_add_cached() to compare.
note: I think some of comparison functions could be further refined.
V2: incorporated changes from Filipe Manana
Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
---
fs/btrfs/delayed-ref.c | 39 ++++++++++++++++-----------------------
1 file changed, 16 insertions(+), 23 deletions(-)
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
index 30f7079fa28e..3cd122c899cc 100644
--- a/fs/btrfs/delayed-ref.c
+++ b/fs/btrfs/delayed-ref.c
@@ -317,34 +317,27 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
return 0;
}
+static int cmp_refs_node(struct rb_node *node, const struct rb_node *node2)
+{
+ struct btrfs_delayed_ref_node *ref1;
+ const struct btrfs_delayed_ref_node *ref2;
+ bool check_seq = true;
+
+ ref1 = rb_entry(node, struct btrfs_delayed_ref_node, ref_node);
+ ref2 = rb_entry(node2, struct btrfs_delayed_ref_node, ref_node);
+
+ return comp_refs(ref1, ref2, check_seq);
+}
+
static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
struct btrfs_delayed_ref_node *ins)
{
- struct rb_node **p = &root->rb_root.rb_node;
struct rb_node *node = &ins->ref_node;
- struct rb_node *parent_node = NULL;
- struct btrfs_delayed_ref_node *entry;
- bool leftmost = true;
-
- while (*p) {
- int comp;
-
- parent_node = *p;
- entry = rb_entry(parent_node, struct btrfs_delayed_ref_node,
- ref_node);
- comp = comp_refs(ins, entry, true);
- if (comp < 0) {
- p = &(*p)->rb_left;
- } else if (comp > 0) {
- p = &(*p)->rb_right;
- leftmost = false;
- } else {
- return entry;
- }
- }
+ struct rb_node *exist;
- rb_link_node(node, parent_node, p);
- rb_insert_color_cached(node, root, leftmost);
+ exist = rb_find_add_cached(node, root, cmp_refs_node);
+ if (exist != NULL)
+ return rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
return NULL;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 54+ messages in thread
* Re: [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-12 20:29 ` [PATCH 6/6] btrfs: update tree_insert() " Roger L. Beckermeyer III
@ 2024-12-13 6:19 ` Qu Wenruo
2024-12-13 7:30 ` Johannes Thumshirn
0 siblings, 1 reply; 54+ messages in thread
From: Qu Wenruo @ 2024-12-13 6:19 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs
在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
> update tree_insert() to use rb_find_add_cached().
> add cmp_refs_node in rb_find_add_cached() to compare.
>
> note: I think some of comparison functions could be further refined.
>
> V2: incorporated changes from Filipe Manana
Firstly changelog should not be part of the commit message. It should be
after the "---" line so that git-am will drop it when applying.
Secondly if you're updating a series of patches, please resend the whole
series and put the change log into the cover letter to explain all the
changes.
Updating one patch of a series is only going to make it much harder to
follow/apply.
And put a version number for the whole series. It can be done by
git-formatpatch with `--subject="PATCH v2"` option.
Lastly, please do not split your patches and send differently, the last
send attempt split the first and the remaining patches, just do not do that.
Always send the whole series with "git send-email *.patch", that will
easily mess up the Message-Id (which is already messed up as you put two
message ids for your new series, meanwhile you should use a new
message-id for each updated series)
If you want separate Cc, you can put it into the commit message and
git-sendemail will pick it up.
Thanks,
Qu
>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> fs/btrfs/delayed-ref.c | 39 ++++++++++++++++-----------------------
> 1 file changed, 16 insertions(+), 23 deletions(-)
>
> diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
> index 30f7079fa28e..3cd122c899cc 100644
> --- a/fs/btrfs/delayed-ref.c
> +++ b/fs/btrfs/delayed-ref.c
> @@ -317,34 +317,27 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
> return 0;
> }
>
> +static int cmp_refs_node(struct rb_node *node, const struct rb_node *node2)
> +{
> + struct btrfs_delayed_ref_node *ref1;
> + const struct btrfs_delayed_ref_node *ref2;
> + bool check_seq = true;
> +
> + ref1 = rb_entry(node, struct btrfs_delayed_ref_node, ref_node);
> + ref2 = rb_entry(node2, struct btrfs_delayed_ref_node, ref_node);
> +
> + return comp_refs(ref1, ref2, check_seq);
> +}
> +
> static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
> struct btrfs_delayed_ref_node *ins)
> {
> - struct rb_node **p = &root->rb_root.rb_node;
> struct rb_node *node = &ins->ref_node;
> - struct rb_node *parent_node = NULL;
> - struct btrfs_delayed_ref_node *entry;
> - bool leftmost = true;
> -
> - while (*p) {
> - int comp;
> -
> - parent_node = *p;
> - entry = rb_entry(parent_node, struct btrfs_delayed_ref_node,
> - ref_node);
> - comp = comp_refs(ins, entry, true);
> - if (comp < 0) {
> - p = &(*p)->rb_left;
> - } else if (comp > 0) {
> - p = &(*p)->rb_right;
> - leftmost = false;
> - } else {
> - return entry;
> - }
> - }
> + struct rb_node *exist;
>
> - rb_link_node(node, parent_node, p);
> - rb_insert_color_cached(node, root, leftmost);
> + exist = rb_find_add_cached(node, root, cmp_refs_node);
> + if (exist != NULL)
> + return rb_entry(exist, struct btrfs_delayed_ref_node, ref_node);
> return NULL;
> }
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers
2024-12-12 20:29 ` [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers Roger L. Beckermeyer III
@ 2024-12-13 7:19 ` Qu Wenruo
0 siblings, 0 replies; 54+ messages in thread
From: Qu Wenruo @ 2024-12-13 7:19 UTC (permalink / raw)
To: Roger L. Beckermeyer III; +Cc: linux-btrfs, Josef Bacik
在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
> update fs/btrfs/block-group.c to use rb_find_add_cached()
> implement btrfs_bg_start_cmp() for use with rb_find_add_cached().
>
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> fs/btrfs/block-group.c | 40 +++++++++++++++++-----------------------
> 1 file changed, 17 insertions(+), 23 deletions(-)
>
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index 5be029734cfa..6001b78e9ea9 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -173,40 +173,34 @@ void btrfs_put_block_group(struct btrfs_block_group *cache)
> }
> }
>
> +static int btrfs_bg_start_cmp(struct rb_node *new, const struct rb_node *exist)
> +{
> + struct btrfs_block_group *cmp1 = rb_entry(new, struct btrfs_block_group, cache_node);
> + const struct btrfs_block_group *cmp2 = rb_entry(exist, struct btrfs_block_group, cache_node);
> +
> + if (cmp1->start < cmp2->start)
> + return -1;
> + if (cmp1->start > cmp2->start)
> + return 1;
> + return 0;
> +}
> +
> /*
> * This adds the block group to the fs_info rb tree for the block group cache
> */
> static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
> struct btrfs_block_group *block_group)
> {
> - struct rb_node **p;
> - struct rb_node *parent = NULL;
> - struct btrfs_block_group *cache;
> - bool leftmost = true;
> + struct rb_node *exist;
>
> ASSERT(block_group->length != 0);
>
> write_lock(&info->block_group_cache_lock);
> - p = &info->block_group_cache_tree.rb_root.rb_node;
> -
> - while (*p) {
> - parent = *p;
> - cache = rb_entry(parent, struct btrfs_block_group, cache_node);
> - if (block_group->start < cache->start) {
> - p = &(*p)->rb_left;
> - } else if (block_group->start > cache->start) {
> - p = &(*p)->rb_right;
> - leftmost = false;
> - } else {
> - write_unlock(&info->block_group_cache_lock);
> - return -EEXIST;
> - }
> - }
> -
> - rb_link_node(&block_group->cache_node, parent, p);
> - rb_insert_color_cached(&block_group->cache_node,
> - &info->block_group_cache_tree, leftmost);
>
> + exist = rb_find_add_cached(&block_group->cache_node,
> + &info->block_group_cache_tree, btrfs_bg_start_cmp);
> + if (exist != NULL)
> + return -EEXIST;
If we hit -EEXIST, the block_group_cache_lock is never unlocked.
> write_unlock(&info->block_group_cache_lock);
>
> return 0;
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
` (3 preceding siblings ...)
2024-12-12 16:46 ` Roger L. Beckermeyer III
@ 2024-12-13 7:21 ` Qu Wenruo
2024-12-13 9:05 ` Peter Zijlstra
2024-12-13 9:06 ` Peter Zijlstra
5 siblings, 1 reply; 54+ messages in thread
From: Qu Wenruo @ 2024-12-13 7:21 UTC (permalink / raw)
To: Roger L. Beckermeyer III, dsterba, peterz, oleg, mhiramat,
linux-kernel
Cc: josef, linux-btrfs, lkp
在 2024/12/13 03:16, Roger L. Beckermeyer III 写道:
> Adds rb_find_add_cached() as a helper function for use with
> red-black trees. Used in btrfs to reduce boilerplate code.
I won't call it boilerplate code though, it's just to utilize the cached
rb tree feature as an optimization.
And since rbtree is a tree-wide infrastructure, you need to be more
persuasive to add a new interface.
Yes, btrfs is utilizing this cached rb tree, but since you're adding a
new tree-wide interface, it will be much better to find another
driver/subsystem that can benefit from the new interface.
>
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> ---
> include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
> diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
> index 7c173aa64e1e..0d4444c0cfb3 100644
> --- a/include/linux/rbtree.h
> +++ b/include/linux/rbtree.h
> @@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
> rb_insert_color(node, tree);
> }
>
> +/**
> + * rb_find_add_cached() - find equivalent @node in @tree, or add @node
> + * @node: node to look-for / insert
> + * @tree: tree to search / modify
> + * @cmp: operator defining the node order
> + *
> + * Returns the rb_node matching @node, or NULL when no match is found and @node
> + * is inserted.
> + */
> +static __always_inline struct rb_node *
> +rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
> + int (*cmp)(struct rb_node *, const struct rb_node *))
This function is almost the same as rb_add_cached(), the only difference
is the extra handling for the cmp function returning 0.
So I'm wondering if it's possible to enhance rb_add_cached(), or even
refactor it so there can be a shared core function and rb_add_cached()
and rb_find_add_cached() can reuse the same function.
Thanks,
Qu
> +{
> + bool leftmost = true;
> + struct rb_node **link = &tree->rb_root.rb_node;
> + struct rb_node *parent = NULL;
> + int c;
> +
> + while (*link) {
> + parent = *link;
> + c = cmp(node, parent);
> +
> + if (c < 0) {
> + link = &parent->rb_left;
> + } else if (c > 0) {
> + link = &parent->rb_right;
> + leftmost = false;
> + } else {
> + return parent;
> + }
> + }
> +
> + rb_link_node(node, parent, link);
> + rb_insert_color_cached(node, tree, leftmost);
> + return NULL;
> +}
> +
> /**
> * rb_find_add() - find equivalent @node in @tree, or add @node
> * @node: node to look-for / insert
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-13 6:19 ` Qu Wenruo
@ 2024-12-13 7:30 ` Johannes Thumshirn
2024-12-13 7:32 ` Qu Wenruo
0 siblings, 1 reply; 54+ messages in thread
From: Johannes Thumshirn @ 2024-12-13 7:30 UTC (permalink / raw)
To: WenRuo Qu, Roger L. Beckermeyer III; +Cc: linux-btrfs@vger.kernel.org
On 13.12.24 07:19, Qu Wenruo wrote:
>
>
> 在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
>> update tree_insert() to use rb_find_add_cached().
>> add cmp_refs_node in rb_find_add_cached() to compare.
>>
>> note: I think some of comparison functions could be further refined.
>>
>> V2: incorporated changes from Filipe Manana
>
> Firstly changelog should not be part of the commit message. It should be
> after the "---" line so that git-am will drop it when applying.
>
> Secondly if you're updating a series of patches, please resend the whole
> series and put the change log into the cover letter to explain all the
> changes.
> Updating one patch of a series is only going to make it much harder to
> follow/apply.
>
> And put a version number for the whole series. It can be done by
> git-formatpatch with `--subject="PATCH v2"` option.
Nit: git format-patch -v 2 also gives you a nice v2-XXX.patch prefix for
the files as well as "PATCH v2" for the subject.
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-13 7:30 ` Johannes Thumshirn
@ 2024-12-13 7:32 ` Qu Wenruo
2024-12-13 17:14 ` Lee Beckermeyer
0 siblings, 1 reply; 54+ messages in thread
From: Qu Wenruo @ 2024-12-13 7:32 UTC (permalink / raw)
To: Johannes Thumshirn, Roger L. Beckermeyer III; +Cc: linux-btrfs@vger.kernel.org
在 2024/12/13 18:00, Johannes Thumshirn 写道:
> On 13.12.24 07:19, Qu Wenruo wrote:
>>
>>
>> 在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
>>> update tree_insert() to use rb_find_add_cached().
>>> add cmp_refs_node in rb_find_add_cached() to compare.
>>>
>>> note: I think some of comparison functions could be further refined.
>>>
>>> V2: incorporated changes from Filipe Manana
>>
>> Firstly changelog should not be part of the commit message. It should be
>> after the "---" line so that git-am will drop it when applying.
>>
>> Secondly if you're updating a series of patches, please resend the whole
>> series and put the change log into the cover letter to explain all the
>> changes.
>> Updating one patch of a series is only going to make it much harder to
>> follow/apply.
>>
>> And put a version number for the whole series. It can be done by
>> git-formatpatch with `--subject="PATCH v2"` option.
>
> Nit: git format-patch -v 2 also gives you a nice v2-XXX.patch prefix for
> the files as well as "PATCH v2" for the subject.
Thanks a lot! It saves quite a lot of key strikes, and even added the
"v2-" prefix.
Never too old to learn.
Thanks,
Qu
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-13 7:21 ` Qu Wenruo
@ 2024-12-13 9:05 ` Peter Zijlstra
0 siblings, 0 replies; 54+ messages in thread
From: Peter Zijlstra @ 2024-12-13 9:05 UTC (permalink / raw)
To: Qu Wenruo
Cc: Roger L. Beckermeyer III, dsterba, oleg, mhiramat, linux-kernel,
josef, linux-btrfs, lkp
On Fri, Dec 13, 2024 at 05:51:44PM +1030, Qu Wenruo wrote:
>
>
> 在 2024/12/13 03:16, Roger L. Beckermeyer III 写道:
> > Adds rb_find_add_cached() as a helper function for use with
> > red-black trees. Used in btrfs to reduce boilerplate code.
>
> I won't call it boilerplate code though, it's just to utilize the cached
> rb tree feature as an optimization.
Nah, all this is boilerplate :-)
> >
> > Suggested-by: Josef Bacik <josef@toxicpanda.com>
> > Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> > ---
> > include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 37 insertions(+)
> >
> > diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
> > index 7c173aa64e1e..0d4444c0cfb3 100644
> > --- a/include/linux/rbtree.h
> > +++ b/include/linux/rbtree.h
> > @@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
> > rb_insert_color(node, tree);
> > }
> >
> > +/**
> > + * rb_find_add_cached() - find equivalent @node in @tree, or add @node
> > + * @node: node to look-for / insert
> > + * @tree: tree to search / modify
> > + * @cmp: operator defining the node order
> > + *
> > + * Returns the rb_node matching @node, or NULL when no match is found and @node
> > + * is inserted.
> > + */
> > +static __always_inline struct rb_node *
> > +rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
> > + int (*cmp)(struct rb_node *, const struct rb_node *))
>
> This function is almost the same as rb_add_cached(), the only difference
> is the extra handling for the cmp function returning 0.
>
> So I'm wondering if it's possible to enhance rb_add_cached(), or even
> refactor it so there can be a shared core function and rb_add_cached()
> and rb_find_add_cached() can reuse the same function.
Nope, rb_add_cached() can add multiple entries with the same key,
rb_find_add() cannot.
Also, note that all these things are effectively 'templates', they
generate code at the call site. The cmp() function as required for
find_add() is a tri-state return and generates more logic than the
binary less() required for add().
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
` (4 preceding siblings ...)
2024-12-13 7:21 ` Qu Wenruo
@ 2024-12-13 9:06 ` Peter Zijlstra
2024-12-16 22:13 ` Qu Wenruo
5 siblings, 1 reply; 54+ messages in thread
From: Peter Zijlstra @ 2024-12-13 9:06 UTC (permalink / raw)
To: Roger L. Beckermeyer III
Cc: dsterba, oleg, mhiramat, linux-kernel, josef, linux-btrfs, lkp
On Thu, Dec 12, 2024 at 10:46:18AM -0600, Roger L. Beckermeyer III wrote:
> Adds rb_find_add_cached() as a helper function for use with
> red-black trees. Used in btrfs to reduce boilerplate code.
>
> Suggested-by: Josef Bacik <josef@toxicpanda.com>
> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
> diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
> index 7c173aa64e1e..0d4444c0cfb3 100644
> --- a/include/linux/rbtree.h
> +++ b/include/linux/rbtree.h
> @@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
> rb_insert_color(node, tree);
> }
>
> +/**
> + * rb_find_add_cached() - find equivalent @node in @tree, or add @node
> + * @node: node to look-for / insert
> + * @tree: tree to search / modify
> + * @cmp: operator defining the node order
> + *
> + * Returns the rb_node matching @node, or NULL when no match is found and @node
> + * is inserted.
> + */
> +static __always_inline struct rb_node *
> +rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
> + int (*cmp)(struct rb_node *, const struct rb_node *))
> +{
> + bool leftmost = true;
> + struct rb_node **link = &tree->rb_root.rb_node;
> + struct rb_node *parent = NULL;
> + int c;
> +
> + while (*link) {
> + parent = *link;
> + c = cmp(node, parent);
> +
> + if (c < 0) {
> + link = &parent->rb_left;
> + } else if (c > 0) {
> + link = &parent->rb_right;
> + leftmost = false;
> + } else {
> + return parent;
> + }
> + }
> +
> + rb_link_node(node, parent, link);
> + rb_insert_color_cached(node, tree, leftmost);
> + return NULL;
> +}
> +
> /**
> * rb_find_add() - find equivalent @node in @tree, or add @node
> * @node: node to look-for / insert
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-13 7:32 ` Qu Wenruo
@ 2024-12-13 17:14 ` Lee Beckermeyer
2024-12-13 20:28 ` Qu Wenruo
0 siblings, 1 reply; 54+ messages in thread
From: Lee Beckermeyer @ 2024-12-13 17:14 UTC (permalink / raw)
To: Qu Wenruo; +Cc: Johannes Thumshirn, linux-btrfs@vger.kernel.org
On Fri, Dec 13, 2024 at 1:32 AM Qu Wenruo <wqu@suse.com> wrote:
>
>
>
> 在 2024/12/13 18:00, Johannes Thumshirn 写道:
> > On 13.12.24 07:19, Qu Wenruo wrote:
> >>
> >>
> >> 在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
> >>> update tree_insert() to use rb_find_add_cached().
> >>> add cmp_refs_node in rb_find_add_cached() to compare.
> >>>
> >>> note: I think some of comparison functions could be further refined.
> >>>
> >>> V2: incorporated changes from Filipe Manana
> >>
> >> Firstly changelog should not be part of the commit message. It should be
> >> after the "---" line so that git-am will drop it when applying.
added it to the cover letter this time, also was more thorough in
documenting the changes.
> >>
> >> Secondly if you're updating a series of patches, please resend the whole
> >> series and put the change log into the cover letter to explain all the
> >> changes.
> >> Updating one patch of a series is only going to make it much harder to
> >> follow/apply.
Roger (pun intended) I'll resend the whole patch series once I get a
reply on this, I've been utilizing the help message on the first
message I sent so it all stays the same more or less. Should I not be
doing that when I send a new patch series?
> >>
> >> And put a version number for the whole series. It can be done by
> >> git-formatpatch with `--subject="PATCH v2"` option.
> >
> > Nit: git format-patch -v 2 also gives you a nice v2-XXX.patch prefix for
> > the files as well as "PATCH v2" for the subject.
>
> Thanks a lot! It saves quite a lot of key strikes, and even added the
> "v2-" prefix.
>
> Never too old to learn.
>
> Thanks,
> Qu
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 6/6] btrfs: update tree_insert() to use rb helpers
2024-12-13 17:14 ` Lee Beckermeyer
@ 2024-12-13 20:28 ` Qu Wenruo
0 siblings, 0 replies; 54+ messages in thread
From: Qu Wenruo @ 2024-12-13 20:28 UTC (permalink / raw)
To: Lee Beckermeyer, Qu Wenruo
Cc: Johannes Thumshirn, linux-btrfs@vger.kernel.org
在 2024/12/14 03:44, Lee Beckermeyer 写道:
> On Fri, Dec 13, 2024 at 1:32 AM Qu Wenruo <wqu@suse.com> wrote:
>>
>>
>>
>> 在 2024/12/13 18:00, Johannes Thumshirn 写道:
>>> On 13.12.24 07:19, Qu Wenruo wrote:
>>>>
>>>>
>>>> 在 2024/12/13 06:59, Roger L. Beckermeyer III 写道:
>>>>> update tree_insert() to use rb_find_add_cached().
>>>>> add cmp_refs_node in rb_find_add_cached() to compare.
>>>>>
>>>>> note: I think some of comparison functions could be further refined.
>>>>>
>>>>> V2: incorporated changes from Filipe Manana
>>>>
>>>> Firstly changelog should not be part of the commit message. It should be
>>>> after the "---" line so that git-am will drop it when applying.
> added it to the cover letter this time, also was more thorough in
> documenting the changes.
>>>>
>>>> Secondly if you're updating a series of patches, please resend the whole
>>>> series and put the change log into the cover letter to explain all the
>>>> changes.
>>>> Updating one patch of a series is only going to make it much harder to
>>>> follow/apply.
> Roger (pun intended) I'll resend the whole patch series once I get a
> reply on this, I've been utilizing the help message on the first
> message I sent so it all stays the same more or less.
What do you mean by the "help message"?
> Should I not be
> doing that when I send a new patch series?
>>>>
>>>> And put a version number for the whole series. It can be done by
>>>> git-formatpatch with `--subject="PATCH v2"` option.
>>>
>>> Nit: git format-patch -v 2 also gives you a nice v2-XXX.patch prefix for
>>> the files as well as "PATCH v2" for the subject.
>>
>> Thanks a lot! It saves quite a lot of key strikes, and even added the
>> "v2-" prefix.
>>
>> Never too old to learn.
>>
>> Thanks,
>> Qu
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-13 9:06 ` Peter Zijlstra
@ 2024-12-16 22:13 ` Qu Wenruo
2024-12-16 22:22 ` Peter Zijlstra
0 siblings, 1 reply; 54+ messages in thread
From: Qu Wenruo @ 2024-12-16 22:13 UTC (permalink / raw)
To: Peter Zijlstra, Roger L. Beckermeyer III
Cc: dsterba, oleg, mhiramat, linux-kernel, josef, linux-btrfs, lkp
在 2024/12/13 19:36, Peter Zijlstra 写道:
> On Thu, Dec 12, 2024 at 10:46:18AM -0600, Roger L. Beckermeyer III wrote:
>> Adds rb_find_add_cached() as a helper function for use with
>> red-black trees. Used in btrfs to reduce boilerplate code.
>>
>> Suggested-by: Josef Bacik <josef@toxicpanda.com>
>> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
>
> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
I guess it's fine to merge this change through btrfs tree?
Just curious about the existing cmp() and less() functions, as they only
accept the exist node as const.
I'm wondering if this is intentional to allow the less/cmp() functions
to modify the new node if needed.
As I normally assume such cmp()/less() should never touch any node nor
its entries.
Thanks,
Qu
>
>> ---
>> include/linux/rbtree.h | 37 +++++++++++++++++++++++++++++++++++++
>> 1 file changed, 37 insertions(+)
>>
>> diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
>> index 7c173aa64e1e..0d4444c0cfb3 100644
>> --- a/include/linux/rbtree.h
>> +++ b/include/linux/rbtree.h
>> @@ -210,6 +210,43 @@ rb_add(struct rb_node *node, struct rb_root *tree,
>> rb_insert_color(node, tree);
>> }
>>
>> +/**
>> + * rb_find_add_cached() - find equivalent @node in @tree, or add @node
>> + * @node: node to look-for / insert
>> + * @tree: tree to search / modify
>> + * @cmp: operator defining the node order
>> + *
>> + * Returns the rb_node matching @node, or NULL when no match is found and @node
>> + * is inserted.
>> + */
>> +static __always_inline struct rb_node *
>> +rb_find_add_cached(struct rb_node *node, struct rb_root_cached *tree,
>> + int (*cmp)(struct rb_node *, const struct rb_node *))
>> +{
>> + bool leftmost = true;
>> + struct rb_node **link = &tree->rb_root.rb_node;
>> + struct rb_node *parent = NULL;
>> + int c;
>> +
>> + while (*link) {
>> + parent = *link;
>> + c = cmp(node, parent);
>> +
>> + if (c < 0) {
>> + link = &parent->rb_left;
>> + } else if (c > 0) {
>> + link = &parent->rb_right;
>> + leftmost = false;
>> + } else {
>> + return parent;
>> + }
>> + }
>> +
>> + rb_link_node(node, parent, link);
>> + rb_insert_color_cached(node, tree, leftmost);
>> + return NULL;
>> +}
>> +
>> /**
>> * rb_find_add() - find equivalent @node in @tree, or add @node
>> * @node: node to look-for / insert
>> --
>> 2.45.2
>>
>
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-16 22:13 ` Qu Wenruo
@ 2024-12-16 22:22 ` Peter Zijlstra
2024-12-16 22:40 ` Qu Wenruo
0 siblings, 1 reply; 54+ messages in thread
From: Peter Zijlstra @ 2024-12-16 22:22 UTC (permalink / raw)
To: Qu Wenruo
Cc: Roger L. Beckermeyer III, dsterba, oleg, mhiramat, linux-kernel,
josef, linux-btrfs, lkp
On Tue, Dec 17, 2024 at 08:43:26AM +1030, Qu Wenruo wrote:
>
>
> 在 2024/12/13 19:36, Peter Zijlstra 写道:
> > On Thu, Dec 12, 2024 at 10:46:18AM -0600, Roger L. Beckermeyer III wrote:
> > > Adds rb_find_add_cached() as a helper function for use with
> > > red-black trees. Used in btrfs to reduce boilerplate code.
> > >
> > > Suggested-by: Josef Bacik <josef@toxicpanda.com>
> > > Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
> >
> > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
>
> I guess it's fine to merge this change through btrfs tree?
Yeah, I think so. I don't think there's anything else pending for this
file -- its not touched much.
>
> Just curious about the existing cmp() and less() functions, as they only
> accept the exist node as const.
>
> I'm wondering if this is intentional to allow the less/cmp() functions
> to modify the new node if needed.
> As I normally assume such cmp()/less() should never touch any node nor
> its entries.
Oh yeah, they probably should not. I think it's just because the
callchain as a whole does not have const on the new node (for obvious
raisins), and I failed to put it on for the comparators.
You could add it (and fix up the whole tree) and see if anything comes
apart.
^ permalink raw reply [flat|nested] 54+ messages in thread
* Re: [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h
2024-12-16 22:22 ` Peter Zijlstra
@ 2024-12-16 22:40 ` Qu Wenruo
0 siblings, 0 replies; 54+ messages in thread
From: Qu Wenruo @ 2024-12-16 22:40 UTC (permalink / raw)
To: Peter Zijlstra, Qu Wenruo
Cc: Roger L. Beckermeyer III, dsterba, oleg, mhiramat, linux-kernel,
josef, linux-btrfs, lkp
在 2024/12/17 08:52, Peter Zijlstra 写道:
> On Tue, Dec 17, 2024 at 08:43:26AM +1030, Qu Wenruo wrote:
>>
>>
>> 在 2024/12/13 19:36, Peter Zijlstra 写道:
>>> On Thu, Dec 12, 2024 at 10:46:18AM -0600, Roger L. Beckermeyer III wrote:
>>>> Adds rb_find_add_cached() as a helper function for use with
>>>> red-black trees. Used in btrfs to reduce boilerplate code.
>>>>
>>>> Suggested-by: Josef Bacik <josef@toxicpanda.com>
>>>> Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
>>>
>>> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
>>
>> I guess it's fine to merge this change through btrfs tree?
>
> Yeah, I think so. I don't think there's anything else pending for this
> file -- its not touched much.
>
>>
>> Just curious about the existing cmp() and less() functions, as they only
>> accept the exist node as const.
>>
>> I'm wondering if this is intentional to allow the less/cmp() functions
>> to modify the new node if needed.
>> As I normally assume such cmp()/less() should never touch any node nor
>> its entries.
>
> Oh yeah, they probably should not. I think it's just because the
> callchain as a whole does not have const on the new node (for obvious
> raisins), and I failed to put it on for the comparators.
>
> You could add it (and fix up the whole tree) and see if anything comes
> apart.
>
Thanks for confirming this.
I'll make the cmp() for the new helper to accept all const parameter,
and give a try to do a tree-wide cleanup to make existing cmp/less() to
accept all const parameters. (pretty sure a lot of things will fall
apart though).
Thanks,
Qu
^ permalink raw reply [flat|nested] 54+ messages in thread
end of thread, other threads:[~2024-12-16 22:40 UTC | newest]
Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-08 22:37 [PATCHi 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
2024-12-09 5:05 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
2024-12-09 5:02 ` kernel test robot
2024-12-09 5:06 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
2024-12-09 5:00 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
2024-12-12 1:18 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
2024-12-09 5:05 ` kernel test robot
2024-12-09 5:07 ` kernel test robot
2024-12-08 22:38 ` [PATCH] btrfs: edits tree_insert() " Roger L. Beckermeyer III
2024-12-09 5:04 ` kernel test robot
2024-12-09 5:08 ` kernel test robot
2024-12-09 12:36 ` kernel test robot
2024-12-09 12:46 ` Filipe Manana
2024-12-11 22:17 ` kernel test robot
2024-12-09 6:10 ` [PATCHi 0/6] reduce boilerplate code within btrfs Qu Wenruo
2024-12-09 14:05 ` Josef Bacik
2024-12-10 19:06 ` [PATCH " Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 1/6] rbtree: add rb_find_add_cached() to rbtree.h Roger L. Beckermeyer III
2024-12-10 19:58 ` Johannes Thumshirn
2024-12-11 17:47 ` Roger L. Beckermeyer III
2024-12-11 18:41 ` David Sterba
2024-12-12 16:46 ` Roger L. Beckermeyer III
2024-12-13 7:21 ` Qu Wenruo
2024-12-13 9:05 ` Peter Zijlstra
2024-12-13 9:06 ` Peter Zijlstra
2024-12-16 22:13 ` Qu Wenruo
2024-12-16 22:22 ` Peter Zijlstra
2024-12-16 22:40 ` Qu Wenruo
2024-12-10 19:06 ` [PATCH 2/6] btrfs: edit btrfs_add_block_group_cache() to use rb helper Roger L. Beckermeyer III
2024-12-11 18:45 ` David Sterba
2024-12-11 18:49 ` David Sterba
2024-12-10 19:06 ` [PATCH 3/6] btrfs: edit prelim_ref_insert() to use rb helpers Roger L. Beckermeyer III
2024-12-11 18:47 ` David Sterba
2024-12-10 19:06 ` [PATCH 4/6] btrfs: edit __btrfs_add_delayed_item() to use rb helper Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 5/6] btrfs: edit btrfs_add_chunk_map() to use rb helpers Roger L. Beckermeyer III
2024-12-10 19:06 ` [PATCH 6/6] btrfs: edit tree_insert() " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 0/6] reduce boilerplate code within btrfs Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 2/6] btrfs: update btrfs_add_block_group_cache() to use rb helpers Roger L. Beckermeyer III
2024-12-13 7:19 ` Qu Wenruo
2024-12-12 20:29 ` [PATCH 3/6] btrfs: update prelim_ref_insert() " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 4/6] btrfs: update __btrfs_add_delayed_item() " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 5/6] btrfs: update btrfs_add_chunk_map() " Roger L. Beckermeyer III
2024-12-12 20:29 ` [PATCH 6/6] btrfs: update tree_insert() " Roger L. Beckermeyer III
2024-12-13 6:19 ` Qu Wenruo
2024-12-13 7:30 ` Johannes Thumshirn
2024-12-13 7:32 ` Qu Wenruo
2024-12-13 17:14 ` Lee Beckermeyer
2024-12-13 20:28 ` Qu Wenruo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox