{
void *existing = NULL;
- if (mas->index > mas->last)
- goto invalid_range;
+ if (mas->index > mas->last) {
+ mas_set_err(mas, -EINVAL);
+ return NULL;
+ }
existing = _mas_store(mas, entry, true);
- if (mas_is_err(mas))
+ if (unlikely(mas_is_err(mas)))
return existing;
- if (!mte_is_leaf(mas->node)) // spanning store occurred
+ if (unlikely(!mte_is_leaf(mas->node))) // spanning store occurred
mas->node = MAS_START;
return existing;
-
-invalid_range:
- mas_set_err(mas, -EINVAL);
- return NULL;
-
}
int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
retry:
_mas_store(mas, entry, true);
- if (mas_nomem(mas, gfp))
+ if (unlikely(mas_nomem(mas, gfp)))
goto retry;
- if (mas_is_err(mas))
+ if (unlikely(mas_is_err(mas)))
return xa_err(mas->node);
- if (!mte_is_leaf(mas->node)) // spanning store occurred
+ if (unlikely(!mte_is_leaf(mas->node))) // spanning store occurred
mas->node = MAS_START;
return 0;
bool mas_nomem(struct ma_state *mas, gfp_t gfp)
__must_hold(mas->tree->lock)
{
- if (mas->node != MA_ERROR(-ENOMEM)) {
+ if (likely(mas->node != MA_ERROR(-ENOMEM))) {
mas_destroy(mas);
return false;
}