From: Liam R. Howlett Date: Thu, 13 Aug 2020 00:25:00 +0000 (-0400) Subject: maple_tree: refactor mas_split data splitting X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=20f1468c4a34e6e02cd242274ea78f4a13318c8e;p=users%2Fjedix%2Flinux-maple.git maple_tree: refactor mas_split data splitting Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index a6bd76444f55..dd1ce54fa424 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -2472,14 +2472,33 @@ static inline void mast_split_fill_bnode(struct maple_subtree_state *mast, mast->bn->type = mte_node_type(mas->node); } + +static inline void mast_split_data(struct maple_subtree_state *mast, + struct ma_state *mas) +{ + unsigned char p_slot, mid_split, split = 0; + + split = mab_calc_split(mast->bn, &mid_split); + mab_mas_cp(mast->bn, 0, split, mast->l); + mte_set_pivot(mast->r->node, 0, mast->r->max); + mab_mas_cp(mast->bn, split + 1, mast->bn->b_end, mast->r); + mas_set_slot(mast->l, mte_parent_slot(mas->node)); + mast->l->max = mast->bn->pivot[split]; + mast->r->min = mast->l->max + 1; + if (!mte_is_leaf(mas->node)) { + p_slot = mas_get_slot(mast->orig_l); + mas_set_split_parent(mast->orig_l, mast->l->node, + mast->r->node, &p_slot, split); + mas_set_split_parent(mast->orig_r, mast->l->node, + mast->r->node, &p_slot, split); + } +} static inline int mas_split(struct ma_state *mas, struct maple_big_node *b_node) { struct maple_subtree_state mast; - unsigned char p_slot, split = 0; int height = 0; - unsigned char mid_split; MA_STATE(l_mas, mas->tree, mas->index, mas->last); MA_STATE(r_mas, mas->tree, mas->index, mas->last); @@ -2495,6 +2514,8 @@ static inline int mas_split(struct ma_state *mas, mast.l = &l_mas; mast.r = &r_mas; + mast.orig_l = &prev_l_mas; + mast.orig_r = &prev_r_mas; mast.free = &mat; mast.bn = b_node; @@ -2506,20 +2527,7 @@ static inline int mas_split(struct ma_state *mas, mas_dup_state(&r_mas, mas); l_mas.node = mas_new_ma_node(mas, b_node); r_mas.node = mas_new_ma_node(mas, b_node); - split = mab_calc_split(b_node, &mid_split); - mab_mas_cp(b_node, 0, split, &l_mas); - mte_set_pivot(r_mas.node, 0, r_mas.max); - mab_mas_cp(b_node, split + 1, b_node->b_end, &r_mas); - mas_set_slot(&l_mas, mte_parent_slot(mas->node)); - l_mas.max = b_node->pivot[split]; - r_mas.min = l_mas.max + 1; - if (!mte_is_leaf(mas->node)) { - p_slot = mas_get_slot(&prev_l_mas); - mas_set_split_parent(&prev_l_mas, l_mas.node, - r_mas.node, &p_slot, split); - mas_set_split_parent(&prev_r_mas, l_mas.node, - r_mas.node, &p_slot, split); - } + mast_split_data(&mast, mas); mast_split_fill_bnode(&mast, mas); mas_dup_state(&prev_l_mas, mast.l); mas_dup_state(&prev_r_mas, mast.r);