]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
progress
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 13 May 2025 19:02:27 +0000 (15:02 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 13 May 2025 19:02:27 +0000 (15:02 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index 8a59186f16401bf6b1b0148f867a40a4546d5db1..3c5b132320c7a90c6b0e95f6efe4b2e902a7a841 100644 (file)
@@ -3138,21 +3138,25 @@ void mns_node_part_span_leaf_init(struct ma_node_part *part,
                part->pivots[0] = wr_l->mas->index - 1;
                part->slots[0] = wr_l->content;
                part->size++;
+               printk("part 0 %lu\n", part->pivots[0]);
        }
 
        part->pivots[part->size] = wr_r->mas->last;
        part->slots[part->size] = wr_l->entry;
        part->size++;
+       printk("part 1 %lu\n", part->pivots[part->size-1]);
 
        if (wr_r->end_piv > wr_r->mas->last) {
                part->pivots[part->size] = wr_r->end_piv;
                part->slots[part->size] = src->slots[wr_r->offset_end];
                part->size++;
+               printk("part 2 %lu\n", part->pivots[part->size-1]);
        }
 
        part->skip = wr_r->offset_end - wr_l->mas->offset + wr_l->mas->end + 1;
        part->leaf = true;
-       printk("%s skip %u\n", __func__, part->skip);
+       printk("%s skip %u (%u - %u + %u + 1)\n", __func__, part->skip,
+              wr_r->offset_end, wr_l->mas->offset, wr_l->mas->end);
 }
 static inline
 void mni_node_part_init(struct ma_node_part *part,
@@ -4961,6 +4965,11 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
        mt_dump(mas->tree, mt_dump_dec);
        printk("Storing %lu - %lu -> %p\n", mas->index, mas->last, wr_mas->entry);
 
+       if (mt_is_alloc(mas->tree))
+               sd.is_alloc = true;
+       else
+               sd.is_alloc = false;
+
        /* FIXME: Can this happen? probably not? */
        if (unlikely(!mas->index && mas->last == ULONG_MAX))
                return mas_new_root(mas, wr_mas->entry);
@@ -4969,13 +4978,26 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
        printk("r_wr_mas\n");
        r_mas.index = r_mas.last;
        mas_wr_walk_index(&r_wr_mas);
+       if (!wr_mas->entry && r_mas.offset == r_mas.end) {
+               printk("Check next node for null in slot 0\n");
+               if (mas_next_range(&r_mas, ULONG_MAX)) {
+                       mas_prev_range(&r_mas, 0);
+               } else {
+                       r_wr_mas.offset_end = 0;
+                       r_wr_mas.node = mte_to_node(r_mas.node);
+                       r_wr_mas.type = mte_node_type(r_mas.node);
+                       r_wr_mas.slots = ma_slots(r_wr_mas.node, r_wr_mas.type);
+                       r_wr_mas.pivots = ma_pivots(r_wr_mas.node, r_wr_mas.type);
+               }
+       }
        r_mas.index = r_mas.min;
        r_mas.offset = 0;
        mas_wr_end_piv(&r_wr_mas);
 
        /* Set up left side. */
        mas_wr_walk_index(wr_mas);
-       printk("\nwr_mas %lu\n", mas->min);
+       mas_wr_extend_null(wr_mas);
+       printk("\nwr_mas min %lu write covers %u - %u\n", mas->min, mas->offset, wr_mas->offset_end);
 
 
        printk("At %p and r_mas %p\n", mas_mn(mas), mas_mn(&r_mas));
@@ -4991,6 +5013,7 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
        sd.insert = mas->offset;
        sd.src_ins_end = wr_mas->offset_end + mas->end + 1;
        wr_mas->offset_end = r_wr_mas.offset_end + mas->end + 1;
+       printk("wr_mas offset end is %u\n", wr_mas->offset_end);
        printk("src is %p slots is %p\n", right.node, right.slots);
        mns_node_part_span_leaf_init(&part, wr_mas, &r_wr_mas, &right);
        do {