1795 lines · 50.7 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_sem *     page->flags PG_locked (lock_page) *       mapping->i_mmap_mutex *         anon_vma->rwsem *           mm->page_table_lock or pte_lock *             zone->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) *               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) *                 mapping->tree_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 */ #include <linux/mm.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/backing-dev.h> #include <asm/tlbflush.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);		/*		 * 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.	 */	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, 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_sem held for reading. */int anon_vma_prepare(struct vm_area_struct *vma){	struct anon_vma *anon_vma = vma->anon_vma;	struct anon_vma_chain *avc; 	might_sleep();	if (unlikely(!anon_vma)) {		struct mm_struct *mm = vma->vm_mm;		struct anon_vma *allocated; 		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);			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. */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);	}	unlock_anon_vma_root(root);	return 0;  enomem_failure:	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; 	/* Don't bother if the parent process has no anon_vma here. */	if (!pvma->anon_vma)		return 0; 	/*	 * First, attach the new VMA to the parent VMA's anon_vmas,	 * so rmap can find non-COWed pages in child processes.	 */	if (anon_vma_clone(vma, pvma))		return -ENOMEM; 	/* 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;	/*	 * 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_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))			continue; 		list_del(&avc->same_vma);		anon_vma_chain_free(avc);	}	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; 		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;} void __init anon_vma_init(void){	anon_vma_cachep = kmem_cache_create("anon_vma", sizeof(struct anon_vma),			0, SLAB_DESTROY_BY_RCU|SLAB_PANIC, anon_vma_ctor);	anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain, SLAB_PANIC);} /* * 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 DESTROY_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) ACCESS_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_DESTROY_BY_RCU guarantees that - so the atomic_inc_not_zero()	 * above cannot corrupt).	 */	if (!page_mapped(page)) {		put_anon_vma(anon_vma);		anon_vma = NULL;	}out:	rcu_read_unlock(); 	return anon_vma;} /* * Similar to page_get_anon_vma() except it locks the anon_vma. * * Its a little more complex as it tries to keep the fast path to a single * atomic op -- the trylock. If we fail the trylock, we fall back to getting a * reference like with page_get_anon_vma() and then block on the mutex. */struct anon_vma *page_lock_anon_vma_read(struct page *page){	struct anon_vma *anon_vma = NULL;	struct anon_vma *root_anon_vma;	unsigned long anon_mapping; 	rcu_read_lock();	anon_mapping = (unsigned long) ACCESS_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);	root_anon_vma = ACCESS_ONCE(anon_vma->root);	if (down_read_trylock(&root_anon_vma->rwsem)) {		/*		 * If the page is still mapped, then this anon_vma is still		 * its anon_vma, and holding the mutex ensures that it will		 * not go away, see anon_vma_free().		 */		if (!page_mapped(page)) {			up_read(&root_anon_vma->rwsem);			anon_vma = NULL;		}		goto out;	} 	/* trylock failed, we got to sleep */	if (!atomic_inc_not_zero(&anon_vma->refcount)) {		anon_vma = NULL;		goto out;	} 	if (!page_mapped(page)) {		put_anon_vma(anon_vma);		anon_vma = NULL;		goto out;	} 	/* we pinned the anon_vma, its safe to sleep */	rcu_read_unlock();	anon_vma_lock_read(anon_vma); 	if (atomic_dec_and_test(&anon_vma->refcount)) {		/*		 * Oops, we held the last refcount, release the lock		 * and bail -- can't simply use put_anon_vma() because		 * we'll deadlock on the anon_vma_lock_write() recursion.		 */		anon_vma_unlock_read(anon_vma);		__put_anon_vma(anon_vma);		anon_vma = NULL;	} 	return anon_vma;

Lines 1–500 of 1795.