maple_tree: update mt_validate()
authorPeng Zhang <zhangpeng.00@bytedance.com>
Tue, 11 Jul 2023 03:54:42 +0000 (11:54 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 18 Aug 2023 17:12:22 +0000 (10:12 -0700)
Instead of using mas_first_entry() to find the leftmost leaf, use a simple
loop instead.  Remove an unneeded check for root node.  To make the error
message more accurate, check pivots first and then slots, because checking
slots depend on the node limit pivot to break the loop.

Link: https://lkml.kernel.org/r/20230711035444.526-7-zhangpeng.00@bytedance.com
Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/maple_tree.c

index 31ac4f2c4426443fd330bd223834fb8d7f952427..e08ef44926c6f10baa744072b49dd1a41eef7c07 100644 (file)
@@ -7244,21 +7244,20 @@ void mt_validate(struct maple_tree *mt)
        if (!mas_searchable(&mas))
                goto done;
 
-       mas_first_entry(&mas, mas_mn(&mas), ULONG_MAX, mte_node_type(mas.node));
+       while (!mte_is_leaf(mas.node))
+               mas_descend(&mas);
+
        while (!mas_is_none(&mas)) {
                MAS_WARN_ON(&mas, mte_dead_node(mas.node));
-               if (!mte_is_root(mas.node)) {
-                       end = mas_data_end(&mas);
-                       if (MAS_WARN_ON(&mas,
-                                       (end < mt_min_slot_count(mas.node)) &&
-                                       (mas.max != ULONG_MAX))) {
-                               pr_err("Invalid size %u of %p\n", end,
-                                      mas_mn(&mas));
-                       }
+               end = mas_data_end(&mas);
+               if (MAS_WARN_ON(&mas, (end < mt_min_slot_count(mas.node)) &&
+                               (mas.max != ULONG_MAX))) {
+                       pr_err("Invalid size %u of %p\n", end, mas_mn(&mas));
                }
+
                mas_validate_parent_slot(&mas);
-               mas_validate_child_slot(&mas);
                mas_validate_limits(&mas);
+               mas_validate_child_slot(&mas);
                if (mt_is_alloc(mt))
                        mas_validate_gaps(&mas);
                mas_dfs_postorder(&mas, ULONG_MAX);