diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 24 | 
1 files changed, 20 insertions, 4 deletions
| diff --git a/mm/memory.c b/mm/memory.c index e009ce870859..22bfa7a47a0b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1511,6 +1511,7 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,  			unsigned long pfn)  {  	int ret; +	pgprot_t pgprot = vma->vm_page_prot;  	/*  	 * Technically, architectures with pte_special can avoid all these  	 * restrictions (same for remap_pfn_range).  However we would like @@ -1525,10 +1526,10 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,  	if (addr < vma->vm_start || addr >= vma->vm_end)  		return -EFAULT; -	if (track_pfn_vma_new(vma, vma->vm_page_prot, pfn, PAGE_SIZE)) +	if (track_pfn_vma_new(vma, &pgprot, pfn, PAGE_SIZE))  		return -EINVAL; -	ret = insert_pfn(vma, addr, pfn, vma->vm_page_prot); +	ret = insert_pfn(vma, addr, pfn, pgprot);  	if (ret)  		untrack_pfn_vma(vma, pfn, PAGE_SIZE); @@ -1671,9 +1672,15 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,  	vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; -	err = track_pfn_vma_new(vma, prot, pfn, PAGE_ALIGN(size)); -	if (err) +	err = track_pfn_vma_new(vma, &prot, pfn, PAGE_ALIGN(size)); +	if (err) { +		/* +		 * To indicate that track_pfn related cleanup is not +		 * needed from higher level routine calling unmap_vmas +		 */ +		vma->vm_flags &= ~(VM_IO | VM_RESERVED | VM_PFNMAP);  		return -EINVAL; +	}  	BUG_ON(addr >= end);  	pfn -= addr >> PAGE_SHIFT; @@ -3165,6 +3172,15 @@ void print_vma_addr(char *prefix, unsigned long ip)  #ifdef CONFIG_PROVE_LOCKING  void might_fault(void)  { +	/* +	 * Some code (nfs/sunrpc) uses socket ops on kernel memory while +	 * holding the mmap_sem, this is safe because kernel memory doesn't +	 * get paged out, therefore we'll never actually fault, and the +	 * below annotations will generate false positives. +	 */ +	if (segment_eq(get_fs(), KERNEL_DS)) +		return; +  	might_sleep();  	/*  	 * it would be nicer only to annotate paths which are not under | 
