summaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 655e1429388a..7b1e4feaec06 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1047,7 +1047,8 @@ int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
1047 * readonly mappings. The tradeoff is that copy_page_range is more 1047 * readonly mappings. The tradeoff is that copy_page_range is more
1048 * efficient than faulting. 1048 * efficient than faulting.
1049 */ 1049 */
1050 if (!(vma->vm_flags & (VM_HUGETLB|VM_NONLINEAR|VM_PFNMAP|VM_INSERTPAGE))) { 1050 if (!(vma->vm_flags & (VM_HUGETLB | VM_NONLINEAR |
1051 VM_PFNMAP | VM_MIXEDMAP))) {
1051 if (!vma->anon_vma) 1052 if (!vma->anon_vma)
1052 return 0; 1053 return 0;
1053 } 1054 }
@@ -2085,6 +2086,11 @@ out:
2085 * ask for a shared writable mapping! 2086 * ask for a shared writable mapping!
2086 * 2087 *
2087 * The page does not need to be reserved. 2088 * The page does not need to be reserved.
2089 *
2090 * Usually this function is called from f_op->mmap() handler
2091 * under mm->mmap_sem write-lock, so it can change vma->vm_flags.
2092 * Caller must set VM_MIXEDMAP on vma if it wants to call this
2093 * function from other places, for example from page-fault handler.
2088 */ 2094 */
2089int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, 2095int vm_insert_page(struct vm_area_struct *vma, unsigned long addr,
2090 struct page *page) 2096 struct page *page)
@@ -2093,7 +2099,11 @@ int vm_insert_page(struct vm_area_struct *vma, unsigned long addr,
2093 return -EFAULT; 2099 return -EFAULT;
2094 if (!page_count(page)) 2100 if (!page_count(page))
2095 return -EINVAL; 2101 return -EINVAL;
2096 vma->vm_flags |= VM_INSERTPAGE; 2102 if (!(vma->vm_flags & VM_MIXEDMAP)) {
2103 BUG_ON(down_read_trylock(&vma->vm_mm->mmap_sem));
2104 BUG_ON(vma->vm_flags & VM_PFNMAP);
2105 vma->vm_flags |= VM_MIXEDMAP;
2106 }
2097 return insert_page(vma, addr, page, vma->vm_page_prot); 2107 return insert_page(vma, addr, page, vma->vm_page_prot);
2098} 2108}
2099EXPORT_SYMBOL(vm_insert_page); 2109EXPORT_SYMBOL(vm_insert_page);