*
* Return: The contents that was stored at the index.
*/
-static inline void *mas_store_entry(struct ma_state *mas, void *entry)
+static inline void *mas_store_entry(struct ma_wr_state *wr_mas)
{
- MA_WR_STATE(wr_mas, mas, entry);
+ struct ma_state *mas = wr_mas->mas;
- if ((wr_mas.content = mas_start(mas)) ||
+ if ((wr_mas->content = mas_start(mas)) ||
mas_is_none(mas) || mas->node == MAS_ROOT) {
- mas_store_root(mas, entry);
- return wr_mas.content;
+ mas_store_root(mas, wr_mas->entry);
+ return wr_mas->content;
}
- if (!mas_wr_walk(&wr_mas)) {
- mas_spanning_store(&wr_mas);
- return wr_mas.content;
+ if (!mas_wr_walk(wr_mas)) {
+ mas_spanning_store(wr_mas);
+ return wr_mas->content;
}
/* At this point, we are at the leaf node that needs to be altered. */
- wr_mas.offset_end = mas->offset;
- wr_mas.end_piv = wr_mas.r_max;
- mas_wr_end_piv(&wr_mas);
+ wr_mas->offset_end = mas->offset;
+ wr_mas->end_piv = wr_mas->r_max;
+ mas_wr_end_piv(wr_mas);
- if (!entry)
- mas_wr_extend_null(&wr_mas);
+ if (!wr_mas->entry)
+ mas_wr_extend_null(wr_mas);
/* New root for a single pointer */
if (!mas->index && mas->last == ULONG_MAX) {
- mas_new_root(mas, wr_mas.entry);
- return wr_mas.content;
+ mas_new_root(mas, wr_mas->entry);
+ return wr_mas->content;
}
- mas_wr_modify(&wr_mas);
- return wr_mas.content;
+ mas_wr_modify(wr_mas);
+ return wr_mas->content;
}
/*
static inline void mas_fill_gap(struct ma_state *mas, void *entry,
unsigned char slot, unsigned long size, unsigned long *index)
{
+ MA_WR_STATE(wr_mas, mas, entry);
unsigned char pslot = mte_parent_slot(mas->node);
struct maple_enode *mn = mas->node;
unsigned long *pivots;
mas->min = mas_safe_min(mas, pivots, pslot);
mas->node = mn;
mas->offset = slot;
- mas_store_entry(mas, entry);
+ mas_store_entry(&wr_mas);
}
/*
#endif
mas_wr_store_setup(&wr_mas);
- wr_mas.content = mas_store_entry(mas, entry);
+ mas_store_entry(&wr_mas);
return wr_mas.content;
}
mas_wr_store_setup(&wr_mas);
trace_ma_write(__func__, mas, 0, entry);
retry:
- mas_store_entry(mas, entry);
+ mas_store_entry(&wr_mas);
if (unlikely(mas_nomem(mas, gfp)))
goto retry;
*/
void *mas_erase(struct ma_state *mas)
{
- void *entry = NULL;
+ void *entry;
+ MA_WR_STATE(wr_mas, mas, NULL);
if (mas_is_none(mas) || mas_is_paused(mas))
mas->node = MAS_START;
/* Retry unnecessary when holding the write lock. */
entry = mas_state_walk(mas);
+ if (!entry)
+ return NULL;
+
write_retry:
/* Must reset to ensure spanning writes of last slot are detected */
mas_reset(mas);
- mas_store_entry(mas, NULL);
+ mas_wr_store_setup(&wr_mas);
+ mas_store_entry(&wr_mas);
if (mas_nomem(mas, GFP_KERNEL))
goto write_retry;
unsigned long last, void *entry, gfp_t gfp)
{
MA_STATE(mas, mt, index, last);
+ MA_WR_STATE(wr_mas, &mas, entry);
trace_ma_write(__func__, &mas, 0, entry);
if (WARN_ON_ONCE(xa_is_advanced(entry)))
mtree_lock(mt);
retry:
- mas_store_entry(&mas, entry);
+ mas_store_entry(&wr_mas);
if (mas_nomem(&mas, gfp))
goto retry;