maple_tree: don't use MAPLE_ARANGE64_META_MAX to indicate no gap
authorPeng Zhang <zhangpeng.00@bytedance.com>
Tue, 11 Jul 2023 03:54:38 +0000 (11:54 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 18 Aug 2023 17:12:21 +0000 (10:12 -0700)
Patch series "Improve the validation for maple tree and some cleanup", v2.

This patch (of 7):

Do not use a special offset to indicate that there is no gap.  When there
is no gap, offset can point to any valid slots because its gap is 0.

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

index 6e5bd2c..7769270 100644 (file)
 #define MAPLE_NODE_SLOTS       31      /* 256 bytes including ->parent */
 #define MAPLE_RANGE64_SLOTS    16      /* 256 bytes */
 #define MAPLE_ARANGE64_SLOTS   10      /* 240 bytes */
-#define MAPLE_ARANGE64_META_MAX        15      /* Out of range for metadata */
 #define MAPLE_ALLOC_SLOTS      (MAPLE_NODE_SLOTS - 1)
 #else
 /* 32bit sizes */
 #define MAPLE_NODE_SLOTS       63      /* 256 bytes including ->parent */
 #define MAPLE_RANGE64_SLOTS    32      /* 256 bytes */
 #define MAPLE_ARANGE64_SLOTS   21      /* 240 bytes */
-#define MAPLE_ARANGE64_META_MAX        31      /* Out of range for metadata */
 #define MAPLE_ALLOC_SLOTS      (MAPLE_NODE_SLOTS - 2)
 #endif /* defined(CONFIG_64BIT) || defined(BUILD_VDSO32_64) */
 
index 7fad4a7..da2c854 100644 (file)
@@ -1610,8 +1610,6 @@ ma_max_gap(struct maple_node *node, unsigned long *gaps, enum maple_type mt,
  * mas_max_gap() - find the largest gap in a non-leaf node and set the slot.
  * @mas: The maple state.
  *
- * If the metadata gap is set to MAPLE_ARANGE64_META_MAX, there is no gap.
- *
  * Return: The gap value.
  */
 static inline unsigned long mas_max_gap(struct ma_state *mas)
@@ -1628,9 +1626,6 @@ static inline unsigned long mas_max_gap(struct ma_state *mas)
        node = mas_mn(mas);
        MAS_BUG_ON(mas, mt != maple_arange_64);
        offset = ma_meta_gap(node, mt);
-       if (offset == MAPLE_ARANGE64_META_MAX)
-               return 0;
-
        gaps = ma_gaps(node, mt);
        return gaps[offset];
 }
@@ -1662,10 +1657,7 @@ static inline void mas_parent_gap(struct ma_state *mas, unsigned char offset,
 ascend:
        MAS_BUG_ON(mas, pmt != maple_arange_64);
        meta_offset = ma_meta_gap(pnode, pmt);
-       if (meta_offset == MAPLE_ARANGE64_META_MAX)
-               meta_gap = 0;
-       else
-               meta_gap = pgaps[meta_offset];
+       meta_gap = pgaps[meta_offset];
 
        pgaps[offset] = new;
 
@@ -1678,7 +1670,6 @@ ascend:
 
                ma_set_meta_gap(pnode, pmt, offset);
        } else if (new < meta_gap) {
-               meta_offset = 15;
                new = ma_max_gap(pnode, pgaps, pmt, &meta_offset);
                ma_set_meta_gap(pnode, pmt, meta_offset);
        }
@@ -2076,7 +2067,7 @@ static inline void mab_mas_cp(struct maple_big_node *b_node,
        end = j - 1;
        if (likely(!ma_is_leaf(mt) && mt_is_alloc(mas->tree))) {
                unsigned long max_gap = 0;
-               unsigned char offset = 15;
+               unsigned char offset = 0;
 
                gaps = ma_gaps(node, mt);
                do {