static inline unsigned char mas_dead_leaves(struct ma_state *mas, void **slots)
{
struct maple_node *node;
- int slot = 0;
- for (; slot < mt_slot_count(mas->node); slot++) {
- if (!slots[slot])
+ int offset;
+
+ for (offset = 0; offset < mt_slot_count(mas->node); offset++) {
+ if (!slots[offset])
break;
- node = mte_to_node(ma_enode_ptr(slots[slot]));
+
+ node = mte_to_node(slots[offset]);
node->parent = ma_parent_ptr(node);
- slots[slot] = (void *)node;
+ slots[offset] = (void *)node;
}
- return slot;
+
+ return offset;
}
-void **mas_destroy_descend(struct ma_state *mas)
+static inline void **mas_destroy_descend(struct ma_state *mas)
{
void **slots = ma_slots(mte_to_node(mas->node),
mte_node_type(mas->node));
slots = ma_slots(mte_to_node(mas->node),
mte_node_type(mas->node));
}
+
return slots;
}
*/
void mt_destroy_walk(struct rcu_head *head)
{
- unsigned char end, slot = 0;
+ unsigned char end, offset = 0;
void **slots;
struct maple_node *node = container_of(head, struct maple_node, rcu);
struct maple_enode *start;
- MA_STATE(mas, &node->mt, 0, 0);
-
+ struct maple_tree mt = MTREE_INIT(mt, node->ma_flags);
+ MA_STATE(mas, &mt, 0, 0);
if (ma_is_leaf(node->type))
goto free_leaf;
break;
type = mas_parent_enum(&mas, mas.node);
- slot = mte_parent_slot(mas.node);
+ offset = mte_parent_slot(mas.node);
mas.node = mt_mk_node(mte_parent(mas.node), type);
slots = ma_slots(mte_to_node(mas.node), type);
- if ((slot == mt_slots[type] - 1) || !slots[slot + 1])
+ if ((offset == mt_slots[type] - 1) || !slots[offset + 1])
continue;
- mas.node = slots[++slot];
+ mas.node = slots[++offset];
slots = mas_destroy_descend(&mas);
-
}
free_leaf:
kmem_cache_free(maple_node_cache, node);
}
+void mt_dump(const struct maple_tree *mt);
void mte_destroy_walk(struct maple_enode *enode, struct maple_tree *mt)
{
struct maple_node *node = mte_to_node(enode);
node->type = mte_node_type(enode);
- node->mt.ma_flags = mt->ma_flags;
+ node->ma_flags = mt->ma_flags;
mte_set_node_dead(enode);
if (mt_in_rcu(mt))
call_rcu(&node->rcu, mt_destroy_walk);