From: Liam R. Howlett Date: Tue, 13 May 2025 19:02:27 +0000 (-0400) Subject: progress X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f95bd04d9c7d5f4aa4c5b6a378e986d264b48ba6;p=users%2Fjedix%2Flinux-maple.git progress Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 8a59186f1640..3c5b132320c7 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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 {