mirror of https://github.com/torvalds/linux.git
lib/interval_tree: skip the check before go to the right subtree
The interval_tree_subtree_search() holds the loop invariant:
start <= node->ITSUBTREE
Let's say we have a following tree:
node
/ \
left right
So we know node->ITSUBTREE is contributed by one of the following:
* left->ITSUBTREE
* ITLAST(node)
* right->ITSUBTREE
When we come to the right node, we are sure the first two don't
contribute to node->ITSUBTREE and it must be the right node does the
job.
So skip the check before go to the right subtree.
Link: https://lkml.kernel.org/r/20250310074938.26756-7-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michel Lespinasse <michel@lespinasse.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
ccaf3efcee
commit
1981128578
|
|
@ -104,12 +104,8 @@ ITPREFIX ## _subtree_search(ITSTRUCT *node, ITTYPE start, ITTYPE last) \
|
||||||
if (ITSTART(node) <= last) { /* Cond1 */ \
|
if (ITSTART(node) <= last) { /* Cond1 */ \
|
||||||
if (start <= ITLAST(node)) /* Cond2 */ \
|
if (start <= ITLAST(node)) /* Cond2 */ \
|
||||||
return node; /* node is leftmost match */ \
|
return node; /* node is leftmost match */ \
|
||||||
if (node->ITRB.rb_right) { \
|
node = rb_entry(node->ITRB.rb_right, ITSTRUCT, ITRB); \
|
||||||
node = rb_entry(node->ITRB.rb_right, \
|
continue; \
|
||||||
ITSTRUCT, ITRB); \
|
|
||||||
if (start <= node->ITSUBTREE) \
|
|
||||||
continue; \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
return NULL; /* No match */ \
|
return NULL; /* No match */ \
|
||||||
} \
|
} \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue