From: Liam R. Howlett Date: Tue, 26 Aug 2025 15:31:50 +0000 (-0400) Subject: fix new node location X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9103e3768eff82f3cfa7f56d2a8be560e1641026;p=users%2Fjedix%2Flinux-maple.git fix new node location Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index da10281d57c7..a148c5315207 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -2907,12 +2907,17 @@ unsigned long node_copy(struct ma_state *mas, struct maple_node *src, d_pivots = ma_pivots(dst, d_mt) + d_start; s_slots = ma_slots(src, s_mt) + start; s_pivots = ma_pivots(src, s_mt) + start; - memcpy(d_slots, s_slots, size * sizeof(void*)); + memcpy(d_slots, s_slots, size * sizeof(void __rcu*)); if (!ma_is_leaf(d_mt) && s_mt == maple_copy) { struct maple_enode *edst = mt_mk_node(dst, d_mt); - for (int i = 0; i < size; i++) + printk("dst %p d_slots %p %p\n", dst, d_slots, *d_slots); + printk("d_start %u\n", d_start); + for (int i = 0; i < size; i++) { + printk("set slot %u parent\n", i); + printk("d_slots = %p\n", d_slots[i]); mas_set_parent(mas, d_slots[i], edst, i); + } } d_gaps = ma_gaps(dst, d_mt); @@ -3073,7 +3078,7 @@ void spanning_split_dest_setup(struct maple_copy *cp, struct ma_state *mas, } -void spanning_init_cp_src(struct maple_copy *cp) +static inline void spanning_init_cp_src(struct maple_copy *cp) { cp->src[cp->s_count].node = ma_mnode_ptr(cp); cp->src[cp->s_count].mt = maple_copy; @@ -3296,18 +3301,22 @@ static bool spanning_ascend(struct maple_copy *cp, struct ma_state *mas, if (!mt_is_alloc(mas->tree)) mt = maple_range_64; + cp->data = cp->d_count; + cp->s_count = 0; spanning_split_dest_setup(cp, mas, mt); spanning_init_cp_src(cp); - node_copy(mas, cp->src[0].node, 0, cp->d_count, cp->max, maple_copy, + node_copy(mas, cp->src[0].node, 0, cp->data, cp->max, maple_copy, cp->dst[0].node, 0, mt); printk("New root\n"); - BUG_ON(1); + cp->slot[0] = mt_mk_node(cp->dst[0].node, mt); } printk("CONVERGED\n"); cp->dst[0].node->parent = ma_parent_ptr(mas_tree_parent(mas)); while (!mte_is_root(mas->node)) mas_ascend(mas); + printk("parent %p vs %p\n", cp->dst[0].node->parent, mas_mn(mas)->parent); + printk("cp->dst %p cp->slot %p\n", cp->dst[0].node, mte_to_node(cp->slot[0])); return false; } else if (l_wr_mas->mas->node == r_wr_mas->mas->node){ if (cp->d_count == 1) {