|
|
Log in / Subscribe / Register

mm: introduce ANON_VMA_LAZY for deferred anon_vma creation

From:  tao <tao.wangtao-AT-honor.com>
To:  <catalin.marinas-AT-arm.com>, <will-AT-kernel.org>, <tglx-AT-kernel.org>, <mingo-AT-redhat.com>, <bp-AT-alien8.de>, <dave.hansen-AT-linux.intel.com>, <x86-AT-kernel.org>, <akpm-AT-linux-foundation.org>, <david-AT-kernel.org>, <willy-AT-infradead.org>, <sj-AT-kernel.org>, <kees-AT-kernel.org>, <luizcap-AT-redhat.com>, <zhangjiao2-AT-cmss.chinamobile.com>, <tao.wangtao-AT-honor.com>, <kas-AT-kernel.org>, <ljs-AT-kernel.org>
Subject:  [PATCH 0/15] mm: introduce ANON_VMA_LAZY for deferred anon_vma creation
Date:  Wed, 27 May 2026 19:01:32 +0800
Message-ID:  <20260527110147.17815-1-tao.wangtao@honor.com>
Cc:  <hpa-AT-zytor.com>, <liam-AT-infradead.org>, <vbabka-AT-kernel.org>, <rppt-AT-kernel.org>, <surenb-AT-google.com>, <mhocko-AT-suse.com>, <jack-AT-suse.cz>, <riel-AT-surriel.com>, <harry-AT-kernel.org>, <jannh-AT-google.com>, <jgg-AT-ziepe.ca>, <jhubbard-AT-nvidia.com>, <peterx-AT-redhat.com>, <ziy-AT-nvidia.com>, <baolin.wang-AT-linux.alibaba.com>, <npache-AT-redhat.com>, <ryan.roberts-AT-arm.com>, <dev.jain-AT-arm.com>, <baohua-AT-kernel.org>, <lance.yang-AT-linux.dev>, <xu.xin16-AT-zte.com.cn>, <chengming.zhou-AT-linux.dev>, <nao.horiguchi-AT-gmail.com>, <matthew.brost-AT-intel.com>, <joshua.hahnjy-AT-gmail.com>, <rakie.kim-AT-sk.com>, <byungchul-AT-sk.com>, <gourry-AT-gourry.net>, <ying.huang-AT-linux.alibaba.com>, <apopple-AT-nvidia.com>, <pfalcato-AT-suse.de>, <linux-arm-kernel-AT-lists.infradead.org>, <linux-kernel-AT-vger.kernel.org>, <linux-fsdevel-AT-vger.kernel.org>, <linux-mm-AT-kvack.org>, <damon-AT-lists.linux.dev>, <shakeel.butt-AT-linux.dev>, <ryncsn-AT-gmail.com>, <21cnbao-AT-gmail.com>, <jparsana-AT-google.com>, <dvander-AT-google.com>, <zhangji1-AT-honor.com>, <wangzicheng-AT-honor.com>
Archive-link:  Article

TL;DR
-----

This series introduces ANON_VMA_LAZY, which defers anon_vma creation
until it is actually required.

- anon_vma memory reduced by ~92-97%, anon_vma_chain reduced by ~50-57%  
- rmap operations on ANON_VMA_LAZY VMAs do not require anon_vma locking

Background
----------

Currently anon_vma structures are created eagerly when anonymous VMAs
are initialized. However, many VMAs never participate in fork or rmap
operations that require anon_vma chains, so the allocated anon_vma and
anon_vma_chain objects are often unnecessary.

Design overview
---------------

ANON_VMA_LAZY defers anon_vma allocation until it is actually needed
(for example during fork). VMAs that never participate in sharing can
avoid creating anon_vma structures entirely.

Before an anon_vma exists, rmap operations rely directly on VMA
information, so no anon_vma locking is required. An anon_vma is created
and linked only when sharing semantics are required.

This series introduces anon_rmap helpers to make rmap less dependent on
direct anon_vma access. It also introduces anon_vma_tree_t as a container
to support both the lazy and the existing anon_vma layouts.

Once a VMA becomes associated with an anon_vma, the normal behavior
remains unchanged.

Memory impact
-------------

Preliminary measurements show significant reductions in anon_vma-related
slab allocations.

After boot:

Object            | Before (active KB) | After (active KB) | Change
vm_area_struct    | 117035             | 118176            | +1.0%
anon_vma_chain    | 18865.8            | 8112.06           | -57.0%
anon_vma          | 20426.4            | 613.75            | -97.0%

After launching 24 apps:

Object            | Before (active KB) | After (active KB) | Change
vm_area_struct    | 196873             | 197345            | +0.2%
anon_vma_chain    | 31477.1            | 15576.8           | -50.5%
anon_vma          | 33280              | 2648.12           | -92.0%

Simple fork microbenchmarks also show a slight improvement in fork
performance, since child VMAs do not need to allocate anon_vma
structures during fork.

Feedback and suggestions are welcome.


tao (15):
  mm/rmap: introduce anon_rmap APIs for anonymous folios
  mm: convert anon_vma rmap APIs to anon_rmap
  mm: introduce anon_vma_tree_t for multiple anon_vma topologies
  mm: switch to anon_vma_tree_t APIs in preparation for ANON_VMA_LAZY
  mm: add CONFIG_ANON_VMA_LAZY and folio helpers
  mm: add CONFIG_VMA_REF and VMA helpers
  mm: replace direct FOLIO_MAPPING_ANON usage with helpers
  mm: prepare rmap infrastructure for ANON_VMA_LAZY
  mm: implement ANON_VMA_LAZY rmap semantics
  mm: defer anon_vma creation with ANON_VMA_LAZY
  mm: handle ANON_VMA_LAZY in huge page operations
  mm: handle ANON_VMA_LAZY during migration
  mm: support setup and upgrade of ANON_VMA_LAZY folios
  mm: support merging of ANON_VMA_LAZY VMAs
  mm: enable CONFIG_ANON_VMA_LAZY on arm64 and x86_64

 arch/arm64/Kconfig         |   1 +
 arch/x86/Kconfig           |   1 +
 fs/proc/page.c             |   6 +-
 include/linux/mm.h         |  38 ++
 include/linux/mm_types.h   |   9 +-
 include/linux/page-flags.h |  34 +-
 include/linux/pagemap.h    |   2 +-
 include/linux/rmap.h       | 165 ++++++++-
 mm/Kconfig                 |  22 ++
 mm/damon/ops-common.c      |   4 +-
 mm/debug.c                 |   2 +-
 mm/debug_vm_pgtable.c      |   2 +-
 mm/gup.c                   |   6 +-
 mm/huge_memory.c           |  16 +-
 mm/internal.h              | 171 +++++++++
 mm/khugepaged.c            |  13 +-
 mm/ksm.c                   |  43 ++-
 mm/memory-failure.c        |  11 +-
 mm/memory.c                |  19 +-
 mm/migrate.c               | 126 ++++---
 mm/mmap.c                  |  15 +-
 mm/mremap.c                |   4 +-
 mm/page_idle.c             |   2 +-
 mm/rmap.c                  | 690 ++++++++++++++++++++++++++++++++++---
 mm/vma.c                   |  76 ++--
 mm/vma.h                   |   4 +-
 mm/vma_exec.c              |   2 +-
 mm/vma_init.c              |   1 +
 28 files changed, 1279 insertions(+), 206 deletions(-)

-- 
2.17.1




Copyright © 2026, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds