From: Liam R. Howlett Date: Fri, 23 May 2025 16:16:40 +0000 (-0400) Subject: still failing but differently X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=ec4c782bdd4351661bdd7e686661bc3f7d66746f;p=users%2Fjedix%2Flinux-maple.git still failing but differently Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 884f990f8de8..2076450e20bb 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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);