A few weeks ago, Liam and I discussed "Fork & Dup tree + Delete DONT_COPY" in [1]. Thanks Liam for a lot of useful information there. I didn't use the scheme of linking the leaf nodes, nor did I use the scheme of building the tree in BFS order. I ended up using the scheme of building the tree in DFS order. I implemented this algorithm and it seems to be very efficient. Use bench_forking() in lib/test_maple_tree.c to test in user space, and get the performance numbers of duplicating maple tree as follows: before: 13.52s after: 2.60s Their meaning is the time consumed by duplicating 80,000 maple trees with 134 entries. These numbers do not include the time consumed by mt_validate() and mtree_destroy(). It can be seen that the time consumed has been reduced by 80.77%. The performance improvement of fork() can be summarized as follows: With 23 VMAs, performance improves by about 3%, with 223 VMAs, performance improves by about 15%, and with 4023 VMAs, performance improves by about 30%. See patch[11/11] for details. In addition, I would like to assist Liam in maintaining the maple tree, which requires Liam's consent. In the future I will make some contributions to the development of maple tree. The layout of these patches: 001 - 003: Introduce some internal functions to facilitate the implementation of mt_dup(). 004 - 005: Introduce __mt_dup() and mt_dup(), and their tests. 006: Introduce mas_replace_entry() to efficiently replace an entry. 007 - 009: Follow-up work on introducing these things. 010: Add myself as co-maintainer for maple tree. 011: Use __mt_dup() to duplicate maple tree in dup_mmap(). [1] https://lore.kernel.org/lkml/463899aa-6cbd-f08e-0aca-077b0e4e4475@xxxxxxxxxxxxx/ Peng Zhang (11): maple_tree: Introduce ma_nonleaf_data_end{_nocheck}() maple_tree: Validate MAPLE_ENODE and ma_nonleaf_data_end() maple_tree: Add some helper functions maple_tree: Introduce interfaces __mt_dup() and mt_dup() maple_tree: Add test for mt_dup() maple_tree: Introduce mas_replace_entry() to directly replace an entry maple_tree: Update the documentation of maple tree maple_tree: Skip other tests when BENCH is enabled maple_tree: Update check_forking() and bench_forking() MAINTAINERS: Add co-maintainer for maple tree fork: Use __mt_dup() to duplicate maple tree in dup_mmap() Documentation/core-api/maple_tree.rst | 10 + MAINTAINERS | 1 + include/linux/maple_tree.h | 4 + kernel/fork.c | 35 ++- lib/maple_tree.c | 389 ++++++++++++++++++++++++-- lib/test_maple_tree.c | 67 ++--- mm/mmap.c | 14 +- tools/testing/radix-tree/maple.c | 204 ++++++++++++++ 8 files changed, 658 insertions(+), 66 deletions(-) -- 2.20.1