]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
still failing but differently
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 23 May 2025 16:16:40 +0000 (12:16 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 23 May 2025 16:16:40 +0000 (12:16 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index 884f990f8de8a1ae9cf5a785850a46a455168429..2076450e20bbdce8ceb07c88eae437b9cdee71e0 100644 (file)
@@ -3188,7 +3188,8 @@ void init_mni_from_part(struct ma_node_info *info, struct ma_node_part *part,
 {
        info->node = NULL;
        info->offset = 0;
-       info->new = true;
+       if (!ma_is_leaf(info->type))
+               info->new = true;
        info->end = part->size - 1;
        info->max = part->pivots[info->end];
        info->pivots = part->pivots;
@@ -3553,12 +3554,16 @@ void mns_assemble(struct ma_node_state *states, unsigned char len)
                        s_slots = ns->info->slots + ns->start;
                        if (ns->info->new) {
                                printk("NEW %u: %u-%u\n", i, ns->start, size);
-                               for (int j = 0; j > size; j++) {
+                               for (int j = 0; j < size; j++) {
                                        struct maple_enode *child;
+                                       unsigned char slot;
 
-                                       child = ma_enode_ptr(ns->info->slots[j]);
+                                       slot = ns->start + j;
+                                       child = ma_enode_ptr(ns->info->slots[slot]);
+                                       printk("set parent %p => %p \n", mte_to_node(child),
+                                              ns->dst->node);
                                        mte_set_parent(child, ns->dst->enode,
-                                                      j + ns->dst->offset);
+                                                      slot);
                                }
                        }
                        s_piv = ns->info->pivots + ns->start;
@@ -4948,7 +4953,6 @@ static void dst_finalise(struct ma_node_info *dst, unsigned char count,
        printk("part is %u\n", count);
        part->offset = 0;
        part->leaf = false;
-       part->skip = skip;
 }
 
 static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
@@ -5131,14 +5135,14 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
                mni_node_init(&dst[d], mas_pop_node(mas), left.type);
                printk("new_end %u max is %u\n", sd.new_end, mt_slots[left.type]);
                if (sd.new_end >= 2 * mt_slots[left.type]) {
-                       sd.split = (sd.new_end + 1) / 3;
+                       sd.split = sd.new_end / 3;
                        sd.mid = sd.split * 2;
                        d++;
                        mni_node_init(&dst[d], mas_pop_node(mas), left.type);
                        d++;
                        mni_node_init(&dst[d], mas_pop_node(mas), left.type);
                } else if (sd.new_end > mt_slots[left.type]) {
-                       sd.split = (sd.new_end + 1) / 2;
+                       sd.split = sd.new_end / 2;
                        sd.mid = sd.new_end;
                        d++;
                        mni_node_init(&dst[d], mas_pop_node(mas), left.type);
@@ -5198,15 +5202,33 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
                if (!dst[0].min && dst[0].max == ULONG_MAX) {
                        printk("height reduction\n\n");
                        mas->depth = height;
+                       mas_set_height(mas);
                        left.enode = mas->node;
                        dst[0].node->parent = parent.node->parent;
                        mas->node = dst[0].enode;
-                       mas_set_height(mas);
                        mni_finalise(&dst[0], &sd);
                        goto new_root;
                }
 
                dst_finalise(dst, max_d, &sd, &part, max_s);
+               printk("r_parent %p %u  parent %p %u\n",
+                      r_parent.node, r_parent.insert_off , parent.node, parent.insert_off);
+
+               if (!dst[0].min && dst[max_d].max == ULONG_MAX) {
+                       printk("New Root\n\n");
+                       mas->depth = height + 1;
+                       mas_set_height(mas);
+                       parent.insert_off = 0;
+                       parent.end = part.size - 1;
+                       goto converged;
+               }
+
+               part.skip = r_parent.insert_off - parent.insert_off + 1;
+               if (r_parent.node != parent.node)
+                       part.skip += parent.end;
+
+
+               printk("->Set skip to %u\n", part.skip);
                sd.len = 0;
                sd.offset = 0;
                mni_mas_init(&left, mas);
@@ -5218,14 +5240,13 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
        //sd.new_end = r_mas.end + mas->end - part.skip + 1 + part.size;
        printk("\n\nDone %u vs %u\n",
               mas->end - part.skip + part.size, mt_slots[parent.type]);
-       part.skip = r_parent.insert_off - parent.insert_off + 1;
-       printk("Skip %u\n", part.skip);
        printk("parent end is %u\n", parent.end);
+converged:
        mas_wr_converged(&parent, &new_parent, &part, mas, &sd);
        left.enode = parent.enode;
        mas->node = new_parent.enode;
-       printk("replace %p with %p\n", left.enode, mas->node);
 new_root:
+       printk("replace %p with %p\n", left.enode, mas->node);
        mas_wmb_replace(mas, left.enode);
        mtree_range_walk(mas);
        mt_dump(mas->tree, mt_dump_dec);