mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
maple_tree: separate ma_state node from status
The maple tree node is overloaded to keep status as well as the active node. This, unfortunately, results in a re-walk on underflow or overflow. Since the maple state has room, the status can be placed in its own enum in the structure. Once an underflow/overflow is detected, certain modes can restore the status to active and others may need to re-walk just that one node to see the entry. The status being an enum has the benefit of detecting unhandled status in switch statements. [Liam.Howlett@oracle.com: fix comments about MAS_*] Link: https://lkml.kernel.org/r/20231106154124.614247-1-Liam.Howlett@oracle.com [Liam.Howlett@oracle.com: update forking to separate maple state and node] Link: https://lkml.kernel.org/r/20231106154551.615042-1-Liam.Howlett@oracle.com [Liam.Howlett@oracle.com: fix mas_prev() state separation code] Link: https://lkml.kernel.org/r/20231207193319.4025462-1-Liam.Howlett@oracle.com Link: https://lkml.kernel.org/r/20231101171629.3612299-9-Liam.Howlett@oracle.com Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com> Cc: Peng Zhang <zhangpeng.00@bytedance.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
271f61a8b4
commit
067311d33e
@ -349,6 +349,36 @@ static inline bool mtree_empty(const struct maple_tree *mt)
|
||||
|
||||
/* Advanced API */
|
||||
|
||||
/*
|
||||
* Maple State Status
|
||||
* ma_active means the maple state is pointing to a node and offset and can
|
||||
* continue operating on the tree.
|
||||
* ma_start means we have not searched the tree.
|
||||
* ma_root means we have searched the tree and the entry we found lives in
|
||||
* the root of the tree (ie it has index 0, length 1 and is the only entry in
|
||||
* the tree).
|
||||
* ma_none means we have searched the tree and there is no node in the
|
||||
* tree for this entry. For example, we searched for index 1 in an empty
|
||||
* tree. Or we have a tree which points to a full leaf node and we
|
||||
* searched for an entry which is larger than can be contained in that
|
||||
* leaf node.
|
||||
* ma_pause means the data within the maple state may be stale, restart the
|
||||
* operation
|
||||
* ma_overflow means the search has reached the upper limit of the search
|
||||
* ma_underflow means the search has reached the lower limit of the search
|
||||
* ma_error means there was an error, check the node for the error number.
|
||||
*/
|
||||
enum maple_status {
|
||||
ma_active,
|
||||
ma_start,
|
||||
ma_root,
|
||||
ma_none,
|
||||
ma_pause,
|
||||
ma_overflow,
|
||||
ma_underflow,
|
||||
ma_error,
|
||||
};
|
||||
|
||||
/*
|
||||
* The maple state is defined in the struct ma_state and is used to keep track
|
||||
* of information during operations, and even between operations when using the
|
||||
@ -381,6 +411,13 @@ static inline bool mtree_empty(const struct maple_tree *mt)
|
||||
* When returning a value the maple state index and last respectively contain
|
||||
* the start and end of the range for the entry. Ranges are inclusive in the
|
||||
* Maple Tree.
|
||||
*
|
||||
* The status of the state is used to determine how the next action should treat
|
||||
* the state. For instance, if the status is ma_start then the next action
|
||||
* should start at the root of the tree and walk down. If the status is
|
||||
* ma_pause then the node may be stale data and should be discarded. If the
|
||||
* status is ma_overflow, then the last action hit the upper limit.
|
||||
*
|
||||
*/
|
||||
struct ma_state {
|
||||
struct maple_tree *tree; /* The tree we're operating in */
|
||||
@ -390,6 +427,7 @@ struct ma_state {
|
||||
unsigned long min; /* The minimum index of this node - implied pivot min */
|
||||
unsigned long max; /* The maximum index of this node - implied pivot max */
|
||||
struct maple_alloc *alloc; /* Allocated nodes for this operation */
|
||||
enum maple_status status; /* The status of the state (active, start, none, etc) */
|
||||
unsigned char depth; /* depth of tree descent during write */
|
||||
unsigned char offset;
|
||||
unsigned char mas_flags;
|
||||
@ -416,28 +454,12 @@ struct ma_wr_state {
|
||||
spin_lock_nested(&((mas)->tree->ma_lock), subclass)
|
||||
#define mas_unlock(mas) spin_unlock(&((mas)->tree->ma_lock))
|
||||
|
||||
|
||||
/*
|
||||
* Special values for ma_state.node.
|
||||
* MAS_START means we have not searched the tree.
|
||||
* MAS_ROOT means we have searched the tree and the entry we found lives in
|
||||
* the root of the tree (ie it has index 0, length 1 and is the only entry in
|
||||
* the tree).
|
||||
* MAS_NONE means we have searched the tree and there is no node in the
|
||||
* tree for this entry. For example, we searched for index 1 in an empty
|
||||
* tree. Or we have a tree which points to a full leaf node and we
|
||||
* searched for an entry which is larger than can be contained in that
|
||||
* leaf node.
|
||||
* MA_ERROR represents an errno. After dropping the lock and attempting
|
||||
* to resolve the error, the walk would have to be restarted from the
|
||||
* top of the tree as the tree may have been modified.
|
||||
*/
|
||||
#define MAS_START ((struct maple_enode *)1UL)
|
||||
#define MAS_ROOT ((struct maple_enode *)5UL)
|
||||
#define MAS_NONE ((struct maple_enode *)9UL)
|
||||
#define MAS_PAUSE ((struct maple_enode *)17UL)
|
||||
#define MAS_OVERFLOW ((struct maple_enode *)33UL)
|
||||
#define MAS_UNDERFLOW ((struct maple_enode *)65UL)
|
||||
#define MA_ERROR(err) \
|
||||
((struct maple_enode *)(((unsigned long)err << 2) | 2UL))
|
||||
|
||||
@ -446,7 +468,8 @@ struct ma_wr_state {
|
||||
.tree = mt, \
|
||||
.index = first, \
|
||||
.last = end, \
|
||||
.node = MAS_START, \
|
||||
.node = NULL, \
|
||||
.status = ma_start, \
|
||||
.min = 0, \
|
||||
.max = ULONG_MAX, \
|
||||
.alloc = NULL, \
|
||||
@ -477,7 +500,6 @@ void *mas_find_range(struct ma_state *mas, unsigned long max);
|
||||
void *mas_find_rev(struct ma_state *mas, unsigned long min);
|
||||
void *mas_find_range_rev(struct ma_state *mas, unsigned long max);
|
||||
int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp);
|
||||
bool mas_is_err(struct ma_state *mas);
|
||||
|
||||
bool mas_nomem(struct ma_state *mas, gfp_t gfp);
|
||||
void mas_pause(struct ma_state *mas);
|
||||
@ -506,28 +528,18 @@ static inline void mas_init(struct ma_state *mas, struct maple_tree *tree,
|
||||
mas->tree = tree;
|
||||
mas->index = mas->last = addr;
|
||||
mas->max = ULONG_MAX;
|
||||
mas->node = MAS_START;
|
||||
mas->status = ma_start;
|
||||
mas->node = NULL;
|
||||
}
|
||||
|
||||
/* Checks if a mas has not found anything */
|
||||
static inline bool mas_is_none(const struct ma_state *mas)
|
||||
{
|
||||
return mas->node == MAS_NONE;
|
||||
}
|
||||
|
||||
/* Checks if a mas has been paused */
|
||||
static inline bool mas_is_paused(const struct ma_state *mas)
|
||||
{
|
||||
return mas->node == MAS_PAUSE;
|
||||
}
|
||||
|
||||
/* Check if the mas is pointing to a node or not */
|
||||
static inline bool mas_is_active(struct ma_state *mas)
|
||||
{
|
||||
if ((unsigned long)mas->node >= MAPLE_RESERVED_RANGE)
|
||||
return true;
|
||||
return mas->status == ma_active;
|
||||
}
|
||||
|
||||
return false;
|
||||
static inline bool mas_is_err(struct ma_state *mas)
|
||||
{
|
||||
return mas->status == ma_error;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -540,9 +552,10 @@ static inline bool mas_is_active(struct ma_state *mas)
|
||||
*
|
||||
* Context: Any context.
|
||||
*/
|
||||
static inline void mas_reset(struct ma_state *mas)
|
||||
static __always_inline void mas_reset(struct ma_state *mas)
|
||||
{
|
||||
mas->node = MAS_START;
|
||||
mas->status = ma_start;
|
||||
mas->node = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -716,7 +729,7 @@ static inline void __mas_set_range(struct ma_state *mas, unsigned long start,
|
||||
static inline
|
||||
void mas_set_range(struct ma_state *mas, unsigned long start, unsigned long last)
|
||||
{
|
||||
mas->node = MAS_START;
|
||||
mas_reset(mas);
|
||||
__mas_set_range(mas, start, last);
|
||||
}
|
||||
|
||||
|
@ -1071,7 +1071,8 @@ struct vma_iterator {
|
||||
.mas = { \
|
||||
.tree = &(__mm)->mm_mt, \
|
||||
.index = __addr, \
|
||||
.node = MAS_START, \
|
||||
.node = NULL, \
|
||||
.status = ma_start, \
|
||||
}, \
|
||||
}
|
||||
|
||||
|
457
lib/maple_tree.c
457
lib/maple_tree.c
File diff suppressed because it is too large
Load Diff
@ -54,6 +54,11 @@ atomic_t maple_tree_tests_passed;
|
||||
#else
|
||||
#define cond_resched() do {} while (0)
|
||||
#endif
|
||||
|
||||
#define mas_is_none(x) ((x)->status == ma_none)
|
||||
#define mas_is_overflow(x) ((x)->status == ma_overflow)
|
||||
#define mas_is_underflow(x) ((x)->status == ma_underflow)
|
||||
|
||||
static int __init mtree_insert_index(struct maple_tree *mt,
|
||||
unsigned long index, gfp_t gfp)
|
||||
{
|
||||
@ -582,7 +587,7 @@ static noinline void __init check_find(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, last != mas.last);
|
||||
|
||||
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
mas.index = ULONG_MAX;
|
||||
mas.last = ULONG_MAX;
|
||||
entry2 = mas_prev(&mas, 0);
|
||||
@ -2178,7 +2183,7 @@ static noinline void __init next_prev_test(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, val != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 5);
|
||||
MT_BUG_ON(mt, mas.node != MAS_UNDERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
mas.index = 0;
|
||||
mas.last = 5;
|
||||
@ -3042,10 +3047,6 @@ static noinline void __init check_empty_area_fill(struct maple_tree *mt)
|
||||
* DNE active active range of NULL
|
||||
*/
|
||||
|
||||
#define mas_active(x) (((x).node != MAS_ROOT) && \
|
||||
((x).node != MAS_START) && \
|
||||
((x).node != MAS_PAUSE) && \
|
||||
((x).node != MAS_NONE))
|
||||
static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
{
|
||||
MA_STATE(mas, mt, 0, 0);
|
||||
@ -3060,7 +3061,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
/* prev: Start -> underflow*/
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.node != MAS_UNDERFLOW);
|
||||
MT_BUG_ON(mt, mas.status != ma_underflow);
|
||||
|
||||
/* prev: Start -> root */
|
||||
mas_set(&mas, 10);
|
||||
@ -3068,7 +3069,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* prev: pause -> root */
|
||||
mas_set(&mas, 10);
|
||||
@ -3077,7 +3078,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* next: start -> none */
|
||||
mas_set(&mas, 0);
|
||||
@ -3085,7 +3086,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* next: start -> none*/
|
||||
mas_set(&mas, 10);
|
||||
@ -3093,7 +3094,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find: start -> root */
|
||||
mas_set(&mas, 0);
|
||||
@ -3101,21 +3102,21 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* find: root -> none */
|
||||
entry = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find: none -> none */
|
||||
entry = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find: start -> none */
|
||||
mas_set(&mas, 10);
|
||||
@ -3123,14 +3124,14 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find_rev: none -> root */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* find_rev: start -> root */
|
||||
mas_set(&mas, 0);
|
||||
@ -3138,21 +3139,21 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* find_rev: root -> none */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find_rev: none -> none */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* find_rev: start -> root */
|
||||
mas_set(&mas, 10);
|
||||
@ -3160,7 +3161,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* walk: start -> none */
|
||||
mas_set(&mas, 10);
|
||||
@ -3168,7 +3169,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* walk: pause -> none*/
|
||||
mas_set(&mas, 10);
|
||||
@ -3177,7 +3178,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* walk: none -> none */
|
||||
mas.index = mas.last = 10;
|
||||
@ -3185,14 +3186,14 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* walk: none -> none */
|
||||
entry = mas_walk(&mas);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* walk: start -> root */
|
||||
mas_set(&mas, 0);
|
||||
@ -3200,7 +3201,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* walk: pause -> root */
|
||||
mas_set(&mas, 0);
|
||||
@ -3209,22 +3210,22 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* walk: none -> root */
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
entry = mas_walk(&mas);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* walk: root -> root */
|
||||
entry = mas_walk(&mas);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
/* walk: root -> none */
|
||||
mas_set(&mas, 10);
|
||||
@ -3232,7 +3233,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 1);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_NONE);
|
||||
MT_BUG_ON(mt, mas.status != ma_none);
|
||||
|
||||
/* walk: none -> root */
|
||||
mas.index = mas.last = 0;
|
||||
@ -3240,7 +3241,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0);
|
||||
MT_BUG_ON(mt, mas.node != MAS_ROOT);
|
||||
MT_BUG_ON(mt, mas.status != ma_root);
|
||||
|
||||
mas_unlock(&mas);
|
||||
|
||||
@ -3258,7 +3259,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next: pause ->active */
|
||||
mas_set(&mas, 0);
|
||||
@ -3267,126 +3268,132 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next: none ->active */
|
||||
mas.index = mas.last = 0;
|
||||
mas.offset = 0;
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next:active ->active */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
/* next:active ->active (spanning limit) */
|
||||
entry = mas_next(&mas, 0x2100);
|
||||
MT_BUG_ON(mt, entry != ptr2);
|
||||
MT_BUG_ON(mt, mas.index != 0x2000);
|
||||
MT_BUG_ON(mt, mas.last != 0x2500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next:active -> active beyond data */
|
||||
/* next:active -> overflow (limit reached) beyond data */
|
||||
entry = mas_next(&mas, 0x2999);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x2501);
|
||||
MT_BUG_ON(mt, mas.last != 0x2fff);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_overflow(&mas));
|
||||
|
||||
/* Continue after last range ends after max */
|
||||
/* next:overflow -> active (limit changed) */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr3);
|
||||
MT_BUG_ON(mt, mas.index != 0x3000);
|
||||
MT_BUG_ON(mt, mas.last != 0x3500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next:active -> active continued */
|
||||
/* next:active -> overflow (limit reached) */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x3501);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
|
||||
/* next:active -> overflow */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x3501);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_OVERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_overflow(&mas));
|
||||
|
||||
/* next:overflow -> overflow */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x3501);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, mas.node != MAS_OVERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_overflow(&mas));
|
||||
|
||||
/* prev:overflow -> active */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr3);
|
||||
MT_BUG_ON(mt, mas.index != 0x3000);
|
||||
MT_BUG_ON(mt, mas.last != 0x3500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* next: none -> active, skip value at location */
|
||||
mas_set(&mas, 0);
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
mas.offset = 0;
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr2);
|
||||
MT_BUG_ON(mt, mas.index != 0x2000);
|
||||
MT_BUG_ON(mt, mas.last != 0x2500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* prev:active ->active */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* prev:active -> active spanning end range */
|
||||
/* prev:active -> underflow (span limit) */
|
||||
mas_next(&mas, ULONG_MAX);
|
||||
entry = mas_prev(&mas, 0x1200);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas)); /* spanning limit */
|
||||
entry = mas_prev(&mas, 0x1200); /* underflow */
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* prev:underflow -> underflow (lower limit) spanning end range */
|
||||
entry = mas_prev(&mas, 0x0100);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0x0FFF);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
|
||||
/* prev:active -> underflow */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0x0FFF);
|
||||
MT_BUG_ON(mt, mas.node != MAS_UNDERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* prev:underflow -> underflow */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0x0FFF);
|
||||
MT_BUG_ON(mt, mas.node != MAS_UNDERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* prev:underflow -> underflow */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0x0FFF);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* next:underflow -> active */
|
||||
entry = mas_next(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* prev:first value -> underflow */
|
||||
entry = mas_prev(&mas, 0x1000);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, mas.node != MAS_UNDERFLOW);
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* find:underflow -> first value */
|
||||
entry = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* prev: pause ->active */
|
||||
mas_set(&mas, 0x3600);
|
||||
@ -3397,21 +3404,21 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr2);
|
||||
MT_BUG_ON(mt, mas.index != 0x2000);
|
||||
MT_BUG_ON(mt, mas.last != 0x2500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* prev:active -> active spanning min */
|
||||
/* prev:active -> underflow spanning min */
|
||||
entry = mas_prev(&mas, 0x1600);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1501);
|
||||
MT_BUG_ON(mt, mas.last != 0x1FFF);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* prev: active ->active, continue */
|
||||
entry = mas_prev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find: start ->active */
|
||||
mas_set(&mas, 0);
|
||||
@ -3419,7 +3426,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find: pause ->active */
|
||||
mas_set(&mas, 0);
|
||||
@ -3428,7 +3435,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find: start ->active on value */;
|
||||
mas_set(&mas, 1200);
|
||||
@ -3436,14 +3443,14 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find:active ->active */
|
||||
entry = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != ptr2);
|
||||
MT_BUG_ON(mt, mas.index != 0x2000);
|
||||
MT_BUG_ON(mt, mas.last != 0x2500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
|
||||
/* find:active -> active (NULL)*/
|
||||
@ -3451,35 +3458,35 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x2501);
|
||||
MT_BUG_ON(mt, mas.last != 0x2FFF);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MAS_BUG_ON(&mas, !mas_is_active(&mas));
|
||||
|
||||
/* find: overflow ->active */
|
||||
entry = mas_find(&mas, 0x5000);
|
||||
MT_BUG_ON(mt, entry != ptr3);
|
||||
MT_BUG_ON(mt, mas.index != 0x3000);
|
||||
MT_BUG_ON(mt, mas.last != 0x3500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find:active -> active (NULL) end*/
|
||||
entry = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x3501);
|
||||
MT_BUG_ON(mt, mas.last != ULONG_MAX);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MAS_BUG_ON(&mas, !mas_is_active(&mas));
|
||||
|
||||
/* find_rev: active (END) ->active */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr3);
|
||||
MT_BUG_ON(mt, mas.index != 0x3000);
|
||||
MT_BUG_ON(mt, mas.last != 0x3500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find_rev:active ->active */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != ptr2);
|
||||
MT_BUG_ON(mt, mas.index != 0x2000);
|
||||
MT_BUG_ON(mt, mas.last != 0x2500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find_rev: pause ->active */
|
||||
mas_pause(&mas);
|
||||
@ -3487,14 +3494,14 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* find_rev:active -> active */
|
||||
/* find_rev:active -> underflow */
|
||||
entry = mas_find_rev(&mas, 0);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0);
|
||||
MT_BUG_ON(mt, mas.last != 0x0FFF);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_underflow(&mas));
|
||||
|
||||
/* find_rev: start ->active */
|
||||
mas_set(&mas, 0x1200);
|
||||
@ -3502,7 +3509,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk start ->active */
|
||||
mas_set(&mas, 0x1200);
|
||||
@ -3510,7 +3517,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk start ->active */
|
||||
mas_set(&mas, 0x1600);
|
||||
@ -3518,7 +3525,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1501);
|
||||
MT_BUG_ON(mt, mas.last != 0x1fff);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk pause ->active */
|
||||
mas_set(&mas, 0x1200);
|
||||
@ -3527,7 +3534,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk pause -> active */
|
||||
mas_set(&mas, 0x1600);
|
||||
@ -3536,25 +3543,25 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1501);
|
||||
MT_BUG_ON(mt, mas.last != 0x1fff);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk none -> active */
|
||||
mas_set(&mas, 0x1200);
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
entry = mas_walk(&mas);
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk none -> active */
|
||||
mas_set(&mas, 0x1600);
|
||||
mas.node = MAS_NONE;
|
||||
mas.status = ma_none;
|
||||
entry = mas_walk(&mas);
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1501);
|
||||
MT_BUG_ON(mt, mas.last != 0x1fff);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk active -> active */
|
||||
mas.index = 0x1200;
|
||||
@ -3564,7 +3571,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != ptr);
|
||||
MT_BUG_ON(mt, mas.index != 0x1000);
|
||||
MT_BUG_ON(mt, mas.last != 0x1500);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
/* mas_walk active -> active */
|
||||
mas.index = 0x1600;
|
||||
@ -3573,7 +3580,7 @@ static noinline void __init check_state_handling(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, entry != NULL);
|
||||
MT_BUG_ON(mt, mas.index != 0x1501);
|
||||
MT_BUG_ON(mt, mas.last != 0x1fff);
|
||||
MT_BUG_ON(mt, !mas_active(mas));
|
||||
MT_BUG_ON(mt, !mas_is_active(&mas));
|
||||
|
||||
mas_unlock(&mas);
|
||||
}
|
||||
|
@ -1163,13 +1163,13 @@ static inline void vma_iter_store(struct vma_iterator *vmi,
|
||||
{
|
||||
|
||||
#if defined(CONFIG_DEBUG_VM_MAPLE_TREE)
|
||||
if (MAS_WARN_ON(&vmi->mas, vmi->mas.node != MAS_START &&
|
||||
if (MAS_WARN_ON(&vmi->mas, vmi->mas.status != ma_start &&
|
||||
vmi->mas.index > vma->vm_start)) {
|
||||
pr_warn("%lx > %lx\n store vma %lx-%lx\n into slot %lx-%lx\n",
|
||||
vmi->mas.index, vma->vm_start, vma->vm_start,
|
||||
vma->vm_end, vmi->mas.index, vmi->mas.last);
|
||||
}
|
||||
if (MAS_WARN_ON(&vmi->mas, vmi->mas.node != MAS_START &&
|
||||
if (MAS_WARN_ON(&vmi->mas, vmi->mas.status != ma_start &&
|
||||
vmi->mas.last < vma->vm_start)) {
|
||||
pr_warn("%lx < %lx\nstore vma %lx-%lx\ninto slot %lx-%lx\n",
|
||||
vmi->mas.last, vma->vm_start, vma->vm_start, vma->vm_end,
|
||||
@ -1177,7 +1177,7 @@ static inline void vma_iter_store(struct vma_iterator *vmi,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (vmi->mas.node != MAS_START &&
|
||||
if (vmi->mas.status != ma_start &&
|
||||
((vmi->mas.index > vma->vm_start) || (vmi->mas.last < vma->vm_start)))
|
||||
vma_iter_invalidate(vmi);
|
||||
|
||||
@ -1188,7 +1188,7 @@ static inline void vma_iter_store(struct vma_iterator *vmi,
|
||||
static inline int vma_iter_store_gfp(struct vma_iterator *vmi,
|
||||
struct vm_area_struct *vma, gfp_t gfp)
|
||||
{
|
||||
if (vmi->mas.node != MAS_START &&
|
||||
if (vmi->mas.status != ma_start &&
|
||||
((vmi->mas.index > vma->vm_start) || (vmi->mas.last < vma->vm_start)))
|
||||
vma_iter_invalidate(vmi);
|
||||
|
||||
|
@ -118,6 +118,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
MT_BUG_ON(mt, mas.alloc == NULL);
|
||||
MT_BUG_ON(mt, mas.alloc->slot[0] == NULL);
|
||||
mas_push_node(&mas, mn);
|
||||
mas_reset(&mas);
|
||||
mas_nomem(&mas, GFP_KERNEL); /* free */
|
||||
mtree_unlock(mt);
|
||||
|
||||
@ -141,7 +142,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
|
||||
mn->parent = ma_parent_ptr(mn);
|
||||
ma_free_rcu(mn);
|
||||
mas.node = MAS_START;
|
||||
mas.status = ma_start;
|
||||
mas_nomem(&mas, GFP_KERNEL);
|
||||
/* Allocate 3 nodes, will fail. */
|
||||
mas_node_count(&mas, 3);
|
||||
@ -158,6 +159,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
/* Ensure we counted 3. */
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != 3);
|
||||
/* Free. */
|
||||
mas_reset(&mas);
|
||||
mas_nomem(&mas, GFP_KERNEL);
|
||||
|
||||
/* Set allocation request to 1. */
|
||||
@ -272,6 +274,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
ma_free_rcu(mn);
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != i - j - 1);
|
||||
}
|
||||
mas_reset(&mas);
|
||||
MT_BUG_ON(mt, mas_nomem(&mas, GFP_KERNEL));
|
||||
|
||||
}
|
||||
@ -294,6 +297,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
smn = smn->slot[0]; /* next. */
|
||||
}
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != total);
|
||||
mas_reset(&mas);
|
||||
mas_nomem(&mas, GFP_KERNEL); /* Free. */
|
||||
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != 0);
|
||||
@ -441,7 +445,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
mas.node = MA_ERROR(-ENOMEM);
|
||||
mas_node_count(&mas, 10); /* Request */
|
||||
mas_nomem(&mas, GFP_KERNEL); /* Fill request */
|
||||
mas.node = MAS_START;
|
||||
mas.status = ma_start;
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != 10);
|
||||
mas_destroy(&mas);
|
||||
|
||||
@ -452,7 +456,7 @@ static noinline void __init check_new_node(struct maple_tree *mt)
|
||||
mas.node = MA_ERROR(-ENOMEM);
|
||||
mas_node_count(&mas, 10 + MAPLE_ALLOC_SLOTS - 1); /* Request */
|
||||
mas_nomem(&mas, GFP_KERNEL); /* Fill request */
|
||||
mas.node = MAS_START;
|
||||
mas.status = ma_start;
|
||||
MT_BUG_ON(mt, mas_allocated(&mas) != 10 + MAPLE_ALLOC_SLOTS - 1);
|
||||
mas_destroy(&mas);
|
||||
|
||||
@ -941,7 +945,7 @@ static inline bool mas_tree_walk(struct ma_state *mas, unsigned long *range_min,
|
||||
|
||||
ret = mas_descend_walk(mas, range_min, range_max);
|
||||
if (unlikely(mte_dead_node(mas->node))) {
|
||||
mas->node = MAS_START;
|
||||
mas->status = ma_start;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
@ -961,10 +965,10 @@ static inline void *mas_range_load(struct ma_state *mas,
|
||||
unsigned long index = mas->index;
|
||||
|
||||
if (mas_is_none(mas) || mas_is_paused(mas))
|
||||
mas->node = MAS_START;
|
||||
mas->status = ma_start;
|
||||
retry:
|
||||
if (mas_tree_walk(mas, range_min, range_max))
|
||||
if (unlikely(mas->node == MAS_ROOT))
|
||||
if (unlikely(mas->status == ma_root))
|
||||
return mas_root(mas);
|
||||
|
||||
if (likely(mas->offset != MAPLE_NODE_SLOTS))
|
||||
@ -35337,7 +35341,7 @@ static void mas_dfs_preorder(struct ma_state *mas)
|
||||
unsigned char end, slot = 0;
|
||||
unsigned long *pivots;
|
||||
|
||||
if (mas->node == MAS_START) {
|
||||
if (mas->status == ma_start) {
|
||||
mas_start(mas);
|
||||
return;
|
||||
}
|
||||
@ -35374,7 +35378,7 @@ static void mas_dfs_preorder(struct ma_state *mas)
|
||||
|
||||
return;
|
||||
done:
|
||||
mas->node = MAS_NONE;
|
||||
mas->status = ma_none;
|
||||
}
|
||||
|
||||
|
||||
@ -35833,7 +35837,7 @@ static noinline void __init check_nomem(struct maple_tree *mt)
|
||||
mas_store(&ms, &ms); /* insert 1 -> &ms, fails. */
|
||||
MT_BUG_ON(mt, ms.node != MA_ERROR(-ENOMEM));
|
||||
mas_nomem(&ms, GFP_KERNEL); /* Node allocated in here. */
|
||||
MT_BUG_ON(mt, ms.node != MAS_START);
|
||||
MT_BUG_ON(mt, ms.status != ma_start);
|
||||
mtree_unlock(mt);
|
||||
MT_BUG_ON(mt, mtree_insert(mt, 2, mt, GFP_KERNEL) != 0);
|
||||
mtree_lock(mt);
|
||||
@ -35952,7 +35956,7 @@ static int __init compare_tree(struct maple_tree *mt_a, struct maple_tree *mt_b)
|
||||
|
||||
if (mas_is_ptr(&mas_a) || mas_is_ptr(&mas_b)) {
|
||||
if (!(mas_is_ptr(&mas_a) && mas_is_ptr(&mas_b))) {
|
||||
pr_err("One is MAS_ROOT and the other is not.\n");
|
||||
pr_err("One is ma_root and the other is not.\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
@ -35961,7 +35965,7 @@ static int __init compare_tree(struct maple_tree *mt_a, struct maple_tree *mt_b)
|
||||
while (!mas_is_none(&mas_a) || !mas_is_none(&mas_b)) {
|
||||
|
||||
if (mas_is_none(&mas_a) || mas_is_none(&mas_b)) {
|
||||
pr_err("One is MAS_NONE and the other is not.\n");
|
||||
pr_err("One is ma_none and the other is not.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user