3207 lines · 93.5 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/* * mm/rmap.c - physical to virtual reverse mappings * * Copyright 2001, Rik van Riel <riel@conectiva.com.br> * * Simple, low overhead reverse mapping scheme. * Please try to keep this thing as modular as possible. * * Provides methods for unmapping each kind of mapped page: * the anon methods track anonymous pages, and * the file methods track pages belonging to an inode. * * Original design by Rik van Riel <riel@conectiva.com.br> 2001 * File methods by Dave McCracken <dmccr@us.ibm.com> 2003, 2004 * Anonymous methods by Andrea Arcangeli <andrea@suse.de> 2004 * Contributions by Hugh Dickins 2003, 2004 */ /* * Lock ordering in mm: * * inode->i_rwsem	(while writing or truncating, not reading or faulting) *   mm->mmap_lock *     mapping->invalidate_lock (in filemap_fault) *       folio_lock *         hugetlbfs_i_mmap_rwsem_key (in huge_pmd_share, see hugetlbfs below) *           vma_start_write *             mapping->i_mmap_rwsem *               anon_vma->rwsem *                 mm->page_table_lock or pte_lock *                   swap_lock (in swap_duplicate, swap_info_get) *                     mmlist_lock (in mmput, drain_mmlist and others) *                     mapping->private_lock (in block_dirty_folio) *                         i_pages lock (widely used) *                           lruvec->lru_lock (in folio_lruvec_lock_irq) *                     inode->i_lock (in set_page_dirty's __mark_inode_dirty) *                     bdi.wb->list_lock (in set_page_dirty's __mark_inode_dirty) *                       sb_lock (within inode_lock in fs/fs-writeback.c) *                       i_pages lock (widely used, in set_page_dirty, *                                 in arch-dependent flush_dcache_mmap_lock, *                                 within bdi.wb->list_lock in __sync_single_inode) * * anon_vma->rwsem,mapping->i_mmap_rwsem   (memory_failure, collect_procs_anon) *   ->tasklist_lock *     pte map lock * * hugetlbfs PageHuge() take locks in this order: *   hugetlb_fault_mutex (hugetlbfs specific page fault mutex) *     vma_lock (hugetlb specific lock for pmd_sharing) *       mapping->i_mmap_rwsem (also used for hugetlb pmd sharing) *         folio_lock */ #include <linux/mm.h>#include <linux/sched/mm.h>#include <linux/sched/task.h>#include <linux/pagemap.h>#include <linux/swap.h>#include <linux/leafops.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/ksm.h>#include <linux/rmap.h>#include <linux/rcupdate.h>#include <linux/export.h>#include <linux/memcontrol.h>#include <linux/mmu_notifier.h>#include <linux/migrate.h>#include <linux/hugetlb.h>#include <linux/huge_mm.h>#include <linux/backing-dev.h>#include <linux/page_idle.h>#include <linux/memremap.h>#include <linux/userfaultfd_k.h>#include <linux/mm_inline.h>#include <linux/oom.h> #include <asm/tlb.h> #define CREATE_TRACE_POINTS#include <trace/events/migrate.h> #include "internal.h"#include "swap.h" static struct kmem_cache *anon_vma_cachep;static struct kmem_cache *anon_vma_chain_cachep; static inline struct anon_vma *anon_vma_alloc(void){	struct anon_vma *anon_vma; 	anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL);	if (anon_vma) {		atomic_set(&anon_vma->refcount, 1);		anon_vma->num_children = 0;		anon_vma->num_active_vmas = 0;		anon_vma->parent = anon_vma;		/*		 * Initialise the anon_vma root to point to itself. If called		 * from fork, the root will be reset to the parents anon_vma.		 */		anon_vma->root = anon_vma;	} 	return anon_vma;} static inline void anon_vma_free(struct anon_vma *anon_vma){	VM_BUG_ON(atomic_read(&anon_vma->refcount)); 	/*	 * Synchronize against folio_lock_anon_vma_read() such that	 * we can safely hold the lock without the anon_vma getting	 * freed.	 *	 * Relies on the full mb implied by the atomic_dec_and_test() from	 * put_anon_vma() against the acquire barrier implied by	 * down_read_trylock() from folio_lock_anon_vma_read(). This orders:	 *	 * folio_lock_anon_vma_read()	VS	put_anon_vma()	 *   down_read_trylock()		  atomic_dec_and_test()	 *   LOCK				  MB	 *   atomic_read()			  rwsem_is_locked()	 *	 * LOCK should suffice since the actual taking of the lock must	 * happen _before_ what follows.	 */	might_sleep();	if (rwsem_is_locked(&anon_vma->root->rwsem)) {		anon_vma_lock_write(anon_vma);		anon_vma_unlock_write(anon_vma);	} 	kmem_cache_free(anon_vma_cachep, anon_vma);} static inline struct anon_vma_chain *anon_vma_chain_alloc(gfp_t gfp){	return kmem_cache_alloc(anon_vma_chain_cachep, gfp);} static void anon_vma_chain_free(struct anon_vma_chain *anon_vma_chain){	kmem_cache_free(anon_vma_chain_cachep, anon_vma_chain);} static void anon_vma_chain_assign(struct vm_area_struct *vma,				  struct anon_vma_chain *avc,				  struct anon_vma *anon_vma){	avc->vma = vma;	avc->anon_vma = anon_vma;	list_add(&avc->same_vma, &vma->anon_vma_chain);} /** * __anon_vma_prepare - attach an anon_vma to a memory region * @vma: the memory region in question * * This makes sure the memory mapping described by 'vma' has * an 'anon_vma' attached to it, so that we can associate the * anonymous pages mapped into it with that anon_vma. * * The common case will be that we already have one, which * is handled inline by anon_vma_prepare(). But if * not we either need to find an adjacent mapping that we * can re-use the anon_vma from (very common when the only * reason for splitting a vma has been mprotect()), or we * allocate a new one. * * Anon-vma allocations are very subtle, because we may have * optimistically looked up an anon_vma in folio_lock_anon_vma_read() * and that may actually touch the rwsem even in the newly * allocated vma (it depends on RCU to make sure that the * anon_vma isn't actually destroyed). * * As a result, we need to do proper anon_vma locking even * for the new allocation. At the same time, we do not want * to do any locking for the common case of already having * an anon_vma. */int __anon_vma_prepare(struct vm_area_struct *vma){	struct mm_struct *mm = vma->vm_mm;	struct anon_vma *anon_vma, *allocated;	struct anon_vma_chain *avc; 	mmap_assert_locked(mm);	might_sleep(); 	avc = anon_vma_chain_alloc(GFP_KERNEL);	if (!avc)		goto out_enomem; 	anon_vma = find_mergeable_anon_vma(vma);	allocated = NULL;	if (!anon_vma) {		anon_vma = anon_vma_alloc();		if (unlikely(!anon_vma))			goto out_enomem_free_avc;		anon_vma->num_children++; /* self-parent link for new root */		allocated = anon_vma;	} 	anon_vma_lock_write(anon_vma);	/* page_table_lock to protect against threads */	spin_lock(&mm->page_table_lock);	if (likely(!vma->anon_vma)) {		vma->anon_vma = anon_vma;		anon_vma_chain_assign(vma, avc, anon_vma);		anon_rmap_tree_insert(avc, anon_vma);		anon_vma->num_active_vmas++;		allocated = NULL;		avc = NULL;	}	spin_unlock(&mm->page_table_lock);	anon_vma_unlock_write(anon_vma); 	if (unlikely(allocated))		put_anon_vma(allocated);	if (unlikely(avc))		anon_vma_chain_free(avc); 	return 0;  out_enomem_free_avc:	anon_vma_chain_free(avc); out_enomem:	return -ENOMEM;} static void check_anon_vma_clone(struct vm_area_struct *dst,				 struct vm_area_struct *src,				 enum vma_operation operation){	/* The write lock must be held. */	mmap_assert_write_locked(src->vm_mm);	/* If not a fork then must be on same mm. */	VM_WARN_ON_ONCE(operation != VMA_OP_FORK && dst->vm_mm != src->vm_mm); 	/* If we have anything to do src->anon_vma must be provided. */	VM_WARN_ON_ONCE(!src->anon_vma && !list_empty(&src->anon_vma_chain));	VM_WARN_ON_ONCE(!src->anon_vma && dst->anon_vma);	/* We are establishing a new anon_vma_chain. */	VM_WARN_ON_ONCE(!list_empty(&dst->anon_vma_chain));	/*	 * On fork, dst->anon_vma is set NULL (temporarily). Otherwise, anon_vma	 * must be the same across dst and src.	 */	VM_WARN_ON_ONCE(dst->anon_vma && dst->anon_vma != src->anon_vma);	/*	 * Essentially equivalent to above - if not a no-op, we should expect	 * dst->anon_vma to be set for everything except a fork.	 */	VM_WARN_ON_ONCE(operation != VMA_OP_FORK && src->anon_vma &&			!dst->anon_vma);	/* For the anon_vma to be compatible, it can only be singular. */	VM_WARN_ON_ONCE(operation == VMA_OP_MERGE_UNFAULTED &&			!list_is_singular(&src->anon_vma_chain));#ifdef CONFIG_PER_VMA_LOCK	/* Only merging an unfaulted VMA leaves the destination attached. */	VM_WARN_ON_ONCE(operation != VMA_OP_MERGE_UNFAULTED &&			vma_is_attached(dst));#endif} static void maybe_reuse_anon_vma(struct vm_area_struct *dst,		struct anon_vma *anon_vma){	/* If already populated, nothing to do.*/	if (dst->anon_vma)		return; 	/*	 * We reuse an anon_vma if any linking VMAs were unmapped and it has	 * only a single child at most.	 */	if (anon_vma->num_active_vmas > 0)		return;	if (anon_vma->num_children > 1)		return; 	dst->anon_vma = anon_vma;	anon_vma->num_active_vmas++;} static void cleanup_partial_anon_vmas(struct vm_area_struct *vma); /** * anon_vma_clone - Establishes new anon_vma_chain objects in @dst linking to * all of the anon_vma objects contained within @src anon_vma_chain's. * @dst: The destination VMA with an empty anon_vma_chain. * @src: The source VMA we wish to duplicate. * @operation: The type of operation which resulted in the clone. * * This is the heart of the VMA side of the anon_vma implementation - we invoke * this function whenever we need to set up a new VMA's anon_vma state. * * This is invoked for: * * - VMA Merge, but only when @dst is unfaulted and @src is faulted - meaning we *   clone @src into @dst. * - VMA split. * - VMA (m)remap. * - Fork of faulted VMA. * * In all cases other than fork this is simply a duplication. Fork additionally * adds a new active anon_vma. * * ONLY in the case of fork do we try to 'reuse' existing anon_vma's in an * anon_vma hierarchy, reusing anon_vma's which have no VMA associated with them * but do have a single child. This is to avoid waste of memory when repeatedly * forking. * * Returns: 0 on success, -ENOMEM on failure. */int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src,		   enum vma_operation operation){	struct anon_vma_chain *avc, *pavc;	struct anon_vma *active_anon_vma = src->anon_vma; 	check_anon_vma_clone(dst, src, operation); 	if (!active_anon_vma)		return 0; 	/*	 * Allocate AVCs. We don't need an anon_vma lock for this as we	 * are not updating the anon_vma rbtree nor are we changing	 * anon_vma statistics.	 *	 * Either src, dst have the same mm for which we hold an exclusive mmap	 * write lock, or we are forking and we hold it on src->vm_mm and dst is	 * not yet accessible to other threads so there's no possibliity of the	 * unlinked AVC's being observed yet.	 */	list_for_each_entry(pavc, &src->anon_vma_chain, same_vma) {		avc = anon_vma_chain_alloc(GFP_KERNEL);		if (!avc)			goto enomem_failure; 		anon_vma_chain_assign(dst, avc, pavc->anon_vma);	} 	/*	 * Now link the anon_vma's back to the newly inserted AVCs.	 * Note that all anon_vma's share the same root.	 */	anon_vma_lock_write(active_anon_vma);	list_for_each_entry_reverse(avc, &dst->anon_vma_chain, same_vma) {		struct anon_vma *anon_vma = avc->anon_vma; 		anon_rmap_tree_insert(avc, anon_vma);		if (operation == VMA_OP_FORK)			maybe_reuse_anon_vma(dst, anon_vma);	} 	if (operation != VMA_OP_FORK)		dst->anon_vma->num_active_vmas++; 	anon_vma_unlock_write(active_anon_vma);	return 0;  enomem_failure:	cleanup_partial_anon_vmas(dst);	return -ENOMEM;} /* * Attach vma to its own anon_vma, as well as to the anon_vmas that * the corresponding VMA in the parent process is attached to. * Returns 0 on success, non-zero on failure. */int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma){	struct anon_vma_chain *avc;	struct anon_vma *anon_vma;	int rc; 	/* Don't bother if the parent process has no anon_vma here. */	if (!pvma->anon_vma)		return 0; 	/* Drop inherited anon_vma, we'll reuse existing or allocate new. */	vma->anon_vma = NULL; 	anon_vma = anon_vma_alloc();	if (!anon_vma)		return -ENOMEM;	avc = anon_vma_chain_alloc(GFP_KERNEL);	if (!avc) {		put_anon_vma(anon_vma);		return -ENOMEM;	} 	/*	 * First, attach the new VMA to the parent VMA's anon_vmas,	 * so rmap can find non-COWed pages in child processes.	 */	rc = anon_vma_clone(vma, pvma, VMA_OP_FORK);	/* An error arose or an existing anon_vma was reused, all done then. */	if (rc || vma->anon_vma) {		put_anon_vma(anon_vma);		anon_vma_chain_free(avc);		return rc;	} 	/*	 * OK no reuse, so add our own anon_vma.	 *	 * Since it is not linked anywhere we can safely manipulate anon_vma	 * fields without a lock.	 */ 	anon_vma->num_active_vmas = 1;	/*	 * The root anon_vma's rwsem is the lock actually used when we	 * lock any of the anon_vmas in this anon_vma tree.	 */	anon_vma->root = pvma->anon_vma->root;	anon_vma->parent = pvma->anon_vma;	/*	 * With refcounts, an anon_vma can stay around longer than the	 * process it belongs to. The root anon_vma needs to be pinned until	 * this anon_vma is freed, because the lock lives in the root.	 */	get_anon_vma(anon_vma->root);	/* Mark this anon_vma as the one where our new (COWed) pages go. */	vma->anon_vma = anon_vma;	anon_vma_chain_assign(vma, avc, anon_vma);	/* Now let rmap see it. */	anon_vma_lock_write(anon_vma);	anon_rmap_tree_insert(avc, anon_vma);	anon_vma->parent->num_children++;	anon_vma_unlock_write(anon_vma); 	return 0;} /* * In the unfortunate case of anon_vma_clone() failing to allocate memory we * have to clean things up. * * Since we allocate anon_vma_chain's before we insert them into the interval * trees, we simply have to free up the AVC's and remove the entries from the * VMA's anon_vma_chain. */static void cleanup_partial_anon_vmas(struct vm_area_struct *vma){	struct anon_vma_chain *avc, *next; 	list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {		list_del(&avc->same_vma);		anon_vma_chain_free(avc);	} 	/*	 * The anon_vma assigned to this VMA is no longer valid, as we were not	 * able to correctly clone AVC state. Avoid inconsistent anon_vma tree	 * state by resetting.	 */	vma->anon_vma = NULL;} /** * unlink_anon_vmas() - remove all links between a VMA and anon_vma's, freeing * anon_vma_chain objects. * @vma: The VMA whose links to anon_vma objects is to be severed. * * As part of the process anon_vma_chain's are freed, * anon_vma->num_children,num_active_vmas is updated as required and, if the * relevant anon_vma references no further VMAs, its reference count is * decremented. */void unlink_anon_vmas(struct vm_area_struct *vma){	struct anon_vma_chain *avc, *next;	struct anon_vma *active_anon_vma = vma->anon_vma; 	/* Always hold mmap lock, read-lock on unmap possibly. */	mmap_assert_locked(vma->vm_mm); 	/* Unfaulted is a no-op. */	if (!active_anon_vma) {		VM_WARN_ON_ONCE(!list_empty(&vma->anon_vma_chain));		return;	} 	anon_vma_lock_write(active_anon_vma); 	/*	 * Unlink each anon_vma chained to the VMA.  This list is ordered	 * from newest to oldest, ensuring the root anon_vma gets freed last.	 */	list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {		struct anon_vma *anon_vma = avc->anon_vma;

Lines 1–500 of 3207.