From: Liam R. Howlett Date: Thu, 25 Nov 2021 17:51:19 +0000 (-0500) Subject: maple_tree: Make mas_store_entry() take ma_wr_state X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=dfcc603f1591bb69ebef9e57a9015a1c51c6ea97;p=users%2Fjedix%2Flinux-maple.git maple_tree: Make mas_store_entry() take ma_wr_state Signed-off-by: Liam R. Howlett --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 3278e955430a..093423fedc0a 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -4312,37 +4312,37 @@ slow_path: * * 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; } /* @@ -5131,6 +5131,7 @@ static inline void mas_awalk(struct ma_state *mas, unsigned long size) 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; @@ -5156,7 +5157,7 @@ static inline void mas_fill_gap(struct ma_state *mas, void *entry, mas->min = mas_safe_min(mas, pivots, pslot); mas->node = mn; mas->offset = slot; - mas_store_entry(mas, entry); + mas_store_entry(&wr_mas); } /* @@ -5598,7 +5599,7 @@ void *mas_store(struct ma_state *mas, void *entry) #endif mas_wr_store_setup(&wr_mas); - wr_mas.content = mas_store_entry(mas, entry); + mas_store_entry(&wr_mas); return wr_mas.content; } @@ -5618,7 +5619,7 @@ int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp) 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; @@ -5922,17 +5923,22 @@ EXPORT_SYMBOL_GPL(mas_find); */ 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; @@ -6029,6 +6035,7 @@ int mtree_store_range(struct maple_tree *mt, unsigned long index, 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))) @@ -6039,7 +6046,7 @@ int mtree_store_range(struct maple_tree *mt, unsigned long index, mtree_lock(mt); retry: - mas_store_entry(&mas, entry); + mas_store_entry(&wr_mas); if (mas_nomem(&mas, gfp)) goto retry;