1990 lines · 55.5 KB · C
RawDownload
/* * mm/rmap.c - physical to virtual reverse mappings * * Copyright 2001, Rik van Riel <riel@conectiva.com.br> * Released under the General Public License (GPL). * * 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_mutex	(while writing or truncating, not reading or faulting) *   mm->mmap_lock *     page->flags PG_locked (lock_page)   * (see huegtlbfs below) *       hugetlbfs_i_mmap_rwsem_key (in huge_pmd_share) *         mapping->i_mmap_rwsem *           hugetlb_fault_mutex (hugetlbfs specific page fault mutex) *           anon_vma->rwsem *             mm->page_table_lock or pte_lock *               pgdat->lru_lock (in mark_page_accessed, isolate_lru_page) *               swap_lock (in swap_duplicate, swap_info_get) *                 mmlist_lock (in mmput, drain_mmlist and others) *                 mapping->private_lock (in __set_page_dirty_buffers) *                   mem_cgroup_{begin,end}_page_stat (memcg->move_lock) *                     i_pages lock (widely used) *                 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_mutex      (memory_failure, collect_procs_anon) *   ->tasklist_lock *     pte map lock * * * hugetlbfs PageHuge() pages take locks in this order: *         mapping->i_mmap_rwsem *           hugetlb_fault_mutex (hugetlbfs specific page fault mutex) *             page->flags PG_locked (lock_page) */ #include <linux/mm.h>#include <linux/sched/mm.h>#include <linux/sched/task.h>#include <linux/pagemap.h>#include <linux/swap.h>#include <linux/swapops.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 <asm/tlbflush.h> #include <trace/events/tlb.h> #include "internal.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->degree = 1;	/* Reference for first vma */		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 page_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 page_lock_anon_vma_read(). This orders:	 *	 * page_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_link(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_interval_tree_insert(avc, &anon_vma->rb_root);} /** * __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 page_lock_anon_vma_read() * and that may actually touch the spinlock 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. * * This must be called with the mmap_lock held for reading. */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; 	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;		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_link(vma, avc, anon_vma);		/* vma reference or self-parent link for new root */		anon_vma->degree++;		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;} /* * This is a useful helper function for locking the anon_vma root as * we traverse the vma->anon_vma_chain, looping over anon_vma's that * have the same vma. * * Such anon_vma's should have the same root, so you'd expect to see * just a single mutex_lock for the whole traversal. */static inline struct anon_vma *lock_anon_vma_root(struct anon_vma *root, struct anon_vma *anon_vma){	struct anon_vma *new_root = anon_vma->root;	if (new_root != root) {		if (WARN_ON_ONCE(root))			up_write(&root->rwsem);		root = new_root;		down_write(&root->rwsem);	}	return root;} static inline void unlock_anon_vma_root(struct anon_vma *root){	if (root)		up_write(&root->rwsem);} /* * Attach the anon_vmas from src to dst. * Returns 0 on success, -ENOMEM on failure. * * anon_vma_clone() is called by __vma_split(), __split_vma(), copy_vma() and * anon_vma_fork(). The first three want an exact copy of src, while the last * one, anon_vma_fork(), may try to reuse an existing anon_vma to prevent * endless growth of anon_vma. Since dst->anon_vma is set to NULL before call, * we can identify this case by checking (!dst->anon_vma && src->anon_vma). * * If (!dst->anon_vma && src->anon_vma) is true, this function tries to find * and reuse existing anon_vma which has no vmas and only one child anon_vma. * This prevents degradation of anon_vma hierarchy to endless linear chain in * case of constantly forking task. On the other hand, an anon_vma with more * than one child isn't reused even if there was no alive vma, thus rmap * walker has a good chance of avoiding scanning the whole hierarchy when it * searches where page is mapped. */int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src){	struct anon_vma_chain *avc, *pavc;	struct anon_vma *root = NULL; 	list_for_each_entry_reverse(pavc, &src->anon_vma_chain, same_vma) {		struct anon_vma *anon_vma; 		avc = anon_vma_chain_alloc(GFP_NOWAIT | __GFP_NOWARN);		if (unlikely(!avc)) {			unlock_anon_vma_root(root);			root = NULL;			avc = anon_vma_chain_alloc(GFP_KERNEL);			if (!avc)				goto enomem_failure;		}		anon_vma = pavc->anon_vma;		root = lock_anon_vma_root(root, anon_vma);		anon_vma_chain_link(dst, avc, anon_vma); 		/*		 * Reuse existing anon_vma if its degree lower than two,		 * that means it has no vma and only one anon_vma child.		 *		 * Do not chose parent anon_vma, otherwise first child		 * will always reuse it. Root anon_vma is never reused:		 * it has self-parent reference and at least one child.		 */		if (!dst->anon_vma && src->anon_vma &&		    anon_vma != src->anon_vma && anon_vma->degree < 2)			dst->anon_vma = anon_vma;	}	if (dst->anon_vma)		dst->anon_vma->degree++;	unlock_anon_vma_root(root);	return 0;  enomem_failure:	/*	 * dst->anon_vma is dropped here otherwise its degree can be incorrectly	 * decremented in unlink_anon_vmas().	 * We can safely do this because callers of anon_vma_clone() don't care	 * about dst->anon_vma if anon_vma_clone() failed.	 */	dst->anon_vma = NULL;	unlink_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 error; 	/* 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; 	/*	 * First, attach the new VMA to the parent VMA's anon_vmas,	 * so rmap can find non-COWed pages in child processes.	 */	error = anon_vma_clone(vma, pvma);	if (error)		return error; 	/* An existing anon_vma has been reused, all done then. */	if (vma->anon_vma)		return 0; 	/* Then add our own anon_vma. */	anon_vma = anon_vma_alloc();	if (!anon_vma)		goto out_error;	avc = anon_vma_chain_alloc(GFP_KERNEL);	if (!avc)		goto out_error_free_anon_vma; 	/*	 * The root anon_vma's spinlock 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_lock_write(anon_vma);	anon_vma_chain_link(vma, avc, anon_vma);	anon_vma->parent->degree++;	anon_vma_unlock_write(anon_vma); 	return 0;  out_error_free_anon_vma:	put_anon_vma(anon_vma); out_error:	unlink_anon_vmas(vma);	return -ENOMEM;} void unlink_anon_vmas(struct vm_area_struct *vma){	struct anon_vma_chain *avc, *next;	struct anon_vma *root = NULL; 	/*	 * 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; 		root = lock_anon_vma_root(root, anon_vma);		anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); 		/*		 * Leave empty anon_vmas on the list - we'll need		 * to free them outside the lock.		 */		if (RB_EMPTY_ROOT(&anon_vma->rb_root.rb_root)) {			anon_vma->parent->degree--;			continue;		} 		list_del(&avc->same_vma);		anon_vma_chain_free(avc);	}	if (vma->anon_vma)		vma->anon_vma->degree--;	unlock_anon_vma_root(root); 	/*	 * Iterate the list once more, it now only contains empty and unlinked	 * anon_vmas, destroy them. Could not do before due to __put_anon_vma()	 * needing to write-acquire the anon_vma->root->rwsem.	 */	list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {		struct anon_vma *anon_vma = avc->anon_vma; 		VM_WARN_ON(anon_vma->degree);		put_anon_vma(anon_vma); 		list_del(&avc->same_vma);		anon_vma_chain_free(avc);	}} static void anon_vma_ctor(void *data){	struct anon_vma *anon_vma = data; 	init_rwsem(&anon_vma->rwsem);	atomic_set(&anon_vma->refcount, 0);	anon_vma->rb_root = RB_ROOT_CACHED;} void __init anon_vma_init(void){	anon_vma_cachep = kmem_cache_create("anon_vma", sizeof(struct anon_vma),			0, SLAB_TYPESAFE_BY_RCU|SLAB_PANIC|SLAB_ACCOUNT,			anon_vma_ctor);	anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain,			SLAB_PANIC|SLAB_ACCOUNT);} /* * Getting a lock on a stable anon_vma from a page off the LRU is tricky! * * Since there is no serialization what so ever against page_remove_rmap() * the best this function can do is return a locked anon_vma that might * have been relevant to this page. * * The page might have been remapped to a different anon_vma or the anon_vma * returned may already be freed (and even reused). * * In case it was remapped to a different anon_vma, the new anon_vma will be a * child of the old anon_vma, and the anon_vma lifetime rules will therefore * ensure that any anon_vma obtained from the page will still be valid for as * long as we observe page_mapped() [ hence all those page_mapped() tests ]. * * All users of this function must be very careful when walking the anon_vma * chain and verify that the page in question is indeed mapped in it * [ something equivalent to page_mapped_in_vma() ]. * * Since anon_vma's slab is SLAB_TYPESAFE_BY_RCU and we know from * page_remove_rmap() that the anon_vma pointer from page->mapping is valid * if there is a mapcount, we can dereference the anon_vma after observing * those. */struct anon_vma *page_get_anon_vma(struct page *page){	struct anon_vma *anon_vma = NULL;	unsigned long anon_mapping; 	rcu_read_lock();	anon_mapping = (unsigned long)READ_ONCE(page->mapping);	if ((anon_mapping & PAGE_MAPPING_FLAGS) != PAGE_MAPPING_ANON)		goto out;	if (!page_mapped(page))		goto out; 	anon_vma = (struct anon_vma *) (anon_mapping - PAGE_MAPPING_ANON);	if (!atomic_inc_not_zero(&anon_vma->refcount)) {		anon_vma = NULL;		goto out;	} 	/*	 * If this page is still mapped, then its anon_vma cannot have been	 * freed.  But if it has been unmapped, we have no security against the	 * anon_vma structure being freed and reused (for another anon_vma:	 * SLAB_TYPESAFE_BY_RCU guarantees that - so the atomic_inc_not_zero()

Lines 1–500 of 1990.