diff options
| author | Lorenzo Stoakes <ljs@kernel.org> | 2026-07-10 21:16:50 +0100 |
|---|---|---|
| committer | Andrew Morton <akpm@linux-foundation.org> | 2026-08-04 19:18:58 -0700 |
| commit | 68364437ec782b7dac7c7eca3b1f177a9815f3ff (patch) | |
| tree | e8a3b57f0380e1ebd165a2cc15c4a49316805ce8 | |
| parent | 4b7a90a48b9999c33e06dcce067a2d1540df0703 (diff) | |
| download | linux-68364437ec782b7dac7c7eca3b1f177a9815f3ff.tar.gz linux-68364437ec782b7dac7c7eca3b1f177a9815f3ff.zip | |
mm/rmap: parameterise anon_vma_interval_tree_*() by anon_vma
Similar to what we did with mapping_rmap_tree*(), let's declare
anon_vma_interval_tree*() in terms of anon_vma rather than rb_root_cached.
In each case the rb tree referenced is &anon_vma->rb_root, so just pass
anon_vma and the functions can figure this out themselves.
Also update the VMA userland tests to reflect the change.
No functional change intended.
Link: https://lore.kernel.org/20260710-b4-pre-scalable-cow-v2-9-2a5aa403d977@kernel.org
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
Reviewed-by: Gregory Price <gourry@gourry.net>
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Cc: Ackerley Tng <ackerleytng@google.com>
Cc: David Hildenbrand (Arm) <david@kernel.org>
Cc: Kai Huang <kai.huang@intel.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: SJ Park <sj@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Liam R. Howlett (Oracle) <liam@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
| -rw-r--r-- | include/linux/mm.h | 11 | ||||
| -rw-r--r-- | mm/interval_tree.c | 13 | ||||
| -rw-r--r-- | mm/ksm.c | 6 | ||||
| -rw-r--r-- | mm/memory-failure.c | 3 | ||||
| -rw-r--r-- | mm/rmap.c | 11 | ||||
| -rw-r--r-- | mm/vma.c | 4 | ||||
| -rw-r--r-- | tools/testing/vma/include/stubs.h | 4 |
7 files changed, 25 insertions, 27 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 38132060ac58..efbe0eebdcda 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4115,14 +4115,15 @@ mapping_rmap_tree_iter_next(struct vm_area_struct *vma, pgoff_last)) void anon_vma_interval_tree_insert(struct anon_vma_chain *node, - struct rb_root_cached *root); + struct anon_vma *anon_vma); void anon_vma_interval_tree_remove(struct anon_vma_chain *node, - struct rb_root_cached *root); + struct anon_vma *anon_vma); struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct rb_root_cached *root, +anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, unsigned long start, unsigned long last); -struct anon_vma_chain *anon_vma_interval_tree_iter_next( - struct anon_vma_chain *node, unsigned long start, unsigned long last); +struct anon_vma_chain * +anon_vma_interval_tree_iter_next(struct anon_vma_chain *avc, + unsigned long start, unsigned long last); #ifdef CONFIG_DEBUG_VM_RB void anon_vma_interval_tree_verify(struct anon_vma_chain *node); #endif diff --git a/mm/interval_tree.c b/mm/interval_tree.c index 39e020555910..b82d2a0d9c4e 100644 --- a/mm/interval_tree.c +++ b/mm/interval_tree.c @@ -96,26 +96,27 @@ INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, unsigned long, rb_subtree_last, static, __anon_vma_interval_tree) void anon_vma_interval_tree_insert(struct anon_vma_chain *node, - struct rb_root_cached *root) + struct anon_vma *anon_vma) { #ifdef CONFIG_DEBUG_VM_RB node->cached_vma_start = avc_start_pgoff(node); node->cached_vma_last = avc_last_pgoff(node); #endif - __anon_vma_interval_tree_insert(node, root); + __anon_vma_interval_tree_insert(node, &anon_vma->rb_root); } void anon_vma_interval_tree_remove(struct anon_vma_chain *node, - struct rb_root_cached *root) + struct anon_vma *anon_vma) { - __anon_vma_interval_tree_remove(node, root); + __anon_vma_interval_tree_remove(node, &anon_vma->rb_root); } struct anon_vma_chain * -anon_vma_interval_tree_iter_first(struct rb_root_cached *root, +anon_vma_interval_tree_iter_first(struct anon_vma *anon_vma, unsigned long first, unsigned long last) { - return __anon_vma_interval_tree_iter_first(root, first, last); + return __anon_vma_interval_tree_iter_first(&anon_vma->rb_root, + first, last); } struct anon_vma_chain * @@ -3232,8 +3232,7 @@ again: * we wouldn't have the KSM folio mapped in these processes * anymore. */ - anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root, - index, index) { + anon_vma_interval_tree_foreach(vmac, anon_vma, index, index) { cond_resched(); vma = vmac->vma; @@ -3295,8 +3294,7 @@ void collect_procs_ksm(const struct folio *folio, const struct page *page, task_early_kill(tsk, force_early); if (!t) continue; - anon_vma_interval_tree_foreach(vmac, &av->rb_root, index, - index) + anon_vma_interval_tree_foreach(vmac, av, index, index) { vma = vmac->vma; if (vma->vm_mm == t->mm) { diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 66ae93c6d4b2..24d660c32058 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -564,8 +564,7 @@ static void collect_procs_anon(const struct folio *folio, if (!t) continue; - anon_vma_interval_tree_foreach(vmac, &av->rb_root, - pgoff, pgoff) { + anon_vma_interval_tree_foreach(vmac, av, pgoff, pgoff) { vma = vmac->vma; if (vma->vm_mm != t->mm) continue; diff --git a/mm/rmap.c b/mm/rmap.c index d3d3d6cb17b8..6d4423a16c8b 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -211,7 +211,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma) if (likely(!vma->anon_vma)) { vma->anon_vma = anon_vma; anon_vma_chain_assign(vma, avc, anon_vma); - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); anon_vma->num_active_vmas++; allocated = NULL; avc = NULL; @@ -354,7 +354,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src, list_for_each_entry_reverse(avc, &dst->anon_vma_chain, same_vma) { struct anon_vma *anon_vma = avc->anon_vma; - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); if (operation == VMA_OP_FORK) maybe_reuse_anon_vma(dst, anon_vma); } @@ -434,7 +434,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) anon_vma_chain_assign(vma, avc, anon_vma); /* Now let rmap see it. */ anon_vma_lock_write(anon_vma); - anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, anon_vma); anon_vma->parent->num_children++; anon_vma_unlock_write(anon_vma); @@ -499,7 +499,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma) list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) { struct anon_vma *anon_vma = avc->anon_vma; - anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); + anon_vma_interval_tree_remove(avc, anon_vma); /* * Leave empty anon_vmas on the list - we'll need @@ -2988,8 +2988,7 @@ static void rmap_walk_anon(struct folio *folio, pgoff_start = folio_pgoff(folio); pgoff_end = pgoff_start + folio_nr_pages(folio) - 1; - anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, - pgoff_start, pgoff_end) { + anon_vma_interval_tree_foreach(avc, anon_vma, pgoff_start, pgoff_end) { struct vm_area_struct *vma = avc->vma; unsigned long address = vma_address(vma, pgoff_start, folio_nr_pages(folio)); @@ -272,7 +272,7 @@ anon_vma_interval_tree_pre_update_vma(struct vm_area_struct *vma) struct anon_vma_chain *avc; list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_remove(avc, &avc->anon_vma->rb_root); + anon_vma_interval_tree_remove(avc, avc->anon_vma); } static void @@ -281,7 +281,7 @@ anon_vma_interval_tree_post_update_vma(struct vm_area_struct *vma) struct anon_vma_chain *avc; list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) - anon_vma_interval_tree_insert(avc, &avc->anon_vma->rb_root); + anon_vma_interval_tree_insert(avc, avc->anon_vma); } /* diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/stubs.h index 37f81b11e8b7..3a11547b5bd1 100644 --- a/tools/testing/vma/include/stubs.h +++ b/tools/testing/vma/include/stubs.h @@ -272,12 +272,12 @@ static inline void flush_dcache_mmap_unlock(struct address_space *mapping) } static inline void anon_vma_interval_tree_insert(struct anon_vma_chain *avc, - struct rb_root_cached *rb) + struct anon_vma *anon_vma) { } static inline void anon_vma_interval_tree_remove(struct anon_vma_chain *avc, - struct rb_root_cached *rb) + struct anon_vma *anon_vma) { } |
