diff options
Diffstat (limited to 'mm/nommu.c')
| -rw-r--r-- | mm/nommu.c | 46 | 
1 files changed, 20 insertions, 26 deletions
diff --git a/mm/nommu.c b/mm/nommu.c index 1fd0c51b10a6..4358032566e9 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -22,7 +22,6 @@  #include <linux/pagemap.h>  #include <linux/slab.h>  #include <linux/vmalloc.h> -#include <linux/tracehook.h>  #include <linux/blkdev.h>  #include <linux/backing-dev.h>  #include <linux/mount.h> @@ -1087,7 +1086,7 @@ static unsigned long determine_vm_flags(struct file *file,  	 * it's being traced - otherwise breakpoints set in it may interfere  	 * with another untraced process  	 */ -	if ((flags & MAP_PRIVATE) && tracehook_expect_breakpoints(current)) +	if ((flags & MAP_PRIVATE) && current->ptrace)  		vm_flags &= ~VM_MAYSHARE;  	return vm_flags; @@ -1813,10 +1812,13 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address,  	return NULL;  } -int remap_pfn_range(struct vm_area_struct *vma, unsigned long from, -		unsigned long to, unsigned long size, pgprot_t prot) +int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, +		unsigned long pfn, unsigned long size, pgprot_t prot)  { -	vma->vm_start = vma->vm_pgoff << PAGE_SHIFT; +	if (addr != (pfn << PAGE_SHIFT)) +		return -EINVAL; + +	vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;  	return 0;  }  EXPORT_SYMBOL(remap_pfn_range); @@ -1882,9 +1884,17 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)  		return 0;  	if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { -		unsigned long n; +		free = global_page_state(NR_FREE_PAGES); +		free += global_page_state(NR_FILE_PAGES); + +		/* +		 * shmem pages shouldn't be counted as free in this +		 * case, they can't be purged, only swapped out, and +		 * that won't affect the overall amount of available +		 * memory in the system. +		 */ +		free -= global_page_state(NR_SHMEM); -		free = global_page_state(NR_FILE_PAGES);  		free += nr_swap_pages;  		/* @@ -1896,34 +1906,18 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)  		free += global_page_state(NR_SLAB_RECLAIMABLE);  		/* -		 * Leave the last 3% for root -		 */ -		if (!cap_sys_admin) -			free -= free / 32; - -		if (free > pages) -			return 0; - -		/* -		 * nr_free_pages() is very expensive on large systems, -		 * only call if we're about to fail. -		 */ -		n = nr_free_pages(); - -		/*  		 * Leave reserved pages. The pages are not for anonymous pages.  		 */ -		if (n <= totalreserve_pages) +		if (free <= totalreserve_pages)  			goto error;  		else -			n -= totalreserve_pages; +			free -= totalreserve_pages;  		/*  		 * Leave the last 3% for root  		 */  		if (!cap_sys_admin) -			n -= n / 32; -		free += n; +			free -= free / 32;  		if (free > pages)  			return 0;  |