Commit a7b92d59 authored by Liam Howlett's avatar Liam Howlett Committed by Andrew Morton

maple_tree: detect dead nodes in mas_start()

When initially starting a search, the root node may already be in the
process of being replaced in RCU mode.  Detect and restart the walk if
this is the case.  This is necessary for RCU mode of the maple tree.

Link: https://lkml.kernel.org/r/20230227173632.3292573-3-surenb@google.com
Fixes: 54a611b6 ("Maple Tree: add new data structure")
Signed-off-by: default avatarLiam Howlett <Liam.Howlett@oracle.com>
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 39d0bd86
...@@ -1360,12 +1360,16 @@ static inline struct maple_enode *mas_start(struct ma_state *mas) ...@@ -1360,12 +1360,16 @@ static inline struct maple_enode *mas_start(struct ma_state *mas)
mas->max = ULONG_MAX; mas->max = ULONG_MAX;
mas->depth = 0; mas->depth = 0;
retry:
root = mas_root(mas); root = mas_root(mas);
/* Tree with nodes */ /* Tree with nodes */
if (likely(xa_is_node(root))) { if (likely(xa_is_node(root))) {
mas->depth = 1; mas->depth = 1;
mas->node = mte_safe_root(root); mas->node = mte_safe_root(root);
mas->offset = 0; mas->offset = 0;
if (mte_dead_node(mas->node))
goto retry;
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment