]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Make mas_store_entry() take ma_wr_state
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 25 Nov 2021 17:51:19 +0000 (12:51 -0500)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 25 Nov 2021 18:44:53 +0000 (13:44 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index 3278e955430a6a3b48cf50962a43b0153687b9c7..093423fedc0aacaeae802915542516e24065d69a 100644 (file)
@@ -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;