From 20f1468c4a34e6e02cd242274ea78f4a13318c8e Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Wed, 12 Aug 2020 20:25:00 -0400 Subject: [PATCH] maple_tree: refactor mas_split data splitting Signed-off-by: Liam R. Howlett --- lib/maple_tree.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) 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); -- 2.50.1