ma_set_alloc_req(ms, slot);
}
-static inline unsigned long ma_get_pivot(const struct maple_node *mn,
- unsigned char slot)
+static inline unsigned long _ma_get_pivot(const struct maple_node *mn,
+ unsigned char slot, enum maple_type type)
{
- enum maple_type type = mt_node_type(mn);
-
switch (type) {
- default:
- case maple_dense:
- return 0;
+ case maple_range_64:
+ case maple_leaf_64:
+ return mt_to_node(mn)->mr64.pivot[slot];
case maple_sparse_6:
return mt_to_node(mn)->ms6.pivot;
case maple_sparse_9:
case maple_range_32:
case maple_leaf_32:
return mt_to_node(mn)->mr32.pivot[slot];
- case maple_range_64:
- case maple_leaf_64:
- return mt_to_node(mn)->mr64.pivot[slot];
+ case maple_dense:
+ default:
+ return 0;
}
}
+static inline unsigned long ma_get_pivot(const struct maple_node *mn,
+ unsigned char slot)
+{
+ return _ma_get_pivot(mn, slot, mt_node_type(mn));
+}
static inline void ma_set_pivot(struct maple_node *mn, unsigned char slot,
unsigned long val)
{
switch (type) {
default:
+ case maple_range_64:
+ case maple_leaf_64:
+ (&mt_to_node(mn)->mr64)->pivot[slot] = val;
+ break;
case maple_dense:
- return;
+ break;
case maple_sparse_6:
mt_to_node(mn)->ms6.pivot = val;
break;
case maple_leaf_32:
mt_to_node(mn)->mr32.pivot[slot] = val;
break;
- case maple_range_64:
- case maple_leaf_64:
- (&mt_to_node(mn)->mr64)->pivot[slot] = val;
- break;
}
return;
}
{
ma_set_pivot(dst, dloc, ma_get_pivot(src, sloc));
}
-static inline void __rcu *ma_get_rcu_slot(const struct maple_node *mn,
- unsigned char slot)
+static inline void __rcu *_ma_get_rcu_slot(const struct maple_node *mn,
+ unsigned char slot, enum maple_type type)
{
- enum maple_type type = mt_node_type(mn);
-
switch (type) {
+ case maple_range_64:
+ case maple_leaf_64:
+ return rcu_dereference(mt_to_node(mn)->mr64.slot[slot]);
default:
case maple_dense:
return rcu_dereference(mt_to_node(mn)->slot[slot]);
case maple_range_32:
case maple_leaf_32:
return rcu_dereference(mt_to_node(mn)->mr32.slot[slot]);
- case maple_range_64:
- case maple_leaf_64:
- return rcu_dereference(mt_to_node(mn)->mr64.slot[slot]);
}
}
+static inline void __rcu *ma_get_rcu_slot(const struct maple_node *mn,
+ unsigned char slot)
+{
+ return _ma_get_rcu_slot(mn, slot, mt_node_type(mn));
+}
static inline void ma_set_rcu_slot(const struct maple_node *mn,
unsigned char slot, void *val)
{
default:
case maple_dense:
RCU_INIT_POINTER(mt_to_node(mn)->slot[slot], val);
+ break;
case maple_sparse_6:
RCU_INIT_POINTER(mt_to_node(mn)->ms6.slot[slot], val);
+ break;
case maple_sparse_9:
RCU_INIT_POINTER(mt_to_node(mn)->ms9.slot[slot], val);
+ break;
case maple_sparse_16:
RCU_INIT_POINTER(mt_to_node(mn)->ms16.slot[slot], val);
+ break;
case maple_sparse_21:
RCU_INIT_POINTER(mt_to_node(mn)->ms21.slot[slot], val);
+ break;
case maple_sparse_32:
RCU_INIT_POINTER(mt_to_node(mn)->ms32.slot[slot], val);
+ break;
case maple_sparse_64:
RCU_INIT_POINTER(mt_to_node(mn)->ms64.slot[slot], val);
+ break;
case maple_range_16:
case maple_leaf_16:
RCU_INIT_POINTER(mt_to_node(mn)->mr16.slot[slot], val);
+ break;
case maple_range_32:
case maple_leaf_32:
RCU_INIT_POINTER(mt_to_node(mn)->mr32.slot[slot], val);
+ break;
case maple_range_64:
case maple_leaf_64:
RCU_INIT_POINTER(mt_to_node(mn)->mr64.slot[slot], val);
+ break;
}
}
static inline void ma_cp_rcu_slot(struct maple_node *dst,
enum maple_type type = mt_node_type(mn);
switch (type) {
+ case maple_range_64:
+ case maple_leaf_64:
+ rcu_assign_pointer(mt_to_node(mn)->mr64.slot[slot], val);
+ break;
default:
case maple_dense:
rcu_assign_pointer(mt_to_node(mn)->slot[slot], val);
+ break;
case maple_sparse_6:
rcu_assign_pointer(mt_to_node(mn)->ms6.slot[slot], val);
+ break;
case maple_sparse_9:
rcu_assign_pointer(mt_to_node(mn)->ms9.slot[slot], val);
+ break;
case maple_sparse_16:
rcu_assign_pointer(mt_to_node(mn)->ms16.slot[slot], val);
+ break;
case maple_sparse_21:
rcu_assign_pointer(mt_to_node(mn)->ms21.slot[slot], val);
+ break;
case maple_sparse_32:
rcu_assign_pointer(mt_to_node(mn)->ms32.slot[slot], val);
+ break;
case maple_sparse_64:
rcu_assign_pointer(mt_to_node(mn)->ms64.slot[slot], val);
+ break;
case maple_range_16:
case maple_leaf_16:
rcu_assign_pointer(mt_to_node(mn)->mr16.slot[slot], val);
+ break;
case maple_range_32:
case maple_leaf_32:
rcu_assign_pointer(mt_to_node(mn)->mr32.slot[slot], val);
- case maple_range_64:
- case maple_leaf_64:
- rcu_assign_pointer(mt_to_node(mn)->mr64.slot[slot], val);
+ break;
}
}
-static void mas_update_limits(struct ma_state *ms, unsigned char slot)
+static void mas_update_limits(struct ma_state *ms, unsigned char slot,
+ enum maple_type type)
{
if (slot >= MAPLE_NODE_SLOTS)
return;
return;
if (ma_is_root(ms->node)) {
- ms->max = mt_node_max(ms->node);
+ ms->max = mt_max[type];
ms->min = 0;
}
if (slot > 0)
- ms->min = ma_get_pivot(ms->node, slot - 1);
+ ms->min = _ma_get_pivot(ms->node, slot - 1, type);
- if (slot < mt_slot_count(ms->node) - 1)
- ms->max = ma_get_pivot(ms->node, slot);
+ if (slot < mt_slots[type] - 1)
+ ms->max = _ma_get_pivot(ms->node, slot, type);
}
static inline void ma_encoded_parent(struct ma_state *mas)
{
slot = mt_parent_slot(parent);
mas->node = mt_mk_node(gparent, mt_parent_enum(parent));
ma_set_slot(mas, slot);
- mas_update_limits(mas, slot);
+ mas_update_limits(mas, slot, mt_parent_enum(parent));
mas->node = ma_get_rcu_slot(gparent, slot);
return;
}
return entry;
}
-unsigned char ma_data_end(const struct maple_node *mn)
+unsigned char ma_data_end(const struct maple_node *mn,
+ const enum maple_type type)
{
unsigned char data_end = 0;
unsigned long last;
for (data_end = 0; data_end < mt_slot_count(mn) - 1; data_end++) {
- last = ma_get_pivot(mn, data_end);
+ last = _ma_get_pivot(mn, data_end, type);
if (last == 0 && data_end > 0)
return data_end - 1;
- if (last == mt_node_max(mn))
+ if (last == mt_max[type])
return data_end - 1;
}
- if (ma_get_rcu_slot(mn, data_end) == NULL)
+ if (_ma_get_rcu_slot(mn, data_end, type) == NULL)
data_end--;
return data_end;
struct maple_node *child;
unsigned char slot;
- unsigned char slot_cnt = mt_slot_count(parent);
+ enum maple_type type = mt_node_type(parent);
+ unsigned char slot_cnt = mt_slots[type];
for (slot = 0; slot < slot_cnt; slot++) {
if (slot != 0 && slot < slot_cnt - 1 &&
- ma_get_pivot(parent, slot) == 0)
+ _ma_get_pivot(parent, slot, type) == 0)
break;
- child = ma_get_rcu_slot(parent, slot);
+ child = _ma_get_rcu_slot(parent, slot, type);
if (child)
mt_set_parent(child, parent, slot);
}
p_slot = mt_parent_slot(mas->node);
ma_encoded_parent(mas);
old_parent = mas->node;
- p_end = ma_data_end(mas->node);
+ ptype = mt_node_type(mas->node);
+ p_end = ma_data_end(mas->node, ptype);
if (p_end >= slot_cnt - 1) {
/* Must split the parent */
split = ma_split(mas, p_slot);
ma_set_slot(mas, p_slot);
}
ptype = mt_node_type(mas->node);
- mas_update_limits(mas, p_slot);
+ mas_update_limits(mas, p_slot, ptype);
mas->node = ma_get_rcu_slot(old_parent, p_slot);
}
if (split < slot_cnt - 1)
pivot = ma_get_pivot(mas->node, split);
else
- pivot = ma_get_pivot(left, split -1);
+ pivot = ma_get_pivot(left, split - 1);
ma_link(left, new_parent, p_slot, pivot, ctype);
static int _ma_insert(struct ma_state *mas, void *entry, unsigned char slot)
{
struct maple_node *p_mn;
- int o_end = ma_data_end(mas->node); // Old end
+ int o_end = ma_data_end(mas->node, mt_node_type(mas->node)); // Old end
int n_end = o_end; // New end
unsigned long max = mas->max;
unsigned long min = mas->min;
slot -= split;
n_end -= split;
- o_end = ma_data_end(mas->node); // Old end is not so old now.
+ o_end -= split;
}
/* Save the node in case we are not appending. */
p_mn = mas->node;
return ret;
}
-static bool mas_search_slots(struct ma_state *ms, unsigned long val)
+static bool mas_search_slots(struct ma_state *ms, unsigned long val,
+ enum maple_type type)
{
- int i = 0;
+ int i;
bool ret = false;
- unsigned char slot_cnt = mt_slot_count(ms->node);
+ unsigned char slot_cnt = mt_slots[type];
unsigned long pivot = 0;
for (i = 0; i < slot_cnt - 1; i++) {
- pivot = ma_get_pivot(ms->node, i);
+ pivot = _ma_get_pivot(ms->node, i, type);
if (i != 0 && pivot == 0) {
ma_set_slot(ms, MAPLE_NODE_SLOTS);
return ret;
i++;
}
- if (ma_get_rcu_slot(ms->node, i))
+ if (_ma_get_rcu_slot(ms->node, i, type))
ret = true;
ma_set_slot(ms, i);
return ret;
}
-bool mas_traverse(struct ma_state *mas)
+bool mas_traverse(struct ma_state *mas, enum maple_type type)
{
unsigned char slot = ma_get_slot(mas);
- mas_update_limits(mas, slot);
- if (mt_is_leaf(mas->node))
+ mas_update_limits(mas, slot, type);
+ if (type < maple_range_16)
return false;
- mas->node = ma_get_rcu_slot(mas->node, slot);
+ mas->node = _ma_get_rcu_slot(mas->node, slot, type);
return true;
}
bool _mas_walk(struct ma_state *mas)
{
mas->node = mas_start(mas);
+ enum maple_type type;
do {
- if (!mas_search_slots(mas, mas->index))
- return mt_is_leaf(mas->node);
- } while (mas_traverse(mas));
+ type = mt_node_type(mas->node);
+ if (!mas_search_slots(mas, mas->index, type))
+ return type < maple_range_16;
+ } while (mas_traverse(mas, type));
return true;
}