From: Liam R. Howlett Date: Tue, 27 May 2025 20:13:36 +0000 (-0400) Subject: fix end piv extend mess X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=61c71898a5ecdc7551f23e42417e3b06764dfe29;p=users%2Fjedix%2Flinux-maple.git fix end piv extend mess Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index cb1dc601f470..a24847a677ef 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -5031,37 +5031,46 @@ static void mas_wr_spanning_store(struct ma_wr_state *wr_mas) r_mas = *mas; r_mas.index = r_mas.last; mas_wr_walk_index(&r_wr_mas); + mas_wr_end_piv(&r_wr_mas); + printk("end piv is %lu\n", r_wr_mas.end_piv); if (!wr_mas->entry) { - printk("Check next range for null from %p[%u]\n", r_mas.node, r_mas.offset); - if (mas_next_range(&r_mas, ULONG_MAX)) { - printk("next range is not null\n"); - mas_prev_range(&r_mas, 0); - } else { - printk("next range IS null %p[%u]\n", r_mas.node, r_mas.offset); - r_wr_mas.offset_end = r_mas.offset; - if (r_wr_mas.node != mte_to_node(r_mas.node)) { - printk("new node\n"); - 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); - } - if (r_wr_mas.offset_end == r_mas.end) { - r_mas.last = r_mas.max; + printk("extend end null maybe\n"); + if (!r_wr_mas.slots[r_wr_mas.offset_end]) { + r_mas.last = r_wr_mas.end_piv; + } else if (r_wr_mas.end_piv != ULONG_MAX) { + printk("Check next range for null from %p[%u]\n", r_mas.node, r_mas.offset); + if (mas_next_range(&r_mas, ULONG_MAX)) { + printk("next range is not null\n"); + mas_prev_range(&r_mas, 0); } else { - r_mas.last = r_wr_mas.pivots[r_wr_mas.offset_end]; + printk("next range IS null %p[%u]\n", r_mas.node, r_mas.offset); + r_wr_mas.offset_end = r_mas.offset; + if (r_wr_mas.node != mte_to_node(r_mas.node)) { + printk("new node\n"); + 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); + } + if (r_wr_mas.offset_end == r_mas.end) { + r_mas.last = r_mas.max; + } else { + r_mas.last = r_wr_mas.pivots[r_wr_mas.offset_end]; + } } } } 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); mas_wr_extend_null(wr_mas); - if (unlikely(!mas->index && r_mas.last == ULONG_MAX)) + printk("index %lu last %lu\n", mas->index, r_mas.last); + if (unlikely(!mas->index && r_mas.last == ULONG_MAX)) { + mas->last = ULONG_MAX; return mas_new_root(mas, wr_mas->entry); + } printk("\nwr_mas min %lu write covers %u - %u\n", mas->min, mas->offset, wr_mas->offset_end);