From: Liam R. Howlett Date: Sat, 17 May 2025 00:58:12 +0000 (-0400) Subject: still broken on triple split X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=2e6366945f37b2c3774a27496ed40e709ce2e0a7;p=users%2Fjedix%2Flinux-maple.git still broken on triple split Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index a176d8640f1c..884f990f8de8 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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);