]> www.infradead.org Git - users/hch/misc.git/commitdiff
maple_tree: memset maple_big_node as a whole
authorWei Yang <richard.weiyang@gmail.com>
Sun, 8 Sep 2024 14:05:54 +0000 (14:05 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 6 Nov 2024 00:56:24 +0000 (16:56 -0800)
In mast_fill_bnode(), we first clear some fields of maple_big_node and set
the 'type' unconditionally before return.  This means we won't leverage
any information in maple_big_node and it is safe to clear the whole
structure.

In maple_big_node, we define slot and padding/gap in a union.  And based
on current definition of MAPLE_BIG_NODE_SLOTS/GAPS, padding is always less
than slot and part of the gap is overlapped by slot.

For example on 64bit system:

  MAPLE_BIG_NODE_SLOT is 34
  MAPLE_BIG_NODE_GAP  is 21

With this knowledge, current code may clear some space by twice. And
this could be avoid by clearing the structure as a whole.

Link: https://lkml.kernel.org/r/20240908140554.20378-3-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Reviewed-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/maple_tree.c

index 04cd5ce2a33ce4167da6896b5698c215a322fcb3..c5987244ff6368d72eb1be320ec3584e9516e80c 100644 (file)
@@ -3157,10 +3157,7 @@ static inline void mast_fill_bnode(struct maple_subtree_state *mast,
        bool cp = true;
        unsigned char split;
 
-       memset(mast->bn->gap, 0, sizeof(unsigned long) * ARRAY_SIZE(mast->bn->gap));
-       memset(mast->bn->slot, 0, sizeof(unsigned long) * ARRAY_SIZE(mast->bn->slot));
-       memset(mast->bn->pivot, 0, sizeof(unsigned long) * ARRAY_SIZE(mast->bn->pivot));
-       mast->bn->b_end = 0;
+       memset(mast->bn, 0, sizeof(struct maple_big_node));
 
        if (mte_is_root(mas->node)) {
                cp = false;