]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
still broken on triple split
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Sat, 17 May 2025 00:58:12 +0000 (20:58 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Sat, 17 May 2025 00:58:12 +0000 (20:58 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index a176d8640f1cf0223965430b41b143b1661d3640..884f990f8de8a1ae9cf5a785850a46a455168429 100644 (file)
@@ -3151,6 +3151,8 @@ void mns_node_part_span_leaf_init(struct ma_node_part *part,
                part->slots[part->size] = src->slots[wr_r->offset_end];
                part->size++;
                printk("part 2 %lu\n", part->pivots[part->size-1]);
+       } else {
+               part->skip++;
        }
 
        part->skip = wr_r->offset_end - wr_l->mas->offset + wr_l->mas->end + 1;
@@ -3562,9 +3564,12 @@ void mns_assemble(struct ma_node_state *states, unsigned char len)
                        s_piv = ns->info->pivots + ns->start;
                        s_gap = ns->info->gaps;
                        if (ns->start + size > mt_pivots[ns->info->type]) {
+                               printk("%d\n", __LINE__);
                                piv_overflow = 1;
                                max = ns->info->max;
                        } else {
+                               printk("%d from %u\n", __LINE__, size - 1);
+                               printk("%lu + %lu\n", ns->info->pivots, ns->start);
                                max = s_piv[size - 1];
                        }
                        printk("->max is %lu\n", max);
@@ -4940,6 +4945,7 @@ static void dst_finalise(struct ma_node_info *dst, unsigned char count,
                part->gaps[i] = dst[i].max_gap;
        }
        part->size = count + 1;
+       printk("part is %u\n", count);
        part->offset = 0;
        part->leaf = false;
        part->skip = skip;
@@ -5038,7 +5044,10 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
                 *
                 */
                /* Set up sources (up to 3) + part (always) */
-               sd.new_end = r_mas.end + mas->end - part.skip + 1 + part.size;
+               sd.new_end = mas->end - part.skip + 1 + part.size;
+               if (r_mas.node != mas->node)
+                       sd.new_end += r_mas.end;
+
                printk("\tAt %p and r_mas %p\n", mas_mn(mas), mas_mn(&r_mas));
                printk("new end is %u (%u + %u - %u + 1 + %u)\n", sd.new_end,
                       r_mas.end, mas->end, part.skip, part.size);
@@ -5120,8 +5129,8 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
                printk("Start right at %u end is %u\n", right.offset, right.end);
 
                mni_node_init(&dst[d], mas_pop_node(mas), left.type);
-               printk("new_end %u\n", sd.new_end);
-               if (sd.new_end > 2 * mt_slots[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.mid = sd.split * 2;
                        d++;
@@ -5186,27 +5195,29 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
                printk("\n\n");
                printk("parent is %p d is %u\n", parent.node, d);
                mns_assemble(sd.states, sd.len);
-               if (ma_is_root(parent.node)) {
-                       printk("\n\nNew root\n");
-                       if (!dst[0].min && dst[0].max == ULONG_MAX) {
-                               printk("height reduction\n\n");
-                               mas->depth = height;
-                               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;
-                       }
+               if (!dst[0].min && dst[0].max == ULONG_MAX) {
+                       printk("height reduction\n\n");
+                       mas->depth = height;
+                       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);
                sd.len = 0;
                sd.offset = 0;
-       } while ((parent.node != r_parent.node) &&
-                sd.new_end >= mt_slots[parent.type]);
-
-       printk("\n\nDone\n");
+               mni_mas_init(&left, mas);
+               mni_mas_init(&right, &r_mas);
+               printk("again\n\n");
+       } while ((parent.node != r_parent.node) ||
+                mas->end - part.skip + part.size >= mt_slots[parent.type]);
+
+       //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);