Commit Graph

126 Commits

Author SHA1 Message Date
Nico Pache b94482eba0 maple_tree: add mas_wr_new_end() to calculate new_end accurately
commit c6fc9e4a5c505228032fa645e32341d243d51959
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:43 2023 +0800

    maple_tree: add mas_wr_new_end() to calculate new_end accurately

    The previous new_end calculation is inaccurate, because it assumes that
    two new pivots must be added (this is inaccurate), and sometimes it will
    miss the fast path and enter the slow path.  Add mas_wr_new_end() to
    accurately calculate new_end to make the conditions for entering the fast
    path more accurate.

    Link: https://lkml.kernel.org/r/20230524031247.65949-7-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 9f4d41ab3f maple_tree: make the code symmetrical in mas_wr_extend_null()
commit 8c995a631474a85c656e9237f868e2ddf87910c0
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:42 2023 +0800

    maple_tree: make the code symmetrical in mas_wr_extend_null()

    Just make the code symmetrical to improve readability.

    Link: https://lkml.kernel.org/r/20230524031247.65949-6-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 6b4b0fbbaa maple_tree: simplify mas_is_span_wr()
commit bc147f0f70a3f0ce3f3978d9476a4e894e1aad88
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:41 2023 +0800

    maple_tree: simplify mas_is_span_wr()

    Make the code for detecting spanning writes more concise.

    Link: https://lkml.kernel.org/r/20230524031247.65949-5-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache a81d119700 maple_tree: fix the arguments to __must_hold()
commit 14c4b5ab6a43495d0153958d5fe6c6c6ace49e91
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:40 2023 +0800

    maple_tree: fix the arguments to __must_hold()

    Fix the arguments to __must_hold() to make sparse work.

    Link: https://lkml.kernel.org/r/20230524031247.65949-4-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache dbe52d89cf maple_tree: drop mas_{rev_}alloc() and mas_fill_gap()
commit c2aa6f5328b9c33195c656cd81771d6c2595fac3
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:39 2023 +0800

    maple_tree: drop mas_{rev_}alloc() and mas_fill_gap()

    mas_{rev_}alloc() and mas_fill_gap() are no longer used, delete them.

    Link: https://lkml.kernel.org/r/20230524031247.65949-3-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 5b08bfe1d9 maple_tree: rework mtree_alloc_{range,rrange}()
commit 523716770e63e229dbb6307d663f03d990dfefc5
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed May 24 11:12:38 2023 +0800

    maple_tree: rework mtree_alloc_{range,rrange}()

    Patch series "Clean ups for maple tree", v4.

    Some clean ups, mainly to make the code of maple tree more concise.
    This patchset has passed the self-test.

    This patch (of 10):

    Use mas_empty_area{_rev}() to refactor mtree_alloc_{range,rrange}()

    Link: https://lkml.kernel.org/r/20230524031247.65949-2-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 08c82adcf7 maple_tree: clear up index and last setting in single entry tree
commit 6b23a290611df5312eba08bf5176cbf96a5d81f7
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:41 2023 -0400

    maple_tree: clear up index and last setting in single entry tree

    When there is a single entry tree (range of 0-0 pointing to an entry),
    then ensure the limit is either 0-0 or 1-oo, depending on where the user
    walks.  Ensure the correct node setting as well; either MAS_ROOT or
    MAS_NONE.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-33-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache d8fb49bef7 maple_tree: add mas_prev_range() and mas_find_range_rev interface
commit 6b9e93e0102048e64681c2fa265ae81c221f6c6d
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:40 2023 -0400

    maple_tree: add mas_prev_range() and mas_find_range_rev interface

    Some users of the maple tree may want to move to the previous range
    regardless of the value stored there.  Add this interface as well as the
    'find' variant to support walking to the first value, then iterating over
    the previous ranges.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-32-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache bc3d194fdf maple_tree: remove the parameter entry of mas_preallocate
Conflicts: Drop MM changes as we dont use MT in MM yet
       mm/mmap.c
       mm/nommu.c

commit c5d5546ea06512accc894cd19265c7041a6ac81a
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Tue Jan 10 23:42:11 2023 +0800

    maple_tree: remove the parameter entry of mas_preallocate

    The parameter entry of mas_preallocate is not used, so drop it.

    Link: https://lkml.kernel.org/r/20230110154211.1758562-1-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 40a26e134a maple_tree: introduce mas_prev_slot() interface
commit dd9a85138280d8caef2de6d3e533ee286ca200d6
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:39 2023 -0400

    maple_tree: introduce mas_prev_slot() interface

    Sometimes the user needs to revert to the previous slot, regardless of if
    it is empty or not.  Add an interface to go to the previous slot.

    Since there can't be two consecutive NULLs in the tree, the mas_prev()
    function can be implemented by calling mas_prev_slot() a maximum of 2
    times.  Change the underlying interface to use mas_prev_slot() to align
    the code.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-31-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 1057a4e5e4 maple_tree: relocate mas_rewalk() and mas_rewalk_if_dead()
commit de6e386c060cdb66880882327dc7136bda0b3925
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:38 2023 -0400

    maple_tree: relocate mas_rewalk() and mas_rewalk_if_dead()

    These functions need to move for future use.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-30-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 234c23a866 maple_tree: add mas_next_range() and mas_find_range() interfaces
commit 6169b553195a193c52a675e45a9578f595fe194f
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:37 2023 -0400

    maple_tree: add mas_next_range() and mas_find_range() interfaces

    Some users of the maple tree may want to move to the next range in the
    tree, even if it stores a NULL.  This family of function provides that
    functionality by advancing one slot at a time and returning the result,
    while mas_contiguous() will iterate over the range and stop on
    encountering the first NULL.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-29-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 159a878e09 maple_tree: introduce mas_next_slot() interface
commit fff4a58cc00b3baef860c82d6e5e149f71c79d44
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:36 2023 -0400

    maple_tree: introduce mas_next_slot() interface

    Sometimes, during a tree walk, the user needs the next slot regardless of
    if it is empty or not.  Add an interface to get the next slot.

    Since there are no consecutive NULLs allowed in the tree, the mas_next()
    function can only advance two slots at most.  So use the new
    mas_next_slot() interface to align both implementations.  Use this method
    for mas_find() as well.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-28-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:42 -06:00
Nico Pache 07710eb7cc maple_tree: revise limit checks in mas_empty_area{_rev}()
commit ba9972121ab26a53c917ddb141738aa0e559685e
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:34 2023 -0400

    maple_tree: revise limit checks in mas_empty_area{_rev}()

    Since the maple tree is inclusive in range, ensure that a range of 1 (min
    = max) works for searching for a gap in either direction, and make sure
    the size is at least 1 but not larger than the delta between min and max.

    This commit also updates the testing.  Unfortunately there isn't a way to
    safely update the tests and code without a test failure.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-26-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Suggested-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache f5f5ad015e maple_tree: try harder to keep active node with mas_prev()
commit 39193685d585e573592e58204c445bfc5c3cafb3
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:33 2023 -0400

    maple_tree: try harder to keep active node with mas_prev()

    Keep a reference to the node when possible with mas_prev().  This will
    avoid re-walking the tree.  In keeping a reference to the node, keep the
    last/index accurate to the range being referenced.  This means the limit
    may be within the range, but the range may extend outside of the limit.

    Also fix the single entry tree to respect the range (of 0), or set the
    node to MAS_NONE in the case of shifting beyond 0.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-25-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 1da29985fb maple_tree: try harder to keep active node after mas_next()
commit ca80f610045d3fe57c1b43909c79d0c51badca27
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:32 2023 -0400

    maple_tree: try harder to keep active node after mas_next()

    Clean up the mas_next() call to try and keep a node reference when
    possible.  This will avoid re-walking the tree in most cases.

    Also clean up the single entry tree handling to ensure index/last are
    consistent with what one would expect.  (returning NULL with limit of
    1-oo).

    Link: https://lkml.kernel.org/r/20230518145544.1722059-24-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 4ed5aba52f maple_tree: mas_start() reset depth on dead node
commit d04118605f65929003c2a71229d45fee00207a1b
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:30 2023 -0400

    maple_tree: mas_start() reset depth on dead node

    When a dead node is detected, the depth has already been set to 1 so reset
    it to 0.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-22-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reviewed-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache a3a16df4fa maple_tree: remove unnecessary check from mas_destroy()
commit 23e734ecd97fb0dec1537960040e7ef0d5ef7ae6
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:29 2023 -0400

    maple_tree: remove unnecessary check from mas_destroy()

    mas_destroy currently checks if mas->node is MAS_START prior to calling
    mas_start(), but this is unnecessary as mas_start() will do nothing if the
    node is anything but MAS_START.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-21-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reviewed-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache b2ee9c5aee maple_tree: return error on mte_pivots() out of range
commit acd4de60dd356ffef57149237d9d727325a4f8ef
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:24 2023 -0400

    maple_tree: return error on mte_pivots() out of range

    Rename mte_pivots() to mas_pivots() and pass through the ma_state to set
    the error code to -EIO when the offset is out of range for the node type.
    Change the WARN_ON() to MAS_WARN_ON() to log the maple state.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-16-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reviewed-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache a5ab53db8f maple_tree: use MAS_BUG_ON() prior to calling mas_meta_gap()
commit bec1b51efbe71616742a6290aa6a56def80ba90e
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:23 2023 -0400

    maple_tree: use MAS_BUG_ON() prior to calling mas_meta_gap()

    Replace the call to BUG_ON() in mas_meta_gap() with calls before the
    function call MAS_BUG_ON() to get more information on error condition.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-15-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 0660c3f402 maple_tree: use MAS_WR_BUG_ON() in mas_store_prealloc()
commit 1c414c6a4b232245153a2de90106e0fba62ed78e
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:22 2023 -0400

    maple_tree: use MAS_WR_BUG_ON() in mas_store_prealloc()

    mas_store_prealloc() should never fail, but if it does due to internal
    tree issues then get as much debug information as possible prior to
    crashing the kernel.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-14-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache a612fc2ff7 maple_tree: use MAS_BUG_ON() from mas_topiary_range()
commit 4bbd1748c14ec9c14b9e4b91442e5d27b9833637
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:21 2023 -0400

    maple_tree: use MAS_BUG_ON() from mas_topiary_range()

    In the even of trying to remove data from a leaf node by use of
    mas_topiary_range(), log the maple state.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-13-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 952eb338e9 maple_tree: use MAS_BUG_ON() in mas_set_height()
commit 5950ada963a6e26f318e54f873a4cc5769c1a3da
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:20 2023 -0400

    maple_tree: use MAS_BUG_ON() in mas_set_height()

    Use MAS_BUG_ON() instead of MT_BUG_ON() to get the maple state
    information.  In the unlikely event of a tree height of > 31, try to
    increase the probability of useful information being logged.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-12-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache b0ea7ee023 maple_tree: use MAS_BUG_ON() when setting a leaf node as a parent
commit bf96715eb485dd51bb783502694c3dfc63da923e
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:19 2023 -0400

    maple_tree: use MAS_BUG_ON() when setting a leaf node as a parent

    Use MAS_BUG_ON() to dump the maple state and tree in the unlikely event of
    an issue.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-11-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache ac9c1fe32d maple_tree: convert debug code to use MT_WARN_ON() and MAS_WARN_ON()
commit e6d6792a5c5156c60e9e4fea7d3bd5c5fec4d872
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Thu May 18 10:55:18 2023 -0400

    maple_tree: convert debug code to use MT_WARN_ON() and MAS_WARN_ON()

    Using MT_WARN_ON() allows for the removal of if statements before logging.
    Using MAS_WARN_ON() will provide more information when issues are
    encountered.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-10-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 0e8b783924 maple_tree: convert BUG_ON() to MT_BUG_ON()
commit 0d7c52bb29302bf06e6774f4d6494e942213205e
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Thu May 18 10:55:16 2023 -0400

    maple_tree: convert BUG_ON() to MT_BUG_ON()

    Use MT_BUG_ON() to get more information when running with MAPLE_TREE_DEBUG
    enabled.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-8-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:41 -06:00
Nico Pache 0e87b34114 maple_tree: add debug BUG_ON and WARN_ON variants
commit f0a1f866aba1ca62ef6f17d1c441eba65f2d6845
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:15 2023 -0400

    maple_tree: add debug BUG_ON and WARN_ON variants

    Add debug macros to dump the maple state and/or the tree for both warning
    and bug_on calls.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-7-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache e5893a811d maple_tree: add format option to mt_dump()
Conflicts: drop MM folder changes as we dont use MT in MM yet
       mm/internal.h
       mm/mmap.c

commit 89f499f35c11af61ba7075ddc23209d10805a25a
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Thu May 18 10:55:14 2023 -0400

    maple_tree: add format option to mt_dump()

    Allow different formatting strings to be used when dumping the tree.
    Currently supports hex and decimal.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-6-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 31068a4121 maple_tree: clean up mas_dfs_postorder()
commit c3eb787e88e486eefcfafbf990df32c75018ca92
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:13 2023 -0400

    maple_tree: clean up mas_dfs_postorder()

    Convert loop type to ensure all variables are set to make the compiler
    happy, and use the mas_is_none() function instead of explicitly checking
    the node in the maple state.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-5-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 531659172c maple_tree: avoid unnecessary ascending
commit 633769c9267fadadffd31e27655bf028538238ad
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:12 2023 -0400

    maple_tree: avoid unnecessary ascending

    The maple tree node limits are implied by the parent.  When walking up the
    tree, the limit may not be known until a slot that does not have implied
    limits are encountered.  However, if the node is the left-most or
    right-most node, the walking up to find that limit can be skipped.

    This commit also fixes the debug/testing code that was not setting the
    limit on walking down the tree as that optimization is not compatible with
    this change.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-4-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reviewed-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache b5fd31d8b6 maple_tree: clean up mas_parent_enum() and rename to mas_parent_type()
commit afc754c651b87093cd3293954f09fae589402fb0
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Thu May 18 10:55:11 2023 -0400

    maple_tree: clean up mas_parent_enum() and rename to mas_parent_type()

    mas_parent_enum() is a simple wrapper for mte_parent_enum() which is only
    called from that wrapper.  Remove the wrapper and inline mte_parent_enum()
    into mas_parent_enum().

    At the same time, clean up the bit masking of the root pointer since it
    cannot be set by the time the bit masking occurs.  Change the check on the
    root bit to a WARN_ON(), and fix the verification code to not trigger the
    WARN_ON() before checking if the node is root.

    Align the name to mas_parent_type() since mas_node_type() exists already.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-3-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Wei Yang <richard.weiyang@gmail.com>
    Reviewed-by: Wei Yang <richard.weiyang@gmail.com>
    Cc: David Binderman <dcb314@hotmail.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache aed01778d2 maple_tree: fix static analyser cppcheck issue
commit 5729e06c819184b7ba40869c1ad53e1a463040b2
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Thu May 18 10:55:10 2023 -0400

    maple_tree: fix static analyser cppcheck issue

    Patch series "Maple tree mas_{next,prev}_range() and cleanup", v4.

    This patchset contains a number of clean ups to the code to make it more
    usable (next/prev range), the addition of debug output formatting, the
    addition of printing the maple state information in the WARN_ON/BUG_ON
    code.

    There is also work done here to keep nodes active during iterations to
    reduce the necessity of re-walking the tree.

    Finally, there is a new interface added to move to the next or previous
    range in the tree, even if it is empty.

    The organisation of the patches is as follows:

    0001-0004 - Small clean ups
    0005-0018 - Additional debug options and WARN_ON/BUG_ON changes
    0019      - Test module __init and __exit addition
    0020-0021 - More functional clean ups
    0022-0026 - Changes to keep nodes active
    0027-0034 - Add new mas_{prev,next}_range()
    0035      - Use new mas_{prev,next}_range() in mmap_region()

    This patch (of 35):

    Static analyser of the maple tree code noticed that the split variable is
    being used to dereference into an array prior to checking the variable
    itself.  Fix this issue by changing the order of the statement to check
    the variable first.

    Link: https://lkml.kernel.org/r/20230518145544.1722059-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20230518145544.1722059-2-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: David Binderman <dcb314@hotmail.com>
    Reviewed-by: Peng Zhang<zhangpeng.00@bytedance.com>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache c3943e3c15 maple_tree: fix potential out-of-bounds access in mas_wr_end_piv()
commit cd00dd2585c4158e81fdfac0bbcc0446afbad26d
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Sat May 6 10:47:52 2023 +0800

    maple_tree: fix potential out-of-bounds access in mas_wr_end_piv()

    Check the write offset end bounds before using it as the offset into the
    pivot array.  This avoids a possible out-of-bounds access on the pivot
    array if the write extends to the last slot in the node, in which case the
    node maximum should be used as the end pivot.

    akpm: this doesn't affect any current callers, but new users of mapletree
    may encounter this problem if backported into earlier kernels, so let's
    fix it in -stable kernels in case of this.

    Link: https://lkml.kernel.org/r/20230506024752.2550-1-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache fb4a393483 maple_tree: make maple state reusable after mas_empty_area()
commit 0257d9908d38c0b1669af4bb1bc4dbca1f273fe6
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Fri May 5 22:58:29 2023 +0800

    maple_tree: make maple state reusable after mas_empty_area()

    Make mas->min and mas->max point to a node range instead of a leaf entry
    range.  This allows mas to still be usable after mas_empty_area() returns.
    Users would get unexpected results from other operations on the maple
    state after calling the affected function.

    For example, x86 MAP_32BIT mmap() acts as if there is no suitable gap when
    there should be one.

    Link: https://lkml.kernel.org/r/20230505145829.74574-1-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reported-by: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
    Reported-by: Tad <support@spotco.us>
    Reported-by: Michael Keyes <mgkeyes@vigovproductions.net>
      Link: https://lore.kernel.org/linux-mm/32f156ba80010fd97dbaf0a0cdfc84366608624d.camel@intel.com/
      Link: https://lore.kernel.org/linux-mm/e6108286ac025c268964a7ead3aab9899f9bc6e9.camel@spotco.us/
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Tested-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 91048e281c maple_tree: fix allocation in mas_sparse_area()
commit 29ad6bb313487370f9dfe5441fc8982593b6384e
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Wed Apr 19 17:36:25 2023 +0800

    maple_tree: fix allocation in mas_sparse_area()

    In the case of reverse allocation, mas->index and mas->last do not point
    to the correct allocation range, which will cause users to get incorrect
    allocation results, so fix it.  If the user does not use it in a specific
    way, this bug will not be triggered.

    This is a bug, but only VMA uses it now, the way VMA is used now will
    not trigger it.  There is a possibility that a user will trigger it in
    the future.

    Also re-check whether the size is still satisfied after the lower bound
    was increased, which is a corner case and is incorrect in previous
    versions.

    Link: https://lkml.kernel.org/r/20230419093625.99201-1-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: Liam R. Howlett <Liam.Howlett@Oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 978daf0dde maple_tree: use correct variable type in sizeof
commit fb20e99a74f8f08c53061e0186d0c26d546dc843
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Tue Apr 11 10:35:13 2023 +0800

    maple_tree: use correct variable type in sizeof

    The type of variable pointed to by pivs is unsigned long, but the type
    used in sizeof is a pointer type.  Change it to unsigned long.

    This change has no runtime effect, as sizeof(ul) == sizeof(ul *).

    Link: https://lkml.kernel.org/r/20230411023513.15227-1-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reported-by: David Binderman <dcb314@hotmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 7d0311b092 maple_tree: simplify mas_wr_node_walk()
commit 97f7e09481f312b143db53cadbdfe81abac97e73
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Tue Mar 14 20:42:02 2023 +0800

    maple_tree: simplify mas_wr_node_walk()

    Simplify code of mas_wr_node_walk() without changing functionality, and
    improve readability.  Remove some special judgments.  Instead of
    dynamically recording the min and max in the loop, get the final min and
    max directly at the end.

    Link: https://lkml.kernel.org/r/20230314124203.91572-3-zhangpeng.00@bytedance.com
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache ceac949293 maple_tree: export symbol mas_preallocate()
commit 5c63a7c32a94a7e2fecdd6754a6ff47cd4226ee1
Author: Danilo Krummrich <dakr@redhat.com>
Date:   Thu Mar 2 02:10:35 2023 +0100

    maple_tree: export symbol mas_preallocate()

    Fix missing EXPORT_SYMBOL_GPL() statement for mas_preallocate().

    It isn't actually used by anything yet, but mas_preallocate() is part of
    the maple tree's 'Advanced API'.  All other functions of this API are
    exported already.

    Link: https://lkml.kernel.org/r/20230302011035.4928-1-dakr@redhat.com
    Signed-off-by: Danilo Krummrich <dakr@redhat.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>

    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache da9941764a maple_tree: fix mas_empty_area() search
commit 06e8fd999334bcd76b4d72d7b9206d4aea89764e
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Fri Apr 14 10:57:27 2023 -0400

    maple_tree: fix mas_empty_area() search

    The internal function of mas_awalk() was incorrectly skipping the last
    entry in a node, which could potentially be NULL.  This is only a problem
    for the left-most node in the tree - otherwise that NULL would not exist.

    Fix mas_awalk() by using the metadata to obtain the end of the node for
    the loop and the logical pivot as apposed to the raw pivot value.

    Link: https://lkml.kernel.org/r/20230414145728.4067069-2-Liam.Howlett@oracle.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 5776ff1172 maple_tree: make maple state reusable after mas_empty_area_rev()
commit fad8e4291da5e3243e086622df63cb952db444d8
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Fri Apr 14 10:57:26 2023 -0400

    maple_tree: make maple state reusable after mas_empty_area_rev()

    Stop using maple state min/max for the range by passing through pointers
    for those values.  This will allow the maple state to be reused without
    resetting.

    Also add some logic to fail out early on searching with invalid
    arguments.

    Link: https://lkml.kernel.org/r/20230414145728.4067069-1-Liam.Howlett@oracle.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache c7aad4ccde maple_tree: fix a potential memory leak, OOB access, or other unpredictable bug
commit 1f5f12ece722aacea1769fb644f27790ede339dc
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Tue Apr 11 12:10:04 2023 +0800

    maple_tree: fix a potential memory leak, OOB access, or other unpredictable bug

    In mas_alloc_nodes(), "node->node_count = 0" means to initialize the
    node_count field of the new node, but the node may not be a new node.  It
    may be a node that existed before and node_count has a value, setting it
    to 0 will cause a memory leak.  At this time, mas->alloc->total will be
    greater than the actual number of nodes in the linked list, which may
    cause many other errors.  For example, out-of-bounds access in
    mas_pop_node(), and mas_pop_node() may return addresses that should not be
    used.  Fix it by initializing node_count only for new nodes.

    Also, by the way, an if-else statement was removed to simplify the code.

    Link: https://lkml.kernel.org/r/20230411041005.26205-1-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 36b93029c8 maple_tree: fix a potential concurrency bug in RCU mode
commit c45ea315a602d45569b08b93e9ab30f6a63a38aa
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Tue Mar 14 20:42:03 2023 +0800

    maple_tree: fix a potential concurrency bug in RCU mode

    There is a concurrency bug that may cause the wrong value to be loaded
    when a CPU is modifying the maple tree.

    CPU1:
    mtree_insert_range()
      mas_insert()
        mas_store_root()
          ...
          mas_root_expand()
            ...
            rcu_assign_pointer(mas->tree->ma_root, mte_mk_root(mas->node));
            ma_set_meta(node, maple_leaf_64, 0, slot);    <---IP

    CPU2:
    mtree_load()
      mtree_lookup_walk()
        ma_data_end();

    When CPU1 is about to execute the instruction pointed to by IP, the
    ma_data_end() executed by CPU2 may return the wrong end position, which
    will cause the value loaded by mtree_load() to be wrong.

    An example of triggering the bug:

    Add mdelay(100) between rcu_assign_pointer() and ma_set_meta() in
    mas_root_expand().

    static DEFINE_MTREE(tree);
    int work(void *p) {
            unsigned long val;
            for (int i = 0 ; i< 30; ++i) {
                    val = (unsigned long)mtree_load(&tree, 8);
                    mdelay(5);
                    pr_info("%lu",val);
            }
            return 0;
    }

    mt_init_flags(&tree, MT_FLAGS_USE_RCU);
    mtree_insert(&tree, 0, (void*)12345, GFP_KERNEL);
    run_thread(work)
    mtree_insert(&tree, 1, (void*)56789, GFP_KERNEL);

    In RCU mode, mtree_load() should always return the value before or after
    the data structure is modified, and in this example mtree_load(&tree, 8)
    may return 56789 which is not expected, it should always return NULL.  Fix
    it by put ma_set_meta() before rcu_assign_pointer().

    Link: https://lkml.kernel.org/r/20230314124203.91572-4-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 58006a7b21 maple_tree: fix get wrong data_end in mtree_lookup_walk()
commit ec07967d7523adb3670f9dfee0232e3bc868f3de
Author: Peng Zhang <zhangpeng.00@bytedance.com>
Date:   Tue Mar 14 20:42:01 2023 +0800

    maple_tree: fix get wrong data_end in mtree_lookup_walk()

    if (likely(offset > end))
            max = pivots[offset];

    The above code should be changed to if (likely(offset < end)), which is
    correct.  This affects the correctness of ma_data_end().  Now it seems
    that the final result will not be wrong, but it is best to change it.
    This patch does not change the code as above, because it simplifies the
    code by the way.

    Link: https://lkml.kernel.org/r/20230314124203.91572-1-zhangpeng.00@bytedance.com
    Link: https://lkml.kernel.org/r/20230314124203.91572-2-zhangpeng.00@bytedance.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:40 -06:00
Nico Pache 25d9d56d94 maple_tree: add RCU lock checking to rcu callback functions
commit 790e1fa86b340c2bd4a327e01c161f7a1ad885f6
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:06 2023 -0800

    maple_tree: add RCU lock checking to rcu callback functions

    Dereferencing RCU objects within the RCU callback without the RCU check
    has caused lockdep to complain.  Fix the RCU dereferencing by using the
    RCU callback lock to ensure the operation is safe.

    Also stop creating a new lock to use for dereferencing during destruction
    of the tree or subtree.  Instead, pass through a pointer to the tree that
    has the lock that is held for RCU dereferencing checking.  It also does
    not make sense to use the maple state in the freeing scenario as the tree
    walk is a special case where the tree no longer has the normal encodings
    and parent pointers.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-8-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache 4d80905602 maple_tree: add smp_rmb() to dead node detection
commit 0a2b18d948838e16912b3b627b504ab062b7d02a
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:05 2023 -0800

    maple_tree: add smp_rmb() to dead node detection

    Add an smp_rmb() before reading the parent pointer to ensure that anything
    read from the node prior to the parent pointer hasn't been reordered ahead
    of this check.

    The is necessary for RCU mode.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-7-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache de2aa551da maple_tree: fix write memory barrier of nodes once dead for RCU mode
commit c13af03de46ba27674dd9fb31a17c0d480081139
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:04 2023 -0800

    maple_tree: fix write memory barrier of nodes once dead for RCU mode

    During the development of the maple tree, the strategy of freeing multiple
    nodes changed and, in the process, the pivots were reused to store
    pointers to dead nodes.  To ensure the readers see accurate pivots, the
    writers need to mark the nodes as dead and call smp_wmb() to ensure any
    readers can identify the node as dead before using the pivot values.

    There were two places where the old method of marking the node as dead
    without smp_wmb() were being used, which resulted in RCU readers seeing
    the wrong pivot value before seeing the node was dead.  Fix this race
    condition by using mte_set_node_dead() which has the smp_wmb() call to
    ensure the race is closed.

    Add a WARN_ON() to the ma_free_rcu() call to ensure all nodes being freed
    are marked as dead to ensure there are no other call paths besides the two
    updated paths.

    This is necessary for the RCU mode of the maple tree.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-6-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache 0352de0955 maple_tree: remove extra smp_wmb() from mas_dead_leaves()
commit 8372f4d83f96f35915106093cde4565836587123
Author: Liam Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:03 2023 -0800

    maple_tree: remove extra smp_wmb() from mas_dead_leaves()

    The call to mte_set_dead_node() before the smp_wmb() already calls
    smp_wmb() so this is not needed.  This is an optimization for the RCU mode
    of the maple tree.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-5-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache aa34bf9592 maple_tree: fix freeing of nodes in rcu mode
commit 2e5b4921f8efc9e845f4f04741797d16f36847eb
Author: Liam Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:02 2023 -0800

    maple_tree: fix freeing of nodes in rcu mode

    The walk to destroy the nodes was not always setting the node type and
    would result in a destroy method potentially using the values as nodes.
    Avoid this by setting the correct node types.  This is necessary for the
    RCU mode of the maple tree.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-4-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache a7cd1878f0 maple_tree: detect dead nodes in mas_start()
commit a7b92d59c885018cb7bb88539892278e4fd64b29
Author: Liam Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:01 2023 -0800

    maple_tree: detect dead nodes in mas_start()

    When initially starting a search, the root node may already be in the
    process of being replaced in RCU mode.  Detect and restart the walk if
    this is the case.  This is necessary for RCU mode of the maple tree.

    Link: https://lkml.kernel.org/r/20230227173632.3292573-3-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache 813b466e03 maple_tree: be more cautious about dead nodes
commit 39d0bd86c499ecd6abae42a9b7112056c5560691
Author: Liam Howlett <Liam.Howlett@oracle.com>
Date:   Mon Feb 27 09:36:00 2023 -0800

    maple_tree: be more cautious about dead nodes

    Patch series "Fix VMA tree modification under mmap read lock".

    Syzbot reported a BUG_ON in mm/mmap.c which was found to be caused by an
    inconsistency between threads walking the VMA maple tree.  The
    inconsistency is caused by the page fault handler modifying the maple tree
    while holding the mmap_lock for read.

    This only happens for stack VMAs.  We had thought this was safe as it only
    modifies a single pivot in the tree.  Unfortunately, syzbot constructed a
    test case where the stack had no guard page and grew the stack to abut the
    next VMA.  This causes us to delete the NULL entry between the two VMAs
    and rewrite the node.

    We considered several options for fixing this, including dropping the
    mmap_lock, then reacquiring it for write; and relaxing the definition of
    the tree to permit a zero-length NULL entry in the node.  We decided the
    best option was to backport some of the RCU patches from -next, which
    solve the problem by allocating a new node and RCU-freeing the old node.
    Since the problem exists in 6.1, we preferred a solution which is similar
    to the one we intended to merge next merge window.

    These patches have been in -next since next-20230301, and have received
    intensive testing in Android as part of the RCU page fault patchset.  They
    were also sent as part of the "Per-VMA locks" v4 patch series.  Patches 1
    to 7 are bug fixes for RCU mode of the tree and patch 8 enables RCU mode
    for the tree.

    Performance v6.3-rc3 vs patched v6.3-rc3: Running these changes through
    mmtests showed there was a 15-20% performance decrease in
    will-it-scale/brk1-processes.  This tests creating and inserting a single
    VMA repeatedly through the brk interface and isn't representative of any
    real world applications.

    This patch (of 8):

    ma_pivots() and ma_data_end() may be called with a dead node.  Ensure to
    that the node isn't dead before using the returned values.

    This is necessary for RCU mode of the maple tree.

    Link: https://lkml.kernel.org/r/20230327185532.2354250-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20230227173632.3292573-1-surenb@google.com
    Link: https://lkml.kernel.org/r/20230227173632.3292573-2-surenb@google.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Arjun Roy <arjunroy@google.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Chris Li <chriscli@google.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: freak07 <michalechner92@googlemail.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Joel Fernandes <joelaf@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Kent Overstreet <kent.overstreet@linux.dev>
    Cc: Laurent Dufour <ldufour@linux.ibm.com>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Minchan Kim <minchan@google.com>
    Cc: Paul E. McKenney <paulmck@kernel.org>
    Cc: Peter Oskolkov <posk@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Punit Agrawal <punit.agrawal@bytedance.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Soheil Hassas Yeganeh <soheil@google.com>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Will Deacon <will@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache acfd3aca57 maple_tree: fix mas_skip_node() end slot detection
commit 0fa99fdfe1b38da396d0b2d1496a823bcd0ebea0
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Tue Mar 7 13:02:46 2023 -0500

    maple_tree: fix mas_skip_node() end slot detection

    Patch series "Fix mas_skip_node() for mas_empty_area()", v2.

    mas_empty_area() was incorrectly returning an error when there was room.
    The issue was tracked down to mas_skip_node() using the incorrect
    end-of-slot count.  Instead of using the nodes hard limit, the limit of
    data should be used.

    mas_skip_node() was also setting the min and max to that of the child
    node, which was unnecessary.  Within these limits being set, there was
    also a bug that corrupted the maple state's max if the offset was set to
    the maximum node pivot.  The bug was without consequence unless there was
    a sufficient gap in the next child node which would cause an error to be
    returned.

    This patch set fixes these errors by removing the limit setting from
    mas_skip_node() and uses the mas_data_end() for slot limits, and adds
    tests for all failures discovered.

    This patch (of 2):

    mas_skip_node() is used to move the maple state to the node with a higher
    limit.  It does this by walking up the tree and increasing the slot count.
    Since slot count may not be able to be increased, it may need to walk up
    multiple times to find room to walk right to a higher limit node.  The
    limit of slots that was being used was the node limit and not the last
    location of data in the node.  This would cause the maple state to be
    shifted outside actual data and enter an error state, thus returning
    -EBUSY.

    The result of the incorrect error state means that mas_awalk() would
    return an error instead of finding the allocation space.

    The fix is to use mas_data_end() in mas_skip_node() to detect the nodes
    data end point and continue walking the tree up until it is safe to move
    to a node with a higher limit.

    The walk up the tree also sets the maple state limits so remove the buggy
    code from mas_skip_node().  Setting the limits had the unfortunate side
    effect of triggering another bug if the parent node was full and the there
    was no suitable gap in the second last child, but room in the next child.

    mas_skip_node() may also be passed a maple state in an error state from
    mas_anode_descend() when no allocations are available.  Return on such an
    error state immediately.

    Link: https://lkml.kernel.org/r/20230307180247.2220303-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20230307180247.2220303-2-Liam.Howlett@oracle.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Snild Dolkow <snild@sony.com>
      Link: https://lore.kernel.org/linux-mm/cb8dc31a-fef2-1d09-f133-e9f7b9f9e77a@sony.com/
    Tested-by: Snild Dolkow <snild@sony.com>
    Cc: Peng Zhang <zhangpeng.00@bytedance.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

JIRA: https://issues.redhat.com/browse/RHEL-5595
Signed-off-by: Nico Pache <npache@redhat.com>
2023-09-26 10:23:39 -06:00
Nico Pache 76246a2e26 maple_tree: reduce stack usage with gcc-9 and earlier
commit 44081c77e8a4aac9c5a010ed0d9ccdcf684041e1
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Tue Feb 14 11:30:24 2023 +0100

    maple_tree: reduce stack usage with gcc-9 and earlier

    gcc-10 changed the way inlining works to be less aggressive, but older
    versions run into an oversized stack frame warning whenever
    CONFIG_KASAN_STACK is enabled, as that forces variables from inlined
    callees to be non-overlapping:

    lib/maple_tree.c: In function 'mas_wr_bnode':
    lib/maple_tree.c:4320:1: error: the frame size of 1424 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]

    Change the annotations on mas_store_b_node() and mas_commit_b_node()
    to explicitly forbid inlining in this configuration, which is
    the same behavior that newer versions already have.

    Link: https://lkml.kernel.org/r/20230214103030.1051950-1-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Vernon Yang <vernon2gm@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 26dc7386c3 maple_tree: fix mas_prev() and mas_find() state handling
commit 17dc622c7b0f94e49bed030726df4db12ecaa6b5
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Fri Jan 20 11:26:07 2023 -0500

    maple_tree: fix mas_prev() and mas_find() state handling

    When mas_prev() does not find anything, set the state to MAS_NONE.

    Handle the MAS_NONE in mas_find() like a MAS_START.

    Link: https://lkml.kernel.org/r/20230120162650.984577-7-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: <syzbot+502859d610c661e56545@syzkaller.appspotmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache e525e59fb2 maple_tree: fix handle of invalidated state in mas_wr_store_setup()
commit 1202700c3f8cc5f7e4646c3cf05ee6f7c8bc6ccf
Author: Liam R. Howlett <Liam.Howlett@oracle.com>
Date:   Fri Jan 20 11:26:06 2023 -0500

    maple_tree: fix handle of invalidated state in mas_wr_store_setup()

    If an invalidated maple state is encountered during write, reset the maple
    state to MAS_START.  This will result in a re-walk of the tree to the
    correct location for the write.

    Link: https://lore.kernel.org/all/20230107020126.1627-1-sj@kernel.org/
    Link: https://lkml.kernel.org/r/20230120162650.984577-6-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: SeongJae Park <sj@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache e741f086cc maple_tree: reduce user error potential
commit 50e81c82ad947045c7ed26ddc9acb17276b653b6
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Fri Jan 20 11:26:04 2023 -0500

    maple_tree: reduce user error potential

    When iterating, a user may operate on the tree and cause the maple state
    to be altered and left in an unintuitive state.  Detect this scenario and
    correct it by setting to the limit and invalidating the state.

    Link: https://lkml.kernel.org/r/20230120162650.984577-4-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 7b544d6c1a maple_tree: fix potential rcu issue
commit 65be6f058b0eba98dc6c6f197ea9f62c9b6a519f
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Fri Jan 20 11:26:03 2023 -0500

    maple_tree: fix potential rcu issue

    Ensure the node isn't dead after reading the node end.

    Link: https://lkml.kernel.org/r/20230120162650.984577-3-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 81d5cb47c5 maple_tree: fix comment of mte_destroy_walk
commit f942b0f0528d1198b94b8211c84d4f28a654c0ff
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Jan 11 21:53:48 2023 +0800

    maple_tree: fix comment of mte_destroy_walk

    The parameter name of maple tree is mt, make the comment be mt instead of
    mn, and the separator between the parameter name and the description to be
    : instead of -.

    Link: https://lkml.kernel.org/r/20230111135348.803181-1-vernon2gm@gmail.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 26f9be1361 maple_tree: remove GFP_ZERO from kmem_cache_alloc() and kmem_cache_alloc_bulk()
commit 541e06b772c1aaffb3b6a245ccface36d7107af2
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Thu Jan 5 16:05:34 2023 +0000

    maple_tree: remove GFP_ZERO from kmem_cache_alloc() and kmem_cache_alloc_bulk()

    Preallocations are common in the VMA code to avoid allocating under
    certain locking conditions.  The preallocations must also cover the
    worst-case scenario.  Removing the GFP_ZERO flag from the
    kmem_cache_alloc() (and bulk variant) calls will reduce the amount of time
    spent zeroing memory that may not be used.  Only zero out the necessary
    area to keep track of the allocations in the maple state.  Zero the entire
    node prior to using it in the tree.

    This required internal changes to node counting on allocation, so the test
    code is also updated.

    This restores some micro-benchmark performance: up to +9% in mmtests mmap1
    by my testing +10% to +20% in mmap, mmapaddr, mmapmany tests reported by
    Red Hat

    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2149636
    Link: https://lkml.kernel.org/r/20230105160427.2988454-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam Howlett <Liam.Howlett@oracle.com>
    Reported-by: Jirka Hladky <jhladky@redhat.com>
    Suggested-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 8aa254f7ff maple_tree: refine mab_calc_split function
commit e11cb683b2ebc6699bc0ca200442f1b80a51553f
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:58 2022 +0800

    maple_tree: refine mab_calc_split function

    Invert the conditional judgment of the mid_split, to focus the return
    statement in the last statement, which is easier to understand and for
    better readability.

    Link: https://lkml.kernel.org/r/20221221060058.609003-8-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 5b3c6152a1 maple_tree: refine ma_state init from mas_start()
commit 46b345848261009477552d654cb2f65000c30e4d
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:57 2022 +0800

    maple_tree: refine ma_state init from mas_start()

    If mas->node is an MAS_START, there are three cases, and they all assign
    different values to mas->node and mas->offset.  So there is no need to set
    them to a default value before updating.

    Update them directly to make them easier to understand and for better
    readability.

    Link: https://lkml.kernel.org/r/20221221060058.609003-7-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache 4449b23e5b maple_tree: use macro MA_ROOT_PARENT instead of number
commit 84fd3e1ee395649ac45b7317d44c10b33d0dca79
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:55 2022 +0800

    maple_tree: use macro MA_ROOT_PARENT instead of number

    When you need to compare whether node->parent is parent of the
    root node, using macro MA_ROOT_PARENT is easier to understand
    and for better readability.

    Link: https://lkml.kernel.org/r/20221221060058.609003-5-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache c2d198f6a5 maple_tree: use mt_node_max() instead of direct operations mt_max[]
commit bd592703b81a95473f6a01fe731beccd0992236e
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:54 2022 +0800

    maple_tree: use mt_node_max() instead of direct operations mt_max[]

    Use mt_node_max() to get the maximum number of slots for a node,
    rather than direct operations mt_max[], makes it better portability.

    Link: https://lkml.kernel.org/r/20221221060058.609003-4-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:57 -07:00
Nico Pache d58df5e442 maple_tree: remove extra return statement
commit d56c593c8e128c42dc81707c07cbd5af41862214
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:53 2022 +0800

    maple_tree: remove extra return statement

    For functions with a return type of void, it is unnecessary to
    add a reurn statement at the end of the function, so drop it.

    Link: https://lkml.kernel.org/r/20221221060058.609003-3-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:56 -07:00
Nico Pache 5dfc6fc447 maple_tree: remove extra space and blank line
commit 831978e37e93bd3e36612917a4b193278950daff
Author: Vernon Yang <vernon2gm@gmail.com>
Date:   Wed Dec 21 14:00:52 2022 +0800

    maple_tree: remove extra space and blank line

    Patch series "Clean up and refinement for maple tree", v2.

    This patchset cleans up and refines some maple tree code.  A few small
    changes make the code easier to understand and for better readability.

    This patch (of 7):

    These extra space and blank lines are unnecessary, so drop them.

    Link: https://lkml.kernel.org/r/20221221060058.609003-1-vernon2gm@gmail.com
    Link: https://lkml.kernel.org/r/20221221060058.609003-2-vernon2gm@gmail.com
    Signed-off-by: Vernon Yang <vernon2gm@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:56 -07:00
Nico Pache 454461ae1d maple_tree: should get pivots boundary by type
commit ab6ef70a8b0d314c2160af70b0de984664d675e0
Author: Wei Yang <richard.weiyang@gmail.com>
Date:   Sat Nov 12 23:43:08 2022 +0000

    maple_tree: should get pivots boundary by type

    We should get pivots boundary by type.  Fixes a potential overindexing of
    mt_pivots[].

    Link: https://lkml.kernel.org/r/20221112234308.23823-1-richard.weiyang@gmail.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    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>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:56 -07:00
Nico Pache dc7b3331af maple_tree: fix mas_empty_area_rev() lower bound validation
commit 7327e8111adb315423035fb5233533016dfd3f2e
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Wed Jan 11 20:02:07 2023 +0000

    maple_tree: fix mas_empty_area_rev() lower bound validation

    mas_empty_area_rev() was not correctly validating the start of a gap
    against the lower limit.  This could lead to the range starting lower than
    the requested minimum.

    Fix the issue by better validating a gap once one is found.

    This commit also adds tests to the maple tree test suite for this issue
    and tests the mas_empty_area() function for similar bound checking.

    Link: https://lkml.kernel.org/r/20230111200136.1851322-1-Liam.Howlett@oracle.com
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=216911
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: <amanieu@gmail.com>
      Link: https://lore.kernel.org/linux-mm/0b9f5425-08d4-8013-aa4c-e620c3b10bb2@leemhuis.info/
    Tested-by: Holger Hoffsttte <holger@applied-asynchrony.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:40:56 -07:00
Nico Pache eb6cb47f00 maple_tree: fix mas_spanning_rebalance() on insufficient data
commit 0abb964aae3da746ea2fd4301599a6fa26da58db
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Mon Dec 19 16:20:15 2022 +0000

    maple_tree: fix mas_spanning_rebalance() on insufficient data

    Mike Rapoport contacted me off-list with a regression in running criu.
    Periodic tests fail with an RCU stall during execution.  Although rare, it
    is possible to hit this with other uses so this patch should be backported
    to fix the regression.

    This patchset adds the fix and a test case to the maple tree test
    suite.

    This patch (of 2):

    An insufficient node was causing an out-of-bounds access on the node in
    mas_leaf_max_gap().  The cause was the faulty detection of the new node
    being a root node when overwriting many entries at the end of the tree.

    Fix the detection of a new root and ensure there is sufficient data prior
    to entering the spanning rebalance loop.

    Link: https://lkml.kernel.org/r/20221219161922.2708732-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20221219161922.2708732-2-Liam.Howlett@oracle.com
    Fixes: 54a611b60590 ("Maple Tree: add new data structure")
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Reported-by: Mike Rapoport <rppt@kernel.org>
    Tested-by: Mike Rapoport <rppt@kernel.org>
    Cc: Andrei Vagin <avagin@gmail.com>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache 32c3f90a86 maple_tree: fix mas_find_rev() comment
commit d98c86b9f7a4e1f5a7ead8ba5743952267f9e320
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Tue Oct 25 17:38:14 2022 +0000

    maple_tree: fix mas_find_rev() comment

    mas_find_rev() uses mas_prev_entry(), not mas_next_entry(), correct comment.

    Link: https://lkml.kernel.org/r/20221025173756.2719616-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache a685bf6ef1 maple_tree: mte_set_full() and mte_clear_full() clang-analyzer clean up
commit 6e7ba8b5e2380f941dda8a1025d70c5ce5b38982
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Fri Oct 28 14:45:34 2022 +0000

    maple_tree: mte_set_full() and mte_clear_full() clang-analyzer clean up

    mte_set_full() and mte_clear_full() were incorrectly setting a pointer to
    a value without returning a result.  Fix this by returning the modified
    pointer to be use as necessary.  Also add a third function to return if
    the bit is set or not.

    Link: https://lore.kernel.org/lkml/20221026120029.12555-1-lukas.bulwahn@gmail.com/
    Link: https://lkml.kernel.org/r/20221028144520.2776767-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Suggested-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Suggested-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache 410a81365d maple_tree: don't set a new maximum on the node when not reusing nodes
commit 7dc5ba6254bb242a9f45e43549171a2d84d25e6a
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Mon Nov 7 16:39:02 2022 +0000

    maple_tree: don't set a new maximum on the node when not reusing nodes

    In RCU mode, the node limits were being updated to the last pivot which
    may not be correct and would cause the metadata to be set when it
    shouldn't.  Fix this by not setting a new limit in this case.

    Link: https://lkml.kernel.org/r/20221107163857.867377-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache a87aa05f33 maple_tree: fix depth tracking in maple_state
commit 9bbba5633488ee3e2903647c3484c4390ff39ea7
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Mon Nov 7 16:38:35 2022 +0000

    maple_tree: fix depth tracking in maple_state

    It is possible to confuse the depth tracking in the maple state by
    searching the same node for values.  Fix the depth tracking by moving
    where the depth is incremented closer to where the node changes level.
    Also change the initial depth setting when using the root node.

    Link: https://lkml.kernel.org/r/20221107163814.866612-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache d5392be061 maple_tree: reorganize testing to restore module testing
Conflicts:
       lib/Kconfig.debug: was not expecting TEST_XARRAY config

commit 120b116208a0877227fc82e3f0df81e7a3ed4ab1
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Fri Oct 28 18:04:30 2022 +0000

    maple_tree: reorganize testing to restore module testing

    Along the development cycle, the testing code support for module/in-kernel
    compiles was removed.  Restore this functionality by moving any internal
    API tests to the userspace side, as well as threading tests.  Fix the
    lockdep issues and add a way to reduce memory usage so the tests can
    complete with KASAN + memleak detection.  Make the tests work on 32 bit
    hosts where possible and detect 32 bit hosts in the radix test suite.

    [akpm@linux-foundation.org: fix module export]
    [akpm@linux-foundation.org: fix it some more]
    [liam.howlett@oracle.com: fix compile warnings on 32bit build in check_find()]
      Link: https://lkml.kernel.org/r/20221107203816.1260327-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20221028180415.3074673-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache 865b611af3 maple_tree: mas_anode_descend() clang-analyzer cleanup
commit 9a887877ef981e5a185a84339603300cf2eb1900
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Wed Oct 26 15:14:31 2022 +0000

    maple_tree: mas_anode_descend() clang-analyzer cleanup

    clang-analyzer reported some Dead Stores in mas_anode_descend().  Upon
    inspection, there were a few clean ups that would make the code cleaner:

    The count variable was set from the mt_slots array and then updated but
    never used again.  Just use the array reference directly.

    Also stop updating the type since it isn't used after the update.

    Stop setting the gaps pointer to NULL at the start since it is always
    set before the loop begins.

    Link: https://lkml.kernel.org/r/20221026151413.4032730-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Suggested-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache 7f683ad072 maple_tree: remove pointer to pointer use in mas_alloc_nodes()
commit c61b3a2b2d9bb36698f8c2f65aa41ba183815264
Author: Liam Howlett <liam.howlett@oracle.com>
Date:   Wed Oct 26 15:13:29 2022 +0000

    maple_tree: remove pointer to pointer use in mas_alloc_nodes()

    There is a more direct and cleaner way of implementing the same functional
    code.  Remove the confusing and unnecessary use of pointers here.

    Link: https://lkml.kernel.org/r/20221026151241.4031117-1-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Suggested-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache cdecaede75 lib: maple_tree: remove unneeded initialization in mtree_range_walk()
commit 1b9c918318476b4441ddd754ee6699b5367bb5ee
Author: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Date:   Wed Oct 26 14:00:29 2022 +0200

    lib: maple_tree: remove unneeded initialization in mtree_range_walk()

    Before the do-while loop in mtree_range_walk(), the variables next, min,
    max need to be initialized.  The variables last, prev_min and prev_max are
    set within the loop body before they are eventually used after exiting the
    loop body.

    As it is a do-while loop, the loop body is executed at least once, so the
    variables last, prev_min and prev_max do not need to be initialized before
    the loop body.

    Remove unneeded initialization of last and prev_min.

    The needless initialization was reported by clang-analyzer as Dead Stores.

    As the compiler already identifies these assignments as unneeded, it
    optimizes the assignments away.  Hence:

    No functional change. No change in object code.

    Link: https://lkml.kernel.org/r/20221026120029.12555-2-lukas.bulwahn@gmail.com
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:55 -07:00
Nico Pache d0b81c5b5a Maple Tree: add new data structure
Conflicts:
       lib/Makefile: slight makefile conflict

commit 54a611b605901c7d5d05b6b8f5d04a6ceb0962aa
Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date:   Tue Sep 6 19:48:39 2022 +0000

    Maple Tree: add new data structure

    Patch series "Introducing the Maple Tree"

    The maple tree is an RCU-safe range based B-tree designed to use modern
    processor cache efficiently.  There are a number of places in the kernel
    that a non-overlapping range-based tree would be beneficial, especially
    one with a simple interface.  If you use an rbtree with other data
    structures to improve performance or an interval tree to track
    non-overlapping ranges, then this is for you.

    The tree has a branching factor of 10 for non-leaf nodes and 16 for leaf
    nodes.  With the increased branching factor, it is significantly shorter
    than the rbtree so it has fewer cache misses.  The removal of the linked
    list between subsequent entries also reduces the cache misses and the need
    to pull in the previous and next VMA during many tree alterations.

    The first user that is covered in this patch set is the vm_area_struct,
    where three data structures are replaced by the maple tree: the augmented
    rbtree, the vma cache, and the linked list of VMAs in the mm_struct.  The
    long term goal is to reduce or remove the mmap_lock contention.

    The plan is to get to the point where we use the maple tree in RCU mode.
    Readers will not block for writers.  A single write operation will be
    allowed at a time.  A reader re-walks if stale data is encountered.  VMAs
    would be RCU enabled and this mode would be entered once multiple tasks
    are using the mm_struct.

    Davidlor said

    : Yes I like the maple tree, and at this stage I don't think we can ask for
    : more from this series wrt the MM - albeit there seems to still be some
    : folks reporting breakage.  Fundamentally I see Liam's work to (re)move
    : complexity out of the MM (not to say that the actual maple tree is not
    : complex) by consolidating the three complimentary data structures very
    : much worth it considering performance does not take a hit.  This was very
    : much a turn off with the range locking approach, which worst case scenario
    : incurred in prohibitive overhead.  Also as Liam and Matthew have
    : mentioned, RCU opens up a lot of nice performance opportunities, and in
    : addition academia[1] has shown outstanding scalability of address spaces
    : with the foundation of replacing the locked rbtree with RCU aware trees.

    A similar work has been discovered in the academic press

            https://pdos.csail.mit.edu/papers/rcuvm:asplos12.pdf

    Sheer coincidence.  We designed our tree with the intention of solving the
    hardest problem first.  Upon settling on a b-tree variant and a rough
    outline, we researched ranged based b-trees and RCU b-trees and did find
    that article.  So it was nice to find reassurances that we were on the
    right path, but our design choice of using ranges made that paper unusable
    for us.

    This patch (of 70):

    The maple tree is an RCU-safe range based B-tree designed to use modern
    processor cache efficiently.  There are a number of places in the kernel
    that a non-overlapping range-based tree would be beneficial, especially
    one with a simple interface.  If you use an rbtree with other data
    structures to improve performance or an interval tree to track
    non-overlapping ranges, then this is for you.

    The tree has a branching factor of 10 for non-leaf nodes and 16 for leaf
    nodes.  With the increased branching factor, it is significantly shorter
    than the rbtree so it has fewer cache misses.  The removal of the linked
    list between subsequent entries also reduces the cache misses and the need
    to pull in the previous and next VMA during many tree alterations.

    The first user that is covered in this patch set is the vm_area_struct,
    where three data structures are replaced by the maple tree: the augmented
    rbtree, the vma cache, and the linked list of VMAs in the mm_struct.  The
    long term goal is to reduce or remove the mmap_lock contention.

    The plan is to get to the point where we use the maple tree in RCU mode.
    Readers will not block for writers.  A single write operation will be
    allowed at a time.  A reader re-walks if stale data is encountered.  VMAs
    would be RCU enabled and this mode would be entered once multiple tasks
    are using the mm_struct.

    There is additional BUG_ON() calls added within the tree, most of which
    are in debug code.  These will be replaced with a WARN_ON() call in the
    future.  There is also additional BUG_ON() calls within the code which
    will also be reduced in number at a later date.  These exist to catch
    things such as out-of-range accesses which would crash anyways.

    Link: https://lkml.kernel.org/r/20220906194824.2110408-1-Liam.Howlett@oracle.com
    Link: https://lkml.kernel.org/r/20220906194824.2110408-2-Liam.Howlett@oracle.com
    Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Tested-by: David Howells <dhowells@redhat.com>
    Tested-by: Sven Schnelle <svens@linux.ibm.com>
    Tested-by: Yu Zhao <yuzhao@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: SeongJae Park <sj@kernel.org>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2166668
Signed-off-by: Nico Pache <npache@redhat.com>
2023-03-07 01:23:54 -07:00