return (parent == node);
}
+
+static inline bool ma_dead_pivots(const unsigned long *piv)
+{
+ return (piv == NULL);
+}
+
/*
* mte_dead_node() - check if the @enode is dead.
* @enode: The encoded maple node
static inline unsigned long *ma_pivots(struct maple_node *node,
enum maple_type type)
{
+ if (unlikely(ma_dead_node(node)))
+ return NULL;
+
switch (type) {
case maple_arange_64:
return node->ma64.pivot;
a_type = mas_parent_enum(mas, p_enode);
a_node = mte_parent(p_enode);
a_slot = mte_parent_slot(p_enode);
- pivots = ma_pivots(a_node, a_type);
a_enode = mt_mk_node(a_node, a_type);
+ pivots = ma_pivots(a_node, a_type);
+
+ if (unlikely(ma_dead_pivots(pivots)))
+ return 1;
if (!set_min && a_slot) {
set_min = true;
return ma_meta_end(node, type);
pivots = ma_pivots(node, type);
+ if (unlikely(ma_dead_pivots(pivots)))
+ return 0;
+
offset = mt_pivots[type] - 1;
if (likely(!pivots[offset]))
return ma_meta_end(node, type);
node = mas_mn(mas);
slots = ma_slots(node, mt);
pivots = ma_pivots(node, mt);
+ if (unlikely(ma_dead_pivots(pivots)))
+ return 1;
+
mas->max = pivots[offset];
if (offset)
mas->min = pivots[offset - 1] + 1;
slots = ma_slots(node, mt);
pivots = ma_pivots(node, mt);
offset = ma_data_end(node, mt, pivots, mas->max);
+ if (unlikely(ma_dead_node(node)))
+ return 1;
+
if (offset)
mas->min = pivots[offset - 1] + 1;
node = mas_mn(mas);
mt = mte_node_type(mas->node);
pivots = ma_pivots(node, mt);
+ if (unlikely(ma_dead_pivots(pivots)))
+ return 1;
} while (unlikely(offset == ma_data_end(node, mt, pivots, mas->max)));
slots = ma_slots(node, mt);
mt = mte_node_type(mas->node);
slots = ma_slots(node, mt);
pivots = ma_pivots(node, mt);
+ if (unlikely(ma_dead_pivots(pivots)))
+ return 1;
+
offset = 0;
pivot = pivots[0];
}
return NULL;
}
- pivots = ma_pivots(node, type);
slots = ma_slots(node, type);
- mas->index = mas_safe_min(mas, pivots, mas->offset);
- if (ma_dead_node(node))
+ pivots = ma_pivots(node, type);
+ count = ma_data_end(node, type, pivots, mas->max);
+ if (unlikely(ma_dead_node(node)))
return NULL;
+ mas->index = mas_safe_min(mas, pivots, mas->offset);
+ if (unlikely(ma_dead_node(node)))
+ return NULL;
if (mas->index > max)
return NULL;
slots = ma_slots(mn, mt);
pivots = ma_pivots(mn, mt);
+ if (unlikely(ma_dead_pivots(pivots))) {
+ mas_rewalk(mas, index);
+ goto retry;
+ }
+
if (offset == mt_pivots[mt])
pivot = mas->max;
else
while (likely(!ma_is_leaf(mt))) {
MT_BUG_ON(mas->tree, mte_dead_node(mas->node));
slots = ma_slots(mn, mt);
- pivots = ma_pivots(mn, mt);
- max = pivots[0];
entry = mas_slot(mas, slots, 0);
- if (unlikely(ma_dead_node(mn)))
+ pivots = ma_pivots(mn, mt);
+ if (unlikely(ma_dead_pivots(pivots)))
return NULL;
+ max = pivots[0];
mas->node = entry;
mn = mas_mn(mas);
mt = mte_node_type(mas->node);
if (likely(entry))
return entry;
- pivots = ma_pivots(mn, mt);
- mas->index = pivots[0] + 1;
mas->offset = 1;
entry = mas_slot(mas, slots, 1);
- if (unlikely(ma_dead_node(mn)))
+ pivots = ma_pivots(mn, mt);
+ if (unlikely(ma_dead_pivots(pivots)))
return NULL;
+ mas->index = pivots[0] + 1;
if (mas->index > limit)
goto none;