]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lib/interval_tree: skip the check before go to the right subtree
authorWei Yang <richard.weiyang@gmail.com>
Mon, 10 Mar 2025 07:49:37 +0000 (07:49 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Mar 2025 19:17:01 +0000 (12:17 -0700)
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>
include/linux/interval_tree_generic.h

index aaa8a0767aa3a512c978d047556af3cee07af66f..1b400f26f63d69cd829b792ca9da9f06d7c6d0f9 100644 (file)
@@ -104,12 +104,8 @@ ITPREFIX ## _subtree_search(ITSTRUCT *node, ITTYPE start, ITTYPE last)           \
                if (ITSTART(node) <= last) {            /* Cond1 */           \
                        if (start <= ITLAST(node))      /* Cond2 */           \
                                return node;    /* node is leftmost match */  \
-                       if (node->ITRB.rb_right) {                            \
-                               node = rb_entry(node->ITRB.rb_right,          \
-                                               ITSTRUCT, ITRB);              \
-                               if (start <= node->ITSUBTREE)                 \
-                                       continue;                             \
-                       }                                                     \
+                       node = rb_entry(node->ITRB.rb_right, ITSTRUCT, ITRB); \
+                       continue;                                             \
                }                                                             \
                return NULL;    /* No match */                                \
        }                                                                     \